/* Cursors represent declarations, definitions, and references. */
enum CXCursorKind {
- CXCursor_Invalid = 0,
-
/* Declarations */
CXCursor_FirstDecl = 1,
CXCursor_TypedefDecl = 2,
CXCursor_ObjCMessageRef = 42,
CXCursor_ObjCSelectorRef = 43,
CXCursor_ObjCClassRef = 44,
- CXCursor_LastRef = 44
+ CXCursor_LastRef = 44,
+
+ /* Error conditions */
+ CXCursor_FirstInvalid = 70,
+ CXCursor_InvalidFile = 70,
+ CXCursor_NoDeclFound = 71,
+ CXCursor_NotImplemented = 72,
+ CXCursor_LastInvalid = 72
};
/* A cursor into the CXTranslationUnit. */
unsigned clang_isDeclaration(enum CXCursorKind);
unsigned clang_isReference(enum CXCursorKind);
unsigned clang_isDefinition(enum CXCursorKind);
+unsigned clang_isInvalid(enum CXCursorKind);
unsigned clang_getCursorLine(CXCursor);
unsigned clang_getCursorColumn(CXCursor);
//
// CXDecl Operations.
//
-CXCursor clang_getCursorFromDecl(CXDecl)
-{
- return CXCursor();
-}
CXEntity clang_getEntityFromDecl(CXDecl)
{
return 0;
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>";
}
}
}
default: break;
}
- return CXCursor_Invalid;
+ return CXCursor_NotImplemented;
}
//
// CXCursor Operations.
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");
+ 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(Dcl), Dcl };
+ 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;
_clang_isDeclaration
_clang_isReference
_clang_isDefinition
+_clang_isInvalid
_clang_getCursorSpelling
_clang_getCursorKindSpelling
_clang_getTranslationUnitSpelling
#include <string.h>
static void PrintCursor(CXCursor Cursor) {
- printf("%s => %s ", clang_getCursorKindSpelling(Cursor.kind),
- clang_getCursorSpelling(Cursor));
+ if (clang_isInvalid(Cursor.kind))
+ printf("Invalid Cursor => %s\n", clang_getCursorKindSpelling(Cursor.kind));
+ else
+ printf("%s => %s ", clang_getCursorKindSpelling(Cursor.kind),
+ clang_getCursorSpelling(Cursor));
}
static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData Filter)
/* methodSignature - returns a cursor of type ObjCInstanceMethodDecl */
C = clang_getCursor(TU, "/System/Library/Frameworks/Foundation.framework/Headers/NSInvocation.h", 22, 1);
PrintCursor(C);
+ C = clang_getCursor(TU, "Large.m", 5, 18);
+ PrintCursor(C);
} else if (argc == 3) {
- enum CXCursorKind K = CXCursor_Invalid;
+ enum CXCursorKind K = CXCursor_NotImplemented;
if (!strcmp(argv[2], "all")) {
clang_loadTranslationUnit(TU, TranslationUnitVisitor, 0);