[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    [cfe-commits] [patch] Add access specifier declarations to libclang
From:       Paolo Capriotti <p.capriotti () gmail ! com>
Date:       2011-09-22 20:42:19
Message-ID: CALMmMjb+B02w8VcJNPHXXaDEi7=9oFaVbV14knhD8Jb8_7W_-Q () mail ! gmail ! com
[Download RAW message or body]

Hi all,
the attached patch adds a new CXCursor_AccessSpecifier cursor kind and
modifies the existing clang_getCXXAccessSpecifier function to work on
those cursors as well as base class specifiers.

Are these kinds of extensions to the libclang API welcome? I think
I'll have a few other similar patches coming up in the future, since
for my project I need to access some AST nodes which are currently
unexposed.

BR,
Paolo

["access-spec.patch" (text/x-patch)]

diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index 07bcf9e..088f1ad 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -1304,8 +1304,10 @@ enum CXCursorKind {
   CXCursor_ObjCSynthesizeDecl            = 37,
   /** \brief An Objective-C @dynamic definition. */
   CXCursor_ObjCDynamicDecl               = 38,
+  /** \brief An access specifier. */
+  CXCursor_AccessSpecifier               = 39,
   CXCursor_FirstDecl                     = CXCursor_UnexposedDecl,
-  CXCursor_LastDecl                      = CXCursor_ObjCDynamicDecl,
+  CXCursor_LastDecl                      = CXCursor_AccessSpecifier,
 
   /* References */
   CXCursor_FirstRef                      = 40, /* Decl references */
@@ -2065,7 +2067,7 @@ enum CX_CXXAccessSpecifier {
 
 /**
  * \brief Returns the access control level for the C++ base specifier
- *  represented by a cursor with kind CX_CXXBaseSpecifier.
+ *  represented by a cursor with kind CX_CXXBaseSpecifier or \
                CXCursor_AccessSpecifier.
  */
 CINDEX_LINKAGE enum CX_CXXAccessSpecifier clang_getCXXAccessSpecifier(CXCursor);
 
diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp
index 5b44841..c730d16 100644
--- a/lib/Sema/SemaCodeComplete.cpp
+++ b/lib/Sema/SemaCodeComplete.cpp
@@ -2723,6 +2723,7 @@ CXCursorKind clang::getCursorKindForDecl(Decl *D) {
     case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter;
     case Decl::FunctionTemplate:   return CXCursor_FunctionTemplate;
     case Decl::ClassTemplate:      return CXCursor_ClassTemplate;
+    case Decl::AccessSpec:         return CXCursor_AccessSpecifier;
     case Decl::ClassTemplatePartialSpecialization:
       return CXCursor_ClassTemplatePartialSpecialization;
     case Decl::UsingDirective:     return CXCursor_UsingDirective;
diff --git a/test/Index/recursive-cxx-member-calls.cpp \
b/test/Index/recursive-cxx-member-calls.cpp index bf557c4..ea766180 100644
--- a/test/Index/recursive-cxx-member-calls.cpp
+++ b/test/Index/recursive-cxx-member-calls.cpp
@@ -425,8 +425,8 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo * \
Name) {  // CHECK-tokens: Keyword: "class" [38:1 - 38:6] ClassDecl=StringRef:38:7 \
(Definition)  // CHECK-tokens: Identifier: "StringRef" [38:7 - 38:16] \
ClassDecl=StringRef:38:7 (Definition)  // CHECK-tokens: Punctuation: "{" [38:17 - \
                38:18] ClassDecl=StringRef:38:7 (Definition)
-// CHECK-tokens: Keyword: "public" [39:1 - 39:7] UnexposedDecl=:39:1 (Definition)
-// CHECK-tokens: Punctuation: ":" [39:7 - 39:8] UnexposedDecl=:39:1 (Definition)
+// CHECK-tokens: Keyword: "public" [39:1 - 39:7] AccessSpecifier=:39:1 (Definition)
+// CHECK-tokens: Punctuation: ":" [39:7 - 39:8] AccessSpecifier=:39:1 (Definition)
 // CHECK-tokens: Keyword: "typedef" [40:3 - 40:10] ClassDecl=StringRef:38:7 \
(Definition)  // CHECK-tokens: Keyword: "const" [40:11 - 40:16] \
ClassDecl=StringRef:38:7 (Definition)  // CHECK-tokens: Keyword: "char" [40:17 - \
40:21] TypedefDecl=iterator:40:23 (Definition) @@ -444,8 +444,8 @@ \
AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {  // \
CHECK-tokens: Literal: "0" [41:38 - 41:39] UnexposedExpr=  // CHECK-tokens: \
Punctuation: ")" [41:39 - 41:40] UnexposedExpr=  // CHECK-tokens: Punctuation: ";" \
                [41:40 - 41:41] ClassDecl=StringRef:38:7 (Definition)
-// CHECK-tokens: Keyword: "private" [42:1 - 42:8] UnexposedDecl=:42:1 (Definition)
-// CHECK-tokens: Punctuation: ":" [42:8 - 42:9] UnexposedDecl=:42:1 (Definition)
+// CHECK-tokens: Keyword: "private" [42:1 - 42:8] AccessSpecifier=:42:1 (Definition)
+// CHECK-tokens: Punctuation: ":" [42:8 - 42:9] AccessSpecifier=:42:1 (Definition)
 // CHECK-tokens: Keyword: "const" [43:3 - 43:8] ClassDecl=StringRef:38:7 \
(Definition)  // CHECK-tokens: Keyword: "char" [43:9 - 43:13] FieldDecl=Data:43:15 \
(Definition)  // CHECK-tokens: Punctuation: "*" [43:14 - 43:15] FieldDecl=Data:43:15 \
(Definition) @@ -475,8 +475,8 @@ AttributeList::Kind AttributeList::getKind(const \
IdentifierInfo * Name) {  // CHECK-tokens: Identifier: "b" [45:62 - 45:63] \
DeclRefExpr=b:45:38  // CHECK-tokens: Punctuation: ";" [45:63 - 45:64] UnexposedStmt=
 // CHECK-tokens: Punctuation: "}" [45:65 - 45:66] UnexposedStmt=
-// CHECK-tokens: Keyword: "public" [46:1 - 46:7] UnexposedDecl=:46:1 (Definition)
-// CHECK-tokens: Punctuation: ":" [46:7 - 46:8] UnexposedDecl=:46:1 (Definition)
+// CHECK-tokens: Keyword: "public" [46:1 - 46:7] AccessSpecifier=:46:1 (Definition)
+// CHECK-tokens: Punctuation: ":" [46:7 - 46:8] AccessSpecifier=:46:1 (Definition)
 // CHECK-tokens: Identifier: "StringRef" [47:3 - 47:12] \
CXXConstructor=StringRef:47:3 (Definition)  // CHECK-tokens: Punctuation: "(" [47:12 \
- 47:13] CXXConstructor=StringRef:47:3 (Definition)  // CHECK-tokens: Punctuation: \
")" [47:13 - 47:14] CXXConstructor=StringRef:47:3 (Definition) @@ -664,8 +664,8 @@ \
AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {  // \
CHECK-tokens: Keyword: "class" [66:1 - 66:6] ClassDecl=IdentifierInfo:66:7 \
(Definition)  // CHECK-tokens: Identifier: "IdentifierInfo" [66:7 - 66:21] \
ClassDecl=IdentifierInfo:66:7 (Definition)  // CHECK-tokens: Punctuation: "{" [66:22 \
                - 66:23] ClassDecl=IdentifierInfo:66:7 (Definition)
-// CHECK-tokens: Keyword: "public" [67:1 - 67:7] UnexposedDecl=:67:1 (Definition)
-// CHECK-tokens: Punctuation: ":" [67:7 - 67:8] UnexposedDecl=:67:1 (Definition)
+// CHECK-tokens: Keyword: "public" [67:1 - 67:7] AccessSpecifier=:67:1 (Definition)
+// CHECK-tokens: Punctuation: ":" [67:7 - 67:8] AccessSpecifier=:67:1 (Definition)
 // CHECK-tokens: Identifier: "IdentifierInfo" [67:8 - 67:22] \
CXXConstructor=IdentifierInfo:67:8  // CHECK-tokens: Punctuation: "(" [67:22 - 67:23] \
CXXConstructor=IdentifierInfo:67:8  // CHECK-tokens: Punctuation: ")" [67:23 - 67:24] \
CXXConstructor=IdentifierInfo:67:8 @@ -821,8 +821,8 @@ AttributeList::Kind \
AttributeList::getKind(const IdentifierInfo * Name) {  // CHECK-tokens: Punctuation: \
"*" [85:11 - 85:12] FieldDecl=Result:85:12 (Definition)  // CHECK-tokens: Identifier: \
"Result" [85:12 - 85:18] FieldDecl=Result:85:12 (Definition)  // CHECK-tokens: \
                Punctuation: ";" [85:18 - 85:19] ClassTemplate=StringSwitch:83:47 \
                (Definition)
-// CHECK-tokens: Keyword: "public" [86:1 - 86:7] UnexposedDecl=:86:1 (Definition)
-// CHECK-tokens: Punctuation: ":" [86:7 - 86:8] UnexposedDecl=:86:1 (Definition)
+// CHECK-tokens: Keyword: "public" [86:1 - 86:7] AccessSpecifier=:86:1 (Definition)
+// CHECK-tokens: Punctuation: ":" [86:7 - 86:8] AccessSpecifier=:86:1 (Definition)
 // CHECK-tokens: Keyword: "explicit" [87:3 - 87:11] CXXConstructor=StringSwitch<T, \
R>:87:12 (Definition)  // CHECK-tokens: Identifier: "StringSwitch" [87:12 - 87:24] \
CXXConstructor=StringSwitch<T, R>:87:12 (Definition)  // CHECK-tokens: Punctuation: \
"(" [87:24 - 87:25] CXXConstructor=StringSwitch<T, R>:87:12 (Definition) @@ -1625,7 \
+1625,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {  \
// CHECK: 36:33: ParmDecl=s:36:33 (Definition) Extent=[36:21 - 36:34]  // CHECK: \
37:11: Namespace=llvm:37:11 (Definition) Extent=[37:1 - 64:2]  // CHECK: 38:7: \
                ClassDecl=StringRef:38:7 (Definition) Extent=[38:1 - 63:2]
-// CHECK: 39:1: UnexposedDecl=:39:1 (Definition) Extent=[39:1 - 39:8]
+// CHECK: 39:1: AccessSpecifier=:39:1 (Definition) Extent=[39:1 - 39:8]
 // CHECK: 40:23: TypedefDecl=iterator:40:23 (Definition) Extent=[40:3 - 40:31]
 // CHECK: 41:23: VarDecl=npos:41:23 Extent=[41:3 - 41:40]
 // CHECK: 41:16: TypeRef=size_t:2:25 Extent=[41:16 - 41:22]
@@ -1634,7 +1634,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo \
* Name) {  // CHECK: 41:31: TypeRef=size_t:2:25 Extent=[41:31 - 41:37]
 // CHECK: 41:38: UnexposedExpr= Extent=[41:38 - 41:39]
 // CHECK: 41:38: UnexposedExpr= Extent=[41:38 - 41:39]
-// CHECK: 42:1: UnexposedDecl=:42:1 (Definition) Extent=[42:1 - 42:9]
+// CHECK: 42:1: AccessSpecifier=:42:1 (Definition) Extent=[42:1 - 42:9]
 // CHECK: 43:15: FieldDecl=Data:43:15 (Definition) Extent=[43:3 - 43:19]
 // CHECK: 44:10: FieldDecl=Length:44:10 (Definition) Extent=[44:3 - 44:16]
 // CHECK: 44:3: TypeRef=size_t:2:25 Extent=[44:3 - 44:9]
@@ -1652,7 +1652,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo \
* Name) {  // CHECK: 45:54: DeclRefExpr=b:45:38 Extent=[45:54 - 45:55]
 // CHECK: 45:58: DeclRefExpr=a:45:28 Extent=[45:58 - 45:59]
 // CHECK: 45:62: DeclRefExpr=b:45:38 Extent=[45:62 - 45:63]
-// CHECK: 46:1: UnexposedDecl=:46:1 (Definition) Extent=[46:1 - 46:8]
+// CHECK: 46:1: AccessSpecifier=:46:1 (Definition) Extent=[46:1 - 46:8]
 // CHECK: 47:3: CXXConstructor=StringRef:47:3 (Definition) Extent=[47:3 - 47:37]
 // CHECK: 47:16: MemberRef=Data:43:15 Extent=[47:16 - 47:20]
 // CHECK: 47:21: UnexposedExpr= Extent=[47:21 - 47:22]
@@ -1767,7 +1767,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo \
* Name) {  // CHECK: 61:52: DeclRefExpr=Start:60:27 Extent=[61:52 - 61:57]
 // CHECK: 65:11: Namespace=clang:65:11 (Definition) Extent=[65:1 - 81:2]
 // CHECK: 66:7: ClassDecl=IdentifierInfo:66:7 (Definition) Extent=[66:1 - 80:2]
-// CHECK: 67:1: UnexposedDecl=:67:1 (Definition) Extent=[67:1 - 67:8]
+// CHECK: 67:1: AccessSpecifier=:67:1 (Definition) Extent=[67:1 - 67:8]
 // CHECK: 67:8: CXXConstructor=IdentifierInfo:67:8 Extent=[67:8 - 67:24]
 // CHECK: 68:15: CXXMethod=getNameStart:68:15 (Definition) Extent=[68:3 - 71:4]
 // CHECK: 68:36: UnexposedStmt= Extent=[68:36 - 71:4]
@@ -1838,7 +1838,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo \
* Name) {  // CHECK: 84:13: FieldDecl=Str:84:13 (Definition) Extent=[84:3 - 84:16]
 // CHECK: 84:3: TypeRef=class llvm::StringRef:38:7 Extent=[84:3 - 84:12]
 // CHECK: 85:12: FieldDecl=Result:85:12 (Definition) Extent=[85:3 - 85:18]
-// CHECK: 86:1: UnexposedDecl=:86:1 (Definition) Extent=[86:1 - 86:8]
+// CHECK: 86:1: AccessSpecifier=:86:1 (Definition) Extent=[86:1 - 86:8]
 // CHECK: 87:12: CXXConstructor=StringSwitch<T, R>:87:12 (Definition) Extent=[87:3 - \
87:64]  // CHECK: 87:35: ParmDecl=Str:87:35 (Definition) Extent=[87:25 - 87:38]
 // CHECK: 87:25: TypeRef=class llvm::StringRef:38:7 Extent=[87:25 - 87:34]
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index d9bc5ca..56fcf0e 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -3416,6 +3416,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
     return createCXString("ObjCSynthesizeDecl");
   case CXCursor_ObjCDynamicDecl:
     return createCXString("ObjCDynamicDecl");
+  case CXCursor_AccessSpecifier:
+    return createCXString("AccessSpecifier");
   }
 
   llvm_unreachable("Unhandled CXCursorKind");
diff --git a/tools/libclang/CIndexCXX.cpp b/tools/libclang/CIndexCXX.cpp
index 0f49f65..132d997 100644
--- a/tools/libclang/CIndexCXX.cpp
+++ b/tools/libclang/CIndexCXX.cpp
@@ -31,11 +31,16 @@ unsigned clang_isVirtualBase(CXCursor C) {
 }
 
 enum CX_CXXAccessSpecifier clang_getCXXAccessSpecifier(CXCursor C) {
-  if (C.kind != CXCursor_CXXBaseSpecifier)
+  AccessSpecifier spec = AS_none;
+
+  if (C.kind == CXCursor_AccessSpecifier)
+    spec = getCursorDecl(C)->getAccess();
+  else if (C.kind == CXCursor_CXXBaseSpecifier)
+    spec = getCursorCXXBaseSpecifier(C)->getAccessSpecifier();
+  else
     return CX_CXXInvalidAccessSpecifier;
   
-  CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
-  switch (B->getAccessSpecifier()) {
+  switch (spec) {
     case AS_public: return CX_CXXPublic;
     case AS_protected: return CX_CXXProtected;
     case AS_private: return CX_CXXPrivate;



_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic