[cfe-commits] r82798 - in /cfe/trunk: include/clang-c/Index.h test/Index/c-index-api-test.m tools/CIndex/CIndex.cpp tools/CIndex/CIndex.exports tools/c-index-test/c-index-test.c

Steve Naroff snaroff at apple.com
Fri Sep 25 14:32:34 PDT 2009


Author: snaroff
Date: Fri Sep 25 16:32:34 2009
New Revision: 82798

URL: http://llvm.org/viewvc/llvm-project?rev=82798&view=rev
Log:
Add clang_getDeclLine and clang_getDeclColumn
Fix clang_getCursorDecl to do the right thing for expr refs
Fixup test file to accommodate new output (which includes the line/column for the referenced decl)

Modified:
    cfe/trunk/include/clang-c/Index.h
    cfe/trunk/test/Index/c-index-api-test.m
    cfe/trunk/tools/CIndex/CIndex.cpp
    cfe/trunk/tools/CIndex/CIndex.exports
    cfe/trunk/tools/c-index-test/c-index-test.c

Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=82798&r1=82797&r2=82798&view=diff

==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Fri Sep 25 16:32:34 2009
@@ -175,6 +175,9 @@
 CXCursor clang_getCursorFromDecl(CXDecl);
 CXEntity clang_getEntityFromDecl(CXDecl);
 const char *clang_getDeclSpelling(CXDecl);
+unsigned clang_getDeclLine(CXDecl);
+unsigned clang_getDeclColumn(CXDecl);
+
 /*
  * CXCursor Operations.
  */

Modified: cfe/trunk/test/Index/c-index-api-test.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/c-index-api-test.m?rev=82798&r1=82797&r2=82798&view=diff

==============================================================================
--- cfe/trunk/test/Index/c-index-api-test.m (original)
+++ cfe/trunk/test/Index/c-index-api-test.m Fri Sep 25 16:32:34 2009
@@ -96,97 +96,97 @@
 // CHECK: c-index-api-test.m:76:6: VarDecl=a [Context:a]
 // CHECK: c-index-api-test.m:76:7: VarDecl=a [Context:a]
 // CHECK: c-index-api-test.m:76:8: VarDecl=a [Context:a]
-// CHECK: c-index-api-test.m:76:9: ObjCSelectorRef=foo [Context:a]
-// CHECK: c-index-api-test.m:76:10: VarRef=bee [Context:a]
-// CHECK: c-index-api-test.m:76:11: VarRef=bee [Context:a]
-// CHECK: c-index-api-test.m:76:12: VarRef=bee [Context:a]
-// CHECK: c-index-api-test.m:76:13: ObjCSelectorRef=foo [Context:a]
-// CHECK: c-index-api-test.m:76:14: ObjCSelectorRef=foo [Context:a]
-// CHECK: c-index-api-test.m:76:15: ObjCSelectorRef=foo [Context:a]
-// CHECK: c-index-api-test.m:76:16: ObjCSelectorRef=foo [Context:a]
-// CHECK: c-index-api-test.m:76:17: ObjCSelectorRef=foo [Context:a]
+// CHECK: c-index-api-test.m:76:9: ObjCSelectorRef=foo:15:15 [Context:a]
+// CHECK: c-index-api-test.m:76:10: VarRef=bee:75:75 [Context:a]
+// CHECK: c-index-api-test.m:76:11: VarRef=bee:75:75 [Context:a]
+// CHECK: c-index-api-test.m:76:12: VarRef=bee:75:75 [Context:a]
+// CHECK: c-index-api-test.m:76:13: ObjCSelectorRef=foo:15:15 [Context:a]
+// CHECK: c-index-api-test.m:76:14: ObjCSelectorRef=foo:15:15 [Context:a]
+// CHECK: c-index-api-test.m:76:15: ObjCSelectorRef=foo:15:15 [Context:a]
+// CHECK: c-index-api-test.m:76:16: ObjCSelectorRef=foo:15:15 [Context:a]
+// CHECK: c-index-api-test.m:76:17: ObjCSelectorRef=foo:15:15 [Context:a]
 // CHECK: c-index-api-test.m:77:12: VarDecl=c [Context:c]
 // CHECK: c-index-api-test.m:77:13: VarDecl=c [Context:c]
 // CHECK: c-index-api-test.m:77:14: VarDecl=c [Context:c]
 // CHECK: c-index-api-test.m:77:15: VarDecl=c [Context:c]
