diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-03-18 18:04:21 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-03-18 18:04:21 +0000 |
commit | 572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0 (patch) | |
tree | 1b1c104cdc5ce31037499d296680533eee629e01 | |
parent | 4ae8f298b1ea51b4c2234f9148e2e4349c9bdd23 (diff) |
Expose macro definitions as CIndex cursors. These can still only be
generated by clang_annotateTokens().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98837 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang-c/Index.h | 3 | ||||
-rw-r--r-- | include/clang/Lex/PreprocessingRecord.h | 6 | ||||
-rw-r--r-- | test/Index/annotate-tokens-pp.c | 6 | ||||
-rw-r--r-- | tools/CIndex/CIndex.cpp | 26 | ||||
-rw-r--r-- | tools/CIndex/CXCursor.cpp | 10 | ||||
-rw-r--r-- | tools/CIndex/CXCursor.h | 8 |
6 files changed, 51 insertions, 8 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index bdcb37df9f..de76076a25 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -800,7 +800,8 @@ enum CXCursorKind { /* Preprocessing */ CXCursor_PreprocessingDirective = 500, - CXCursor_MacroInstantiation = 501, + CXCursor_MacroDefinition = 501, + CXCursor_MacroInstantiation = 502, CXCursor_FirstPreprocessing = CXCursor_PreprocessingDirective, CXCursor_LastPreprocessing = CXCursor_MacroInstantiation }; diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index 4ebd4e6039..12a6e9c71c 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -162,14 +162,14 @@ namespace clang { Location(Location) { } /// \brief Retrieve the name of the macro being defined. - const IdentifierInfo *getMacroName() const { return Name; } + const IdentifierInfo *getName() const { return Name; } /// \brief Retrieve the location of the macro name in the definition. SourceLocation getLocation() const { return Location; } // Implement isa/cast/dyncast/etc. - static bool classof(const PreprocessingDirective *PD) { - return PD->getKind() == MacroDefinitionKind; + static bool classof(const PreprocessedEntity *PE) { + return PE->getKind() == MacroDefinitionKind; } static bool classof(const MacroDefinition *) { return true; } }; diff --git a/test/Index/annotate-tokens-pp.c b/test/Index/annotate-tokens-pp.c index db808d0943..a88e561747 100644 --- a/test/Index/annotate-tokens-pp.c +++ b/test/Index/annotate-tokens-pp.c @@ -10,7 +10,7 @@ int BAR STILL_NOTHING; // RUN: c-index-test -test-annotate-tokens=%s:2:1:9:1 -I%S/Inputs %s | FileCheck %s // CHECK: Punctuation: "#" [2:1 - 2:2] preprocessing directive= // CHECK: Identifier: "define" [2:2 - 2:8] preprocessing directive= -// CHECK: Identifier: "STILL_NOTHING" [2:9 - 2:22] preprocessing directive= +// CHECK: Identifier: "STILL_NOTHING" [2:9 - 2:22] macro definition=STILL_NOTHING // CHECK: Identifier: "NOTHING" [2:23 - 2:30] preprocessing directive= // CHECK: Punctuation: "(" [2:30 - 2:31] preprocessing directive= // CHECK: Identifier: "honk" [2:31 - 2:35] preprocessing directive= @@ -19,11 +19,11 @@ int BAR STILL_NOTHING; // CHECK: Punctuation: ")" [2:42 - 2:43] preprocessing directive= // CHECK: Punctuation: "#" [3:1 - 3:2] preprocessing directive= // CHECK: Identifier: "define" [3:2 - 3:8] preprocessing directive= -// CHECK: Identifier: "BAR" [3:9 - 3:12] preprocessing directive= +// CHECK: Identifier: "BAR" [3:9 - 3:12] macro definition=BAR // CHECK: Identifier: "baz" [3:13 - 3:16] preprocessing directive= // CHECK: Punctuation: "#" [4:1 - 4:2] preprocessing directive= // CHECK: Identifier: "define" [4:2 - 4:8] preprocessing directive= -// CHECK: Identifier: "WIBBLE" [4:9 - 4:15] preprocessing directive= +// CHECK: Identifier: "WIBBLE" [4:9 - 4:15] macro definition=WIBBLE // CHECK: Punctuation: "(" [4:15 - 4:16] preprocessing directive= // CHECK: Identifier: "X" [4:16 - 4:17] preprocessing directive= // CHECK: Punctuation: "," [4:17 - 4:18] preprocessing directive= diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index deab84698c..ce2188550b 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -1443,6 +1443,10 @@ CXString clang_getCursorSpelling(CXCursor C) { return createCXString(getCursorMacroInstantiation(C)->getName() ->getNameStart()); + if (C.kind == CXCursor_MacroDefinition) + return createCXString(getCursorMacroDefinition(C)->getName() + ->getNameStart()); + if (clang_isDeclaration(C.kind)) return getDeclSpelling(getCursorDecl(C)); @@ -1527,6 +1531,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return createCXString("attribute(iboutlet)"); case CXCursor_PreprocessingDirective: return createCXString("preprocessing directive"); + case CXCursor_MacroDefinition: + return createCXString("macro definition"); case CXCursor_MacroInstantiation: return createCXString("macro instantiation"); } @@ -1665,6 +1671,11 @@ CXSourceLocation clang_getCursorLocation(CXCursor C) { = cxcursor::getCursorMacroInstantiation(C)->getSourceRange().getBegin(); return cxloc::translateSourceLocation(getCursorContext(C), L); } + + if (C.kind == CXCursor_MacroDefinition) { + SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); + return cxloc::translateSourceLocation(getCursorContext(C), L); + } if (!getCursorDecl(C)) return clang_getNullLocation(); @@ -1726,6 +1737,11 @@ CXSourceRange clang_getCursorExtent(CXCursor C) { SourceRange R = cxcursor::getCursorMacroInstantiation(C)->getSourceRange(); return cxloc::translateSourceRange(getCursorContext(C), R); } + + if (C.kind == CXCursor_MacroDefinition) { + SourceRange R = cxcursor::getCursorMacroDefinition(C)->getSourceRange(); + return cxloc::translateSourceRange(getCursorContext(C), R); + } if (!getCursorDecl(C)) return clang_getNullRange(); @@ -2387,7 +2403,15 @@ void clang_annotateTokens(CXTranslationUnit TU, continue; } - // FIXME: expose other preprocessed entities. + if (MacroDefinition *MD = dyn_cast<MacroDefinition>(Entity)) { + SourceLocation Loc = MD->getLocation(); + if (Loc.isFileID()) { + Annotated[Loc.getRawEncoding()] + = MakeMacroDefinitionCursor(MD, CXXUnit); + } + + continue; + } } } diff --git a/tools/CIndex/CXCursor.cpp b/tools/CIndex/CXCursor.cpp index 1e5265ee9a..407f44c70a 100644 --- a/tools/CIndex/CXCursor.cpp +++ b/tools/CIndex/CXCursor.cpp @@ -314,6 +314,16 @@ SourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) { reinterpret_cast<uintptr_t> (C.data[1]))); } +CXCursor cxcursor::MakeMacroDefinitionCursor(MacroDefinition *MI, ASTUnit *TU) { + CXCursor C = { CXCursor_MacroDefinition, { MI, 0, TU } }; + return C; +} + +MacroDefinition *cxcursor::getCursorMacroDefinition(CXCursor C) { + assert(C.kind == CXCursor_MacroDefinition); + return static_cast<MacroDefinition *>(C.data[0]); +} + CXCursor cxcursor::MakeMacroInstantiationCursor(MacroInstantiation *MI, ASTUnit *TU) { CXCursor C = { CXCursor_MacroInstantiation, { MI, 0, TU } }; diff --git a/tools/CIndex/CXCursor.h b/tools/CIndex/CXCursor.h index 24ac1e414e..1664f5a9ce 100644 --- a/tools/CIndex/CXCursor.h +++ b/tools/CIndex/CXCursor.h @@ -25,6 +25,7 @@ class ASTUnit; class Attr; class Decl; class Expr; +class MacroDefinition; class MacroInstantiation; class NamedDecl; class ObjCInterfaceDecl; @@ -80,6 +81,13 @@ CXCursor MakePreprocessingDirectiveCursor(SourceRange Range, ASTUnit *TU); /// \brief Unpack a given preprocessing directive to retrieve its source range. SourceRange getCursorPreprocessingDirective(CXCursor C); +/// \brief Create a macro definition cursor. +CXCursor MakeMacroDefinitionCursor(MacroDefinition *, ASTUnit *TU); + +/// \brief Unpack a given macro definition cursor to retrieve its +/// source range. +MacroDefinition *getCursorMacroDefinition(CXCursor C); + /// \brief Create a macro instantiation cursor. CXCursor MakeMacroInstantiationCursor(MacroInstantiation *, ASTUnit *TU); |