[cfe-commits] r133929 - in /cfe/trunk: test/Index/annotate-tokens.cpp tools/libclang/CIndex.cpp
Argyrios Kyrtzidis
akyrtzi at gmail.com
Mon Jun 27 12:42:20 PDT 2011
Author: akirtzidis
Date: Mon Jun 27 14:42:20 2011
New Revision: 133929
URL: http://llvm.org/viewvc/llvm-project?rev=133929&view=rev
Log:
[libclang] Avoid having the cursor of an expression "overwrite" the annotation of the
variable declaration that it belongs to.
This can happen for C++ constructor expressions whose range generally
include the variable declaration, e.g.:
MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
rdar://9124499.
Modified:
cfe/trunk/test/Index/annotate-tokens.cpp
cfe/trunk/tools/libclang/CIndex.cpp
Modified: cfe/trunk/test/Index/annotate-tokens.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-tokens.cpp?rev=133929&r1=133928&r2=133929&view=diff
==============================================================================
--- cfe/trunk/test/Index/annotate-tokens.cpp (original)
+++ cfe/trunk/test/Index/annotate-tokens.cpp Mon Jun 27 14:42:20 2011
@@ -17,9 +17,10 @@
struct S2 { S1 *operator->(); };
void test3(S2 s2) {
s2->f();
+ X foo;
}
-// RUN: c-index-test -test-annotate-tokens=%s:1:1:20:1 %s | FileCheck %s
+// RUN: c-index-test -test-annotate-tokens=%s:1:1:21:1 %s | FileCheck %s
// CHECK: Keyword: "struct" [1:1 - 1:7] StructDecl=bonk:1:8 (Definition)
// CHECK: Identifier: "bonk" [1:8 - 1:12] StructDecl=bonk:1:8 (Definition)
// CHECK: Punctuation: "{" [1:13 - 1:14] StructDecl=bonk:1:8 (Definition)
@@ -115,4 +116,7 @@
// CHECK: Punctuation: "(" [19:8 - 19:9] CallExpr=f:16:18
// CHECK: Punctuation: ")" [19:9 - 19:10] CallExpr=f:16:18
// CHECK: Punctuation: ";" [19:10 - 19:11] UnexposedStmt=
-// CHECK: Punctuation: "}" [20:1 - 20:2] UnexposedStmt=
+// CHECK: Identifier: "X" [20:3 - 20:4] TypeRef=struct X:7:8
+// CHECK: Identifier: "foo" [20:5 - 20:8] VarDecl=foo:20:5 (Definition)
+// CHECK: Punctuation: ";" [20:8 - 20:9] UnexposedStmt=
+// CHECK: Punctuation: "}" [21:1 - 21:2] UnexposedStmt=
Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=133929&r1=133928&r2=133929&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Mon Jun 27 14:42:20 2011
@@ -4627,6 +4627,24 @@
break;
}
+ // Avoid having the cursor of an expression "overwrite" the annotation of the
+ // variable declaration that it belongs to.
+ // This can happen for C++ constructor expressions whose range generally
+ // include the variable declaration, e.g.:
+ // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
+ if (clang_isExpression(cursorK)) {
+ Expr *E = getCursorExpr(cursor);
+ if (Decl *D = getCursorDecl(cursor)) {
+ const unsigned I = NextToken();
+ if (E->getLocStart().isValid() && D->getLocation().isValid() &&
+ E->getLocStart() == D->getLocation() &&
+ E->getLocStart() == GetTokenLoc(I)) {
+ Cursors[I] = updateC;
+ AdvanceToken();
+ }
+ }
+ }
+
// Visit children to get their cursor information.
const unsigned BeforeChildren = NextToken();
VisitChildren(cursor);
More information about the cfe-commits
mailing list