-// CHECK: c-index-api-test.m:77:16: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:17: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:18: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:19: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:20: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:21: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:22: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:23: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:24: ObjCSelectorRef=fooC [Context:c]
-// CHECK: c-index-api-test.m:77:25: ObjCSelectorRef=fooC [Context:c]
+// CHECK: c-index-api-test.m:77:16: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:17: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:18: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:19: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:20: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:21: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:22: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:23: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:24: ObjCSelectorRef=fooC:16:16 [Context:c]
+// CHECK: c-index-api-test.m:77:25: ObjCSelectorRef=fooC:16:16 [Context:c]
 // CHECK: c-index-api-test.m:78:13: VarDecl=d [Context:d]
-// CHECK: c-index-api-test.m:79:2: VarRef=d [Context:main]
-// CHECK: c-index-api-test.m:79:6: VarRef=c [Context:main]
-// CHECK: c-index-api-test.m:80:2: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:3: VarRef=d [Context:main]
-// CHECK: c-index-api-test.m:80:4: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:5: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:6: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:7: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:8: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:9: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:10: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:11: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:80:12: ObjCSelectorRef=pMethod [Context:main]
-// CHECK: c-index-api-test.m:81:2: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:3: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:81:4: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:81:5: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:81:6: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:7: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:8: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:9: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:10: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:11: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:12: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:13: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:14: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:15: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:16: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:17: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:18: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:19: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:20: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:21: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:22: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:23: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:24: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:25: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:81:26: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:27: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:81:28: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:81:29: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:81:30: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:31: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:32: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:33: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:34: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:35: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:36: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:37: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:38: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:39: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:40: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:41: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:42: ObjCSelectorRef=floatMethod [Context:main]
-// CHECK: c-index-api-test.m:81:43: ObjCSelectorRef=catMethodWithFloat: [Context:main]
-// CHECK: c-index-api-test.m:82:3: FunctionRef=main [Context:main]
-// CHECK: c-index-api-test.m:82:4: FunctionRef=main [Context:main]
-// CHECK: c-index-api-test.m:82:5: FunctionRef=main [Context:main]
-// CHECK: c-index-api-test.m:82:6: FunctionRef=main [Context:main]
-// CHECK: c-index-api-test.m:82:8: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:9: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:10: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:11: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:12: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:13: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:14: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:15: EnumConstantRef=someEnum [Context:main]
-// CHECK: c-index-api-test.m:82:33: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:82:34: VarRef=bee [Context:main]
-// CHECK: c-index-api-test.m:82:35: VarRef=bee [Context:main]
+// CHECK: c-index-api-test.m:79:2: VarRef=d:78:78 [Context:main]
+// CHECK: c-index-api-test.m:79:6: VarRef=c:77:77 [Context:main]
+// CHECK: c-index-api-test.m:80:2: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:3: VarRef=d:78:78 [Context:main]
+// CHECK: c-index-api-test.m:80:4: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:5: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:6: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:7: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:8: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:9: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:10: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:11: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:80:12: ObjCSelectorRef=pMethod:32:32 [Context:main]
+// CHECK: c-index-api-test.m:81:2: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:3: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:81:4: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:81:5: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:81:6: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:7: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:8: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:9: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:10: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:11: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:12: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:13: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:14: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:15: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:16: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:17: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:18: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:19: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:20: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:21: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:22: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:23: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:24: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:25: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:81:26: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:27: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:81:28: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:81:29: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:81:30: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:31: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:32: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:33: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:34: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:35: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:36: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:37: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:38: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:39: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:40: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:41: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:42: ObjCSelectorRef=floatMethod:28:28 [Context:main]
+// CHECK: c-index-api-test.m:81:43: ObjCSelectorRef=catMethodWithFloat::27:27 [Context:main]
+// CHECK: c-index-api-test.m:82:3: FunctionRef=main:74:74 [Context:main]
+// CHECK: c-index-api-test.m:82:4: FunctionRef=main:74:74 [Context:main]
+// CHECK: c-index-api-test.m:82:5: FunctionRef=main:74:74 [Context:main]
+// CHECK: c-index-api-test.m:82:6: FunctionRef=main:74:74 [Context:main]
+// CHECK: c-index-api-test.m:82:8: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:9: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:10: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:11: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:12: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:13: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:14: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:15: EnumConstantRef=someEnum:49:49 [Context:main]
+// CHECK: c-index-api-test.m:82:33: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:82:34: VarRef=bee:75:75 [Context:main]
+// CHECK: c-index-api-test.m:82:35: VarRef=bee:75:75 [Context:main]

Modified: cfe/trunk/tools/CIndex/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=82798&r1=82797&r2=82798&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Fri Sep 25 16:32:34 2009
@@ -354,6 +354,22 @@
     return "";
 }
 
+unsigned clang_getDeclLine(CXDecl AnonDecl)
+{
+  assert(AnonDecl && "Passed null CXDecl");
+  NamedDecl *ND = static_cast<NamedDecl *>(AnonDecl);
+  SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
+  return SourceMgr.getSpellingLineNumber(ND->getLocation());
+}
+
+unsigned clang_getDeclColumn(CXDecl AnonDecl)
+{
+  assert(AnonDecl && "Passed null CXDecl");
+  NamedDecl *ND = static_cast<NamedDecl *>(AnonDecl);
+  SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
+  return SourceMgr.getSpellingLineNumber(ND->getLocation());
+}
+
 const char *clang_getCursorSpelling(CXCursor C)
 {
   assert(C.decl && "CXCursor has null decl");
@@ -542,9 +558,36 @@
   return C.kind;
 }
 
+static Decl *getDeclFromExpr(Stmt *E) {
+  if (DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
+    return RefExpr->getDecl();
+  if (MemberExpr *ME = dyn_cast<MemberExpr>(E))
+    return ME->getMemberDecl();
+  if (ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
+    return RE->getDecl();
+
+  if (CallExpr *CE = dyn_cast<CallExpr>(E))
+    return getDeclFromExpr(CE->getCallee());
+  if (CastExpr *CE = dyn_cast<CastExpr>(E))
+    return getDeclFromExpr(CE->getSubExpr());
+  if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
+    return OME->getMethodDecl();
+
+  return 0;
+}
+
 CXDecl clang_getCursorDecl(CXCursor C) 
 {
-  return C.decl;
+  if (clang_isDeclaration(C.kind))
+    return C.decl;
+    
+  if (clang_isReference(C.kind)) {
+    if (C.stmt)
+      return getDeclFromExpr(static_cast<Stmt *>(C.stmt));
+    else
+      return C.decl;
+  }
+  return 0;
 }
 
 static SourceLocation getLocationFromCursor(CXCursor C, 

Modified: cfe/trunk/tools/CIndex/CIndex.exports
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.exports?rev=82798&r1=82797&r2=82798&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.exports (original)
+++ cfe/trunk/tools/CIndex/CIndex.exports Fri Sep 25 16:32:34 2009
@@ -9,6 +9,8 @@
 _clang_getCursorSource
 _clang_getDeclarationName
 _clang_getDeclSpelling
+_clang_getDeclLine
+_clang_getDeclColumn
 _clang_getEntity
 _clang_getEntityFromDecl
 _clang_getURI

Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=82798&r1=82797&r2=82798&view=diff

==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Fri Sep 25 16:32:34 2009
@@ -9,9 +9,16 @@
 static void PrintCursor(CXCursor Cursor) {
   if (clang_isInvalid(Cursor.kind))
     printf("Invalid Cursor => %s\n", clang_getCursorKindSpelling(Cursor.kind));
-  else
+  else {
     printf("%s=%s", clang_getCursorKindSpelling(Cursor.kind),
                       clang_getCursorSpelling(Cursor));
+    if (Cursor.stmt) {
+      CXDecl DeclReferenced = clang_getCursorDecl(Cursor);
+      if (DeclReferenced)
+        printf(":%d:%d", clang_getDeclLine(DeclReferenced),
+                         clang_getDeclColumn(DeclReferenced));
+    }
+  }
 }
 
 static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData Filter) 





More information about the cfe-commits mailing list