forked from OSchip/llvm-project
Introduce a callback to PPCallbacks for lines skipped by the preprocessor.
Patch by Jason Haslam! llvm-svn: 140612
This commit is contained in:
parent
e241bad92b
commit
18bcfd5595
|
@ -158,6 +158,12 @@ public:
|
|||
/// MI is released immediately following this callback.
|
||||
virtual void MacroUndefined(const Token &MacroNameTok, const MacroInfo *MI) {
|
||||
}
|
||||
|
||||
/// SourceRangeSkipped - This hook is called when a source range is skipped.
|
||||
/// \param Range The SourceRange that was skipped. The range begins at the
|
||||
/// #if/#else directive and ends after the #endif/#else directive.
|
||||
virtual void SourceRangeSkipped(SourceRange Range) {
|
||||
}
|
||||
|
||||
/// If -- This hook is called whenever an #if is seen.
|
||||
/// \param Range The SourceRange of the expression being tested.
|
||||
|
@ -286,6 +292,11 @@ public:
|
|||
Second->MacroUndefined(MacroNameTok, MI);
|
||||
}
|
||||
|
||||
virtual void SourceRangeSkipped(SourceRange Range) {
|
||||
First->SourceRangeSkipped(Range);
|
||||
Second->SourceRangeSkipped(Range);
|
||||
}
|
||||
|
||||
/// If -- This hook is called whenever an #if is seen.
|
||||
virtual void If(SourceRange Range) {
|
||||
First->If(Range);
|
||||
|
|
|
@ -1057,7 +1057,8 @@ private:
|
|||
/// already seen one so a #else directive is a duplicate. When this returns,
|
||||
/// the caller can lex the first valid token.
|
||||
void SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
|
||||
bool FoundNonSkipPortion, bool FoundElse);
|
||||
bool FoundNonSkipPortion, bool FoundElse,
|
||||
SourceLocation ElseLoc = SourceLocation());
|
||||
|
||||
/// PTHSkipExcludedConditionalBlock - A fast PTH version of
|
||||
/// SkipExcludedConditionalBlock.
|
||||
|
|
|
@ -193,7 +193,8 @@ void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
|
|||
/// the first valid token.
|
||||
void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
|
||||
bool FoundNonSkipPortion,
|
||||
bool FoundElse) {
|
||||
bool FoundElse,
|
||||
SourceLocation ElseLoc) {
|
||||
++NumSkipped;
|
||||
assert(CurTokenLexer == 0 && CurPPLexer && "Lexing a macro, not a file?");
|
||||
|
||||
|
@ -389,6 +390,11 @@ void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
|
|||
// of the file, just stop skipping and return to lexing whatever came after
|
||||
// the #if block.
|
||||
CurPPLexer->LexingRawMode = false;
|
||||
|
||||
if (Callbacks) {
|
||||
SourceLocation BeginLoc = ElseLoc.isValid() ? ElseLoc : IfTokenLoc;
|
||||
Callbacks->SourceRangeSkipped(SourceRange(BeginLoc, Tok.getLocation()));
|
||||
}
|
||||
}
|
||||
|
||||
void Preprocessor::PTHSkipExcludedConditionalBlock() {
|
||||
|
@ -1817,7 +1823,7 @@ void Preprocessor::HandleElseDirective(Token &Result) {
|
|||
|
||||
// Finally, skip the rest of the contents of this block.
|
||||
SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
|
||||
/*FoundElse*/true);
|
||||
/*FoundElse*/true, Result.getLocation());
|
||||
|
||||
if (Callbacks)
|
||||
Callbacks->Else();
|
||||
|
@ -1850,7 +1856,8 @@ void Preprocessor::HandleElifDirective(Token &ElifToken) {
|
|||
|
||||
// Finally, skip the rest of the contents of this block.
|
||||
SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
|
||||
/*FoundElse*/CI.FoundElse);
|
||||
/*FoundElse*/CI.FoundElse,
|
||||
ElifToken.getLocation());
|
||||
|
||||
if (Callbacks)
|
||||
Callbacks->Elif(SourceRange(ConditionalBegin, ConditionalEnd));
|
||||
|
|
Loading…
Reference in New Issue