Introduce the notion of an "unexposed" declaration into the CIndex
API. This is a catch-all for any declaration known to Clang but not
specifically part of the CIndex API. We'll use the same approach with
expressions, statements, references, etc., as needed.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93924 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp
index a7cbb8a..b4759a5 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/tools/CIndex/CIndex.cpp
@@ -208,7 +208,7 @@
   else if (isa<EnumConstantDecl>(D))
     return CXCursor_EnumConstantRef;
   else
-    return CXCursor_NotImplemented;
+    return CXCursor_UnexposedDecl;
 }
 
 // Translation Unit Visitor.
@@ -712,7 +712,10 @@
 extern "C" {
 CXString clang_getDeclSpelling(CXDecl AnonDecl) {
   assert(AnonDecl && "Passed null CXDecl");
-  NamedDecl *ND = static_cast<NamedDecl *>(AnonDecl);
+  Decl *D = static_cast<Decl *>(AnonDecl);
+  NamedDecl *ND = dyn_cast<NamedDecl>(D);
+  if (!ND)
+    return CIndexer::createCXString("");
 
   if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
     return CIndexer::createCXString(OMD->getSelector().getAsString().c_str(),
@@ -871,6 +874,7 @@
   case CXCursor_ObjCClassMethodDecl: return "ObjCClassMethodDecl";
   case CXCursor_ObjCImplementationDecl: return "ObjCImplementationDecl";
   case CXCursor_ObjCCategoryImplDecl: return "ObjCCategoryImplDecl";
+  case CXCursor_UnexposedDecl: return "UnexposedDecl";
   case CXCursor_ObjCSuperClassRef: return "ObjCSuperClassRef";
   case CXCursor_ObjCProtocolRef: return "ObjCProtocolRef";
   case CXCursor_ObjCClassRef: return "ObjCClassRef";