diff options
-rw-r--r-- | include/clang/Lex/PreprocessingRecord.h | 9 | ||||
-rw-r--r-- | lib/Lex/PreprocessingRecord.cpp | 31 | ||||
-rw-r--r-- | test/Index/c-index-getCursor-pp.c | 9 |
3 files changed, 47 insertions, 2 deletions
diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index ae50d48437..74a430cb77 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -570,6 +570,15 @@ namespace clang { StringRef SearchPath, StringRef RelativePath, const Module *Imported); + virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok, + const MacroInfo *MI); + virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok, + const MacroInfo *MI); + /// \brief Hook called whenever the 'defined' operator is seen. + virtual void Defined(const Token &MacroNameTok, const MacroInfo *MI); + + void addMacroExpansion(const Token &Id, const MacroInfo *MI, + SourceRange Range); /// \brief Cached result of the last \see getPreprocessedEntitiesInRange /// query. diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index a78fbe763a..497af0b3da 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -357,8 +357,9 @@ MacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) { return cast<MacroDefinition>(Entity); } -void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI, - SourceRange Range) { +void PreprocessingRecord::addMacroExpansion(const Token &Id, + const MacroInfo *MI, + SourceRange Range) { // We don't record nested macro expansions. if (Id.getLocation().isMacroID()) return; @@ -371,6 +372,32 @@ void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI, new (*this) MacroExpansion(Def, Range)); } +void PreprocessingRecord::Ifdef(SourceLocation Loc, const Token &MacroNameTok, + const MacroInfo *MI) { + // This is not actually a macro expansion but record it as a macro reference. + if (MI) + addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation()); +} + +void PreprocessingRecord::Ifndef(SourceLocation Loc, const Token &MacroNameTok, + const MacroInfo *MI) { + // This is not actually a macro expansion but record it as a macro reference. + if (MI) + addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation()); +} + +void PreprocessingRecord::Defined(const Token &MacroNameTok, + const MacroInfo *MI) { + // This is not actually a macro expansion but record it as a macro reference. + if (MI) + addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation()); +} + +void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI, + SourceRange Range) { + addMacroExpansion(Id, MI, Range); +} + void PreprocessingRecord::MacroDefined(const Token &Id, const MacroInfo *MI) { SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc()); diff --git a/test/Index/c-index-getCursor-pp.c b/test/Index/c-index-getCursor-pp.c index 01b0a6972e..48d07adf22 100644 --- a/test/Index/c-index-getCursor-pp.c +++ b/test/Index/c-index-getCursor-pp.c @@ -17,6 +17,12 @@ const char *fname = __FILE__; #include <a.h> +#ifdef OBSCURE +#endif + +#if defined(OBSCURE) +#endif + // RUN: c-index-test -cursor-at=%s:1:11 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-1 %s // CHECK-1: macro definition=OBSCURE // RUN: c-index-test -cursor-at=%s:2:14 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-2 %s @@ -35,6 +41,9 @@ const char *fname = __FILE__; // CHECK-8: macro expansion=__FILE__ // RUN: c-index-test -cursor-at=%s:18:12 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-9 %s // CHECK-9: inclusion directive=a.h +// RUN: c-index-test -cursor-at=%s:20:10 -cursor-at=%s:23:15 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-10 %s +// CHECK-10: 20:8 macro expansion=OBSCURE +// CHECK-10: 23:13 macro expansion=OBSCURE // Same tests, but with "editing" optimizations // RUN: env CINDEXTEST_EDITING=1 c-index-test -cursor-at=%s:1:11 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-1 %s |