Teach clang_getCursorLocation() to return the locations of references
rather than the locations that refer to.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93812 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/CIndex/CXCursor.cpp b/tools/CIndex/CXCursor.cpp
index 945e1ac..747b1a1 100644
--- a/tools/CIndex/CXCursor.cpp
+++ b/tools/CIndex/CXCursor.cpp
@@ -26,9 +26,10 @@
   return C;  
 }
 
-CXCursor cxcursor::MakeCXCursor(CXCursorKind K, Decl *D, Stmt *S) {
+CXCursor cxcursor::MakeCXCursor(CXCursorKind K, Decl *D, Stmt *S,
+                                ASTContext &Context) {
   assert(clang_isReference(K));
-  CXCursor C = { K, { D, S, 0 } };
+  CXCursor C = { K, { D, S, &Context } };
   return C;  
 }
 
@@ -140,8 +141,52 @@
   return (Stmt *)Cursor.data[1];
 }
 
-Decl *cxcursor::getCursorReferringDecl(CXCursor Cursor) {
-  return (Decl *)Cursor.data[2];
+ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
+  switch (Cursor.kind) {
+  case CXCursor_TypedefDecl:
+  case CXCursor_StructDecl:
+  case CXCursor_UnionDecl:
+  case CXCursor_ClassDecl:
+  case CXCursor_EnumDecl:
+  case CXCursor_FieldDecl:
+  case CXCursor_EnumConstantDecl:
+  case CXCursor_FunctionDecl:
+  case CXCursor_VarDecl:
+  case CXCursor_ParmDecl:
+  case CXCursor_ObjCInterfaceDecl:
+  case CXCursor_ObjCCategoryDecl:
+  case CXCursor_ObjCProtocolDecl:
+  case CXCursor_ObjCPropertyDecl:
+  case CXCursor_ObjCIvarDecl:
+  case CXCursor_ObjCInstanceMethodDecl:
+  case CXCursor_ObjCClassMethodDecl:
+  case CXCursor_FunctionDefn:
+  case CXCursor_ObjCClassDefn:
+  case CXCursor_ObjCCategoryDefn:
+  case CXCursor_ObjCInstanceMethodDefn:
+  case CXCursor_ObjCClassMethodDefn:
+    return static_cast<Decl *>(Cursor.data[0])->getASTContext();
+
+  case CXCursor_ObjCSuperClassRef:
+  case CXCursor_ObjCProtocolRef:
+  case CXCursor_ObjCClassRef:
+    return static_cast<Decl *>(Cursor.data[0])->getASTContext();
+    
+  case CXCursor_ObjCSelectorRef:
+  case CXCursor_ObjCIvarRef:
+  case CXCursor_VarRef:
+  case CXCursor_FunctionRef:
+  case CXCursor_EnumConstantRef:
+  case CXCursor_MemberRef:
+    return *static_cast<ASTContext *>(Cursor.data[2]);
+  
+  case CXCursor_InvalidFile:
+  case CXCursor_NoDeclFound:
+  case CXCursor_NotImplemented:
+    llvm_unreachable("No context in an invalid cursor");
+  }
+  
+  llvm_unreachable("No context available");
 }
 
 bool cxcursor::operator==(CXCursor X, CXCursor Y) {