[libclang] Resolve a cursor that points to a macro name inside a #ifdef/#ifndef

directive as a macro expansion.

This is more of a "macro reference" than a macro expansion but it's close enough
for libclang's purposes. If it causes issues we can revisit and introduce a new
kind of cursor.

llvm-svn: 169666
This commit is contained in:
Argyrios Kyrtzidis 2012-12-08 02:21:17 +00:00
parent 222a7bbf0d
commit f77b0f8886
3 changed files with 47 additions and 2 deletions

View File

@ -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.

View File

@ -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());

View File

@ -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