forked from OSchip/llvm-project
[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:
parent
222a7bbf0d
commit
f77b0f8886
|
@ -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.
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue