[cfe-commits] r138593 - in /cfe/trunk: include/clang/AST/TypeLoc.h test/Index/get-cursor.c test/Index/usrs.m tools/libclang/CIndex.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Thu Aug 25 15:24:48 PDT 2011


Author: akirtzidis
Date: Thu Aug 25 17:24:47 2011
New Revision: 138593

URL: http://llvm.org/viewvc/llvm-project?rev=138593&view=rev
Log:
[libclang] Fix getting a cursor that points inside tag definition that is part
of a type specifier.

e.g. for:

typedef struct _MyS {
  int foo;
} MyS;

pointing at field 'foo' would give a cursor for the typedef declaration 'MyS'
instead of the field.

Added:
    cfe/trunk/test/Index/get-cursor.c
Modified:
    cfe/trunk/include/clang/AST/TypeLoc.h
    cfe/trunk/test/Index/usrs.m
    cfe/trunk/tools/libclang/CIndex.cpp

Modified: cfe/trunk/include/clang/AST/TypeLoc.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLoc.h?rev=138593&r1=138592&r2=138593&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/TypeLoc.h (original)
+++ cfe/trunk/include/clang/AST/TypeLoc.h Thu Aug 25 17:24:47 2011
@@ -565,6 +565,12 @@
                                                     TagType> {
 public:
   TagDecl *getDecl() const { return getTypePtr()->getDecl(); }
+
+  /// \brief True if the tag was defined in this type specifier. 
+  bool isDefinition() const {
+    return getDecl()->isDefinition() &&
+         (getNameLoc().isInvalid() || getNameLoc() == getDecl()->getLocation());
+  }
 };
 
 /// \brief Wrapper for source info for record types.

Added: cfe/trunk/test/Index/get-cursor.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.c?rev=138593&view=auto
==============================================================================
--- cfe/trunk/test/Index/get-cursor.c (added)
+++ cfe/trunk/test/Index/get-cursor.c Thu Aug 25 17:24:47 2011
@@ -0,0 +1,14 @@
+struct _MyS {
+  int foo;
+} MyS;
+
+struct _MyS ww;
+
+// RUN: c-index-test -cursor-at=%s:1:9 \
+// RUN:              -cursor-at=%s:2:9 \
+// RUN:              -cursor-at=%s:5:9 \
+// RUN:       %s | FileCheck %s
+
+// CHECK: StructDecl=_MyS:1:8 (Definition)
+// CHECK: FieldDecl=foo:2:7 (Definition)
+// CHECK: TypeRef=struct _MyS:1:8

Modified: cfe/trunk/test/Index/usrs.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/usrs.m?rev=138593&r1=138592&r2=138593&view=diff
==============================================================================
--- cfe/trunk/test/Index/usrs.m (original)
+++ cfe/trunk/test/Index/usrs.m Thu Aug 25 17:24:47 2011
@@ -150,11 +150,10 @@
 // CHECK-source: usrs.m:10:1: EnumDecl=:10:1 (Definition) Extent=[10:1 - 13:2]
 // CHECK-source: usrs.m:11:3: EnumConstantDecl=FOO:11:3 (Definition) Extent=[11:3 - 11:6]
 // CHECK-source: usrs.m:12:3: EnumConstantDecl=BAR:12:3 (Definition) Extent=[12:3 - 12:6]
+// CHECK-source: usrs.m:18:3: TypedefDecl=MyStruct:18:3 (Definition) Extent=[15:1 - 18:11]
 // CHECK-source: usrs.m:15:9: StructDecl=:15:9 (Definition) Extent=[15:9 - 18:2]
 // CHECK-source: usrs.m:16:7: FieldDecl=wa:16:7 (Definition) Extent=[16:3 - 16:9]
 // CHECK-source: usrs.m:17:7: FieldDecl=moo:17:7 (Definition) Extent=[17:3 - 17:10]
-// CHECK-source: usrs.m:18:3: TypedefDecl=MyStruct:18:3 (Definition) Extent=[15:1 - 18:11]
-// CHECK-source: usrs.m:15:9: TypeRef=MyStruct:15:9 Extent=[15:9 - 15:15]
 // CHECK-source: usrs.m:20:6: EnumDecl=Pizza:20:6 (Definition) Extent=[20:1 - 23:2]
 // CHECK-source: usrs.m:21:3: EnumConstantDecl=CHEESE:21:3 (Definition) Extent=[21:3 - 21:9]
 // CHECK-source: usrs.m:22:3: EnumConstantDecl=MUSHROOMS:22:3 (Definition) Extent=[22:3 - 22:12]

Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=138593&r1=138592&r2=138593&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Thu Aug 25 17:24:47 2011
@@ -1445,6 +1445,9 @@
 }
 
 bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
+  if (TL.isDefinition())
+    return Visit(MakeCXCursor(TL.getDecl(), TU));
+
   return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
 }
 





More information about the cfe-commits mailing list