if (ND->isImplicit())
return;
- CXCursor C = { CK, ND, 0, 0 };
+ CXCursor C = { CK, { ND, 0, 0 } };
Callback(Root, C, CData);
}
if (ND->getPCHLevel() > MaxPCHLevel)
return;
- CXCursor C = { CK, ND, 0, 0 };
+ CXCursor C = { CK, { ND, 0, 0 } };
Callback(CDecl, C, CData);
}
public:
NamedDecl *ND) {
if (clang_isReference(C.kind)) {
- if (Decl *D = static_cast<Decl*>(C.referringDecl))
+ if (Decl *D = getCursorReferringDecl(C))
return D->getLocation();
switch (C.kind) {
case CXCursor_ObjCClassRef: {
if (isa<ObjCInterfaceDecl>(ND)) {
- // FIXME: This is a hack (storing the parent decl in the stmt slot).
- NamedDecl *parentDecl = static_cast<NamedDecl *>(C.stmt);
+ NamedDecl *parentDecl = getCursorInterfaceParent(C);
return parentDecl->getLocation();
}
ObjCCategoryDecl *OID = dyn_cast<ObjCCategoryDecl>(ND);
return OID->getLocation();
}
case CXCursor_ObjCSelectorRef: {
- ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(
- static_cast<Stmt *>(C.stmt));
+ ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(getCursorStmt(C));
assert(OME && "clang_getCursorLine(): Missing message expr");
return OME->getLeftLoc(); /* FIXME: should be a range */
}
case CXCursor_VarRef:
case CXCursor_FunctionRef:
case CXCursor_EnumConstantRef: {
- DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
- static_cast<Stmt *>(C.stmt));
+ DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(getCursorStmt(C));
assert(DRE && "clang_getCursorLine(): Missing decl ref expr");
return DRE->getLocation();
}
extern "C" {
CXString clang_getCursorSpelling(CXCursor C) {
- assert(C.decl && "CXCursor has null decl");
- NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
-
+ NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
+ assert(ND && "CXCursor has null decl");
if (clang_isReference(C.kind)) {
switch (C.kind) {
case CXCursor_ObjCSuperClassRef: {
return CIndexer::createCXString(OID->getIdentifier()->getNameStart());
}
case CXCursor_ObjCSelectorRef: {
- ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(
- static_cast<Stmt *>(C.stmt));
+ ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(getCursorStmt(C));
assert(OME && "clang_getCursorLine(): Missing message expr");
return CIndexer::createCXString(OME->getSelector().getAsString().c_str(),
true);
case CXCursor_VarRef:
case CXCursor_FunctionRef:
case CXCursor_EnumConstantRef: {
- DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
- static_cast<Stmt *>(C.stmt));
+ DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(getCursorStmt(C));
assert(DRE && "clang_getCursorLine(): Missing decl ref expr");
return CIndexer::createCXString(DRE->getDecl()->getIdentifier()
->getNameStart());
return CIndexer::createCXString("<not implemented>");
}
}
- return clang_getDeclSpelling(C.decl);
+ return clang_getDeclSpelling(getCursorDecl(C));
}
const char *clang_getCursorKindSpelling(enum CXCursorKind Kind) {
}
if (ALoc.isNamedRef()) {
if (isa<ObjCInterfaceDecl>(Dcl)) {
- CXCursor C = { CXCursor_ObjCClassRef, Dcl, ALoc.getParentDecl(), 0 };
+ CXCursor C = { CXCursor_ObjCClassRef, { Dcl, ALoc.getParentDecl(), 0 }};
return C;
}
if (isa<ObjCProtocolDecl>(Dcl)) {
- CXCursor C = { CXCursor_ObjCProtocolRef, Dcl, ALoc.getParentDecl(), 0 };
+ CXCursor C = {CXCursor_ObjCProtocolRef, {Dcl, ALoc.getParentDecl(), 0}};
return C;
}
}
}
unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
- return X.kind == Y.kind && X.decl == Y.decl && X.stmt == Y.stmt &&
- X.referringDecl == Y.referringDecl;
+ return X == Y;
}
CXCursor clang_getCursorFromDecl(CXDecl AnonDecl) {
CXDecl clang_getCursorDecl(CXCursor C) {
if (clang_isDeclaration(C.kind))
- return C.decl;
+ return getCursorDecl(C);
if (clang_isReference(C.kind)) {
- if (C.stmt) {
+ if (getCursorStmt(C)) {
if (C.kind == CXCursor_ObjCClassRef ||
C.kind == CXCursor_ObjCProtocolRef)
- return static_cast<Stmt *>(C.stmt);
+ return getCursorStmt(C);
else
- return getDeclFromExpr(static_cast<Stmt *>(C.stmt));
+ return getDeclFromExpr(getCursorStmt(C));
} else
- return C.decl;
+ return getCursorDecl(C);
}
return 0;
}
unsigned clang_getCursorLine(CXCursor C) {
- assert(C.decl && "CXCursor has null decl");
- NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+ assert(getCursorDecl(C) && "CXCursor has null decl");
+ NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
}
unsigned clang_getCursorColumn(CXCursor C) {
- assert(C.decl && "CXCursor has null decl");
- NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+ assert(getCursorDecl(C) && "CXCursor has null decl");
+ NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
}
const char *clang_getCursorSource(CXCursor C) {
- assert(C.decl && "CXCursor has null decl");
- NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+ assert(getCursorDecl(C) && "CXCursor has null decl");
+ NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
}
CXFile clang_getCursorSourceFile(CXCursor C) {
- assert(C.decl && "CXCursor has null decl");
- NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+ assert(getCursorDecl(C) && "CXCursor has null decl");
+ NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
return (void *)
unsigned *startColumn,
unsigned *endLine,
unsigned *endColumn) {
- assert(C.decl && "CXCursor has null decl");
- NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+ assert(getCursorDecl(C) && "CXCursor has null decl");
+ NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
#include "CXCursor.h"
#include "clang/AST/Decl.h"
+#include "clang/AST/DeclObjC.h"
+#include "clang/AST/Expr.h"
using namespace clang;
CXCursor cxcursor::MakeCXCursor(CXCursorKind K, Decl *D) {
- CXCursor C = { K, D, 0, 0 };
+ CXCursor C = { K, { D, 0, 0 } };
return C;
}
CXCursor cxcursor::MakeCXCursor(CXCursorKind K, Decl *D, Stmt *S) {
assert(clang_isReference(K));
- CXCursor C = { K, D, S, 0 };
+ CXCursor C = { K, { D, S, 0 } };
return C;
}
+Decl *cxcursor::getCursorDecl(CXCursor Cursor) {
+ return (Decl *)Cursor.data[0];
+}
+
+Expr *cxcursor::getCursorExpr(CXCursor Cursor) {
+ return dyn_cast_or_null<Expr>(getCursorStmt(Cursor));
+}
+
+Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
+ return (Stmt *)Cursor.data[1];
+}
+
+Decl *cxcursor::getCursorReferringDecl(CXCursor Cursor) {
+ return (Decl *)Cursor.data[2];
+}
+
+NamedDecl *cxcursor::getCursorInterfaceParent(CXCursor Cursor) {
+ assert(Cursor.kind == CXCursor_ObjCClassRef);
+ assert(isa<ObjCInterfaceDecl>(getCursorDecl(Cursor)));
+ // FIXME: This is a hack (storing the parent decl in the stmt slot).
+ return static_cast<NamedDecl *>(Cursor.data[1]);
+}
+
+bool cxcursor::operator==(CXCursor X, CXCursor Y) {
+ return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] &&
+ X.data[2] == Y.data[2];
+}
\ No newline at end of file
basename(clang_getCString(string)));
clang_disposeString(string);
- PrintDeclExtent(Cursor.decl);
+ PrintDeclExtent(Cursor.data[0]);
printf("\n");
- clang_loadDeclaration(Cursor.decl, DeclVisitor, 0);
+ clang_loadDeclaration(Cursor.data[0], DeclVisitor, 0);
}
}
printf("// %s: %s:%d:%d: ", FileCheckPrefix, GetCursorSource(Ref),
curLine, curColumn);
PrintCursor(Ref);
- string = clang_getDeclSpelling(Ref.decl);
+ string = clang_getDeclSpelling(Ref.data[0]);
printf(" [Context:%s]\n", clang_getCString(string));
clang_disposeString(string);
}
static void USRDeclVisitor(CXDecl D, CXCursor C, CXClientData Filter) {
if (!Filter || (C.kind == *(enum CXCursorKind *)Filter)) {
- CXString USR = clang_getDeclUSR(C.decl);
+ CXString USR = clang_getDeclUSR(C.data[0]);
if (!USR.Spelling) {
clang_disposeString(USR);
return;
}
printf("// %s: %s %s", FileCheckPrefix, GetCursorSource(C), USR.Spelling);
- PrintDeclExtent(C.decl);
+ PrintDeclExtent(C.data[0]);
printf("\n");
clang_disposeString(USR);
}
static void USRVisitor(CXTranslationUnit Unit, CXCursor Cursor,
CXClientData Filter) {
- if (Cursor.decl) {
+ if (Cursor.data[0]) {
/* USRDeclVisitor(Unit, Cursor.decl, Cursor, Filter);*/
- clang_loadDeclaration(Cursor.decl, USRDeclVisitor, 0);
+ clang_loadDeclaration(Cursor.data[0], USRDeclVisitor, 0);
}
}