]> granicus.if.org Git - clang/commitdiff
Introduce a special cursor kind for the translation unit, to serve as
authorDouglas Gregor <dgregor@apple.com>
Wed, 20 Jan 2010 00:23:15 +0000 (00:23 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 20 Jan 2010 00:23:15 +0000 (00:23 +0000)
the root of the conceptual cursor hierarchy (just like we do with
declarations). This will be used when we get to unify
clang_loadTranslationUnit() and clang_loadDeclaration() into something
more generally useful.

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

include/clang-c/Index.h
tools/CIndex/CIndex.cpp
tools/CIndex/CIndex.exports
tools/CIndex/CXCursor.cpp

index 35b5f81308159dc8faa7672264f4d89967ab1f80..d203ff8b8f412fcb922ee25ed45e8dbe809068e4 100644 (file)
@@ -168,7 +168,15 @@ enum CXCursorKind {
   * reported.
   */
  CXCursor_UnexposedStmt                 = 200,
- CXCursor_LastStmt                      = 200
+ CXCursor_LastStmt                      = 200,
+
+ /**
+  * \brief Cursor that represents the translation unit itself.
+  *
+  * The translation unit cursor exists primarily to act as the root
+  * cursor for traversing the contents of a translation unit.
+  */
+ CXCursor_TranslationUnit               = 300
 };
 
 /**
@@ -380,6 +388,14 @@ typedef void (*CXDeclIterator)(CXDecl, CXCursor, CXClientData);
 
 CINDEX_LINKAGE void clang_loadDeclaration(CXDecl, CXDeclIterator, CXClientData);
 
+/**
+ * \brief Retrieve the cursor that represents the given translation unit.
+ *
+ * The translation unit cursor can be used to start traversing the
+ * various declarations within the given translation unit.
+ */
+CINDEX_LINKAGE CXCursor clang_getTranslationUnitCursor(CXTranslationUnit);
+
 /*
  * CXFile Operations.
  */
@@ -492,7 +508,7 @@ CINDEX_LINKAGE unsigned clang_isReference(enum CXCursorKind);
 CINDEX_LINKAGE unsigned clang_isExpression(enum CXCursorKind);
 CINDEX_LINKAGE unsigned clang_isStatement(enum CXCursorKind);
 CINDEX_LINKAGE unsigned clang_isInvalid(enum CXCursorKind);
-
+CINDEX_LINKAGE unsigned clang_isTranslationUnit(enum CXCursorKind);
 CINDEX_LINKAGE unsigned clang_equalCursors(CXCursor, CXCursor);
 
 CINDEX_LINKAGE CXString clang_getCursorSpelling(CXCursor);
index 032dd126f690e00826fe99dc9112d744f84daa18..8dfaa4cbe1230cf105196481ce9f91c69b65c3e4 100644 (file)
@@ -565,6 +565,11 @@ CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
                                   true);
 }
 
+CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
+  CXCursor Result = { CXCursor_TranslationUnit, { TU, 0, 0 } };
+  return Result;
+}
+
 void clang_loadTranslationUnit(CXTranslationUnit CTUnit,
                                CXTranslationUnitIterator callback,
                                CXClientData CData) {
@@ -803,6 +808,9 @@ static Decl *getDeclFromExpr(Stmt *E) {
 extern "C" {
 CXString clang_getCursorSpelling(CXCursor C) {
   assert(getCursorDecl(C) && "CXCursor has null decl");
+  if (clang_isTranslationUnit(C.kind))
+    return clang_getTranslationUnitSpelling(C.data[0]);
+
   if (clang_isReference(C.kind)) {
     switch (C.kind) {
     case CXCursor_ObjCSuperClassRef: {
@@ -867,6 +875,7 @@ const char *clang_getCursorKindSpelling(enum CXCursorKind Kind) {
   case CXCursor_InvalidFile: return "InvalidFile";
   case CXCursor_NoDeclFound: return "NoDeclFound";
   case CXCursor_NotImplemented: return "NotImplemented";
+  case CXCursor_TranslationUnit: return "TranslationUnit";
   }
   
   llvm_unreachable("Unhandled CXCursorKind");
@@ -947,6 +956,10 @@ unsigned clang_isStatement(enum CXCursorKind K) {
   return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
 }
 
+unsigned clang_isTranslationUnit(enum CXCursorKind K) {
+  return K == CXCursor_TranslationUnit;
+}
+
 CXCursorKind clang_getCursorKind(CXCursor C) {
   return C.kind;
 }
index b05c2ccad3812043566b3b02d190c7ef2b18dc84..7a70e545b6066936b0350bae14d50e036af8be0d 100644 (file)
@@ -39,6 +39,7 @@ _clang_getNullCursor
 _clang_getNumCompletionChunks
 _clang_getRangeEnd
 _clang_getRangeStart
+_clang_getTranslationUnitCursor
 _clang_getTranslationUnitSpelling
 _clang_isCursorDefinition
 _clang_isDeclaration
@@ -46,6 +47,7 @@ _clang_isExpression
 _clang_isInvalid
 _clang_isReference
 _clang_isStatement
+_clang_isTranslationUnit
 _clang_loadDeclaration
 _clang_loadTranslationUnit
 _clang_setUseExternalASTGeneration
index f13e2eea89f52721e484313904639933e85f9115..7dd3ae9cc001c2a080e360e6388998e08521b24e 100644 (file)
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "CXCursor.h"
+#include "clang/Frontend/ASTUnit.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/Expr.h"
@@ -320,6 +321,10 @@ ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
   case CXCursor_UnexposedStmt:
     return static_cast<Decl *>(Cursor.data[0])->getASTContext();
 
+  case CXCursor_TranslationUnit: {
+    ASTUnit *CXXUnit = static_cast<ASTUnit *>(Cursor.data[0]);
+    return CXXUnit->getASTContext();
+  }
   }
   
   llvm_unreachable("No context available");