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)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82798 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index 24f3c54..2203e28 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -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.
  */
diff --git a/test/Index/c-index-api-test.m b/test/Index/c-index-api-test.m
index 5eb1df7..1a926bc 100644
--- a/test/Index/c-index-api-test.m
+++ b/test/Index/c-index-api-test.m
@@ -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]
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp
index 37f2d86..74b3cfd 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/tools/CIndex/CIndex.cpp
@@ -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, 
diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports
index 1b804b1..8cfc1a9 100644
--- a/tools/CIndex/CIndex.exports
+++ b/tools/CIndex/CIndex.exports
@@ -9,6 +9,8 @@
 _clang_getCursorSource
 _clang_getDeclarationName
 _clang_getDeclSpelling
+_clang_getDeclLine
+_clang_getDeclColumn
 _clang_getEntity
 _clang_getEntityFromDecl
 _clang_getURI
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index f1f9372..aa93a7e 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -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)