- clang_getCursor(): Replace asserts with error codes (CXCursor_InvalidFile, CXCursor_NoDeclFound).
- Add predicate clang_isInvalid().
- Implement clang_getCursorFromDecl().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81908 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp
index de9c0a3..1efb50f 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/tools/CIndex/CIndex.cpp
@@ -265,10 +265,6 @@
//
// CXDecl Operations.
//
-CXCursor clang_getCursorFromDecl(CXDecl)
-{
- return CXCursor();
-}
CXEntity clang_getEntityFromDecl(CXDecl)
{
return 0;
@@ -347,6 +343,9 @@
case CXCursor_ObjCSuperClassRef: return "ObjCSuperClassRef";
case CXCursor_ObjCProtocolRef: return "ObjCProtocolRef";
case CXCursor_ObjCClassRef: return "ObjCClassRef";
+ case CXCursor_InvalidFile: return "InvalidFile";
+ case CXCursor_NoDeclFound: return "NoDeclFound";
+ case CXCursor_NotImplemented: return "NotImplemented";
default: return "<not implemented>";
}
}
@@ -370,7 +369,7 @@
}
default: break;
}
- return CXCursor_Invalid;
+ return CXCursor_NotImplemented;
}
//
// CXCursor Operations.
@@ -383,21 +382,39 @@
FileManager &FMgr = CXXUnit->getFileManager();
const FileEntry *File = FMgr.getFile(source_name,
- source_name+strlen(source_name));
- assert(File && "clang_getCursor(): FileManager returned 0");
-
+ source_name+strlen(source_name));
+ if (!File) {
+ CXCursor C = { CXCursor_InvalidFile, 0 };
+ return C;
+ }
SourceLocation SLoc =
CXXUnit->getSourceManager().getLocation(File, line, column);
ASTLocation ALoc = ResolveLocationInAST(CXXUnit->getASTContext(), SLoc);
Decl *Dcl = ALoc.getDecl();
- assert(Dcl && "clang_getCursor(): ASTLocation has a null decl");
-
- CXCursor C = { TranslateKind(Dcl), Dcl };
+ if (Dcl) {
+ CXCursor C = { TranslateKind(Dcl), Dcl };
+ return C;
+ }
+ CXCursor C = { CXCursor_NoDeclFound, 0 };
return C;
}
+CXCursor clang_getCursorFromDecl(CXDecl AnonDecl)
+{
+ assert(AnonDecl && "Passed null CXDecl");
+ NamedDecl *ND = static_cast<NamedDecl *>(AnonDecl);
+
+ CXCursor C = { TranslateKind(ND), ND };
+ return C;
+}
+
+unsigned clang_isInvalid(enum CXCursorKind K)
+{
+ return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
+}
+
unsigned clang_isDeclaration(enum CXCursorKind K)
{
return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl;