]> granicus.if.org Git - clang/commitdiff
Expose macro definitions as CIndex cursors. These can still only be
authorDouglas Gregor <dgregor@apple.com>
Thu, 18 Mar 2010 18:04:21 +0000 (18:04 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 18 Mar 2010 18:04:21 +0000 (18:04 +0000)
generated by clang_annotateTokens().

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98837 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
include/clang/Lex/PreprocessingRecord.h
test/Index/annotate-tokens-pp.c
tools/CIndex/CIndex.cpp
tools/CIndex/CXCursor.cpp
tools/CIndex/CXCursor.h

index bdcb37df9f3386f218e9530db49cb178eb469d2c..de76076a25574506fefa9ce00d9a12d3c1ad1bca 100644 (file)
@@ -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
 };
index 4ebd4e60390fb964414ec21d648c0a883e1a8f41..12a6e9c71cf4b74c77d7d911e6d7278e6eecac90 100644 (file)
@@ -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; }
   };
index db808d094351a3deaee7fe717945ca0ac2cbfafe..a88e561747431e197b252c165669d0f39ec4f5ec 100644 (file)
@@ -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=
index deab84698ce71a95bbfdf08632a12c810676fed5..ce2188550bd28a8e1fc4a5f0ad9c0a8917b3d832 100644 (file)
@@ -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;
+      }
     }
   }
   
index 1e5265ee9afeec2348ad75a41a47214b9c22cd66..407f44c70a0dd241bccb16ffb602997cb9da896a 100644 (file)
@@ -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 } };
index 24ac1e414eae3f2b2d02aa4daade5b9b5e5e981e..1664f5a9ced2afecdfbe4cc7ea93b9c3fdf5fb8b 100644 (file)
@@ -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);