From: Douglas Gregor Date: Sat, 16 Jan 2010 15:44:18 +0000 (+0000) Subject: Use a sane encoding for CXCursor_ObjCProtocolRef, using the actual X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78db0cdd49ec24034a5b2a4210fcda03a0919a81;p=clang Use a sane encoding for CXCursor_ObjCProtocolRef, using the actual source locations where the protocols were referenced rather than the location of some random enclosing declaration. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93637 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Index/c-index-api-fn-scan.m b/test/Index/c-index-api-fn-scan.m index 8cbc036a5c..3db836ffae 100644 --- a/test/Index/c-index-api-fn-scan.m +++ b/test/Index/c-index-api-fn-scan.m @@ -116,10 +116,10 @@ int main (int argc, const char * argv[]) { // CHECK: :86:2: TypedefDecl=id:0:0 [Context:id] // CHECK: :86:3: TypedefDecl=id:0:0 [Context:id] // CHECK: c-index-api-fn-scan.m:86:5: VarDecl=c:86:12 [Context:c] -// CHECK: c-index-api-fn-scan.m:86:6: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-fn-scan.m:86:7: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-fn-scan.m:86:8: ObjCProtocolRef=SubP:86:12 [Context:SubP] -// CHECK: c-index-api-fn-scan.m:86:9: ObjCProtocolRef=SubP:86:12 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:6: ObjCProtocolRef=SubP:44:1 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:7: ObjCProtocolRef=SubP:44:1 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:8: ObjCProtocolRef=SubP:44:1 [Context:SubP] +// CHECK: c-index-api-fn-scan.m:86:9: ObjCProtocolRef=SubP:44:1 [Context:SubP] // CHECK: c-index-api-fn-scan.m:86:10: VarDecl=c:86:12 [Context:c] // CHECK: c-index-api-fn-scan.m:86:12: VarDecl=c:86:12 [Context:c] // CHECK: c-index-api-fn-scan.m:86:13: VarDecl=c:86:12 [Context:c] @@ -138,11 +138,11 @@ int main (int argc, const char * argv[]) { // CHECK: :87:2: TypedefDecl=id:0:0 [Context:id] // CHECK: :87:3: TypedefDecl=id:0:0 [Context:id] // CHECK: c-index-api-fn-scan.m:87:5: VarDecl=d:87:13 [Context:d] -// CHECK: c-index-api-fn-scan.m:87:6: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-fn-scan.m:87:7: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-fn-scan.m:87:8: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-fn-scan.m:87:9: ObjCProtocolRef=Proto:87:13 [Context:Proto] -// CHECK: c-index-api-fn-scan.m:87:10: ObjCProtocolRef=Proto:87:13 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:6: ObjCProtocolRef=Proto:40:1 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:7: ObjCProtocolRef=Proto:40:1 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:8: ObjCProtocolRef=Proto:40:1 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:9: ObjCProtocolRef=Proto:40:1 [Context:Proto] +// CHECK: c-index-api-fn-scan.m:87:10: ObjCProtocolRef=Proto:40:1 [Context:Proto] // CHECK: c-index-api-fn-scan.m:87:11: VarDecl=d:87:13 [Context:d] // CHECK: c-index-api-fn-scan.m:87:13: VarDecl=d:87:13 [Context:d] // CHECK: c-index-api-fn-scan.m:88:2: VarRef=d:87:13 [Context:main] diff --git a/test/Index/c-index-api-loadTU-test.m b/test/Index/c-index-api-loadTU-test.m index a851b0ba0f..1b2dcf4e33 100644 --- a/test/Index/c-index-api-loadTU-test.m +++ b/test/Index/c-index-api-loadTU-test.m @@ -65,11 +65,11 @@ int main (int argc, const char * argv[]) { // CHECK: c-index-api-loadTU-test.m:24:1: ObjCProtocolDecl=Proto:24:1 [Context=c-index-api-loadTU-test.m] [Extent=24:1:26:4] // CHECK: c-index-api-loadTU-test.m:25:1: ObjCInstanceMethodDecl=pMethod:25:1 [Context=Proto] [Extent=25:1:25:10] // CHECK: c-index-api-loadTU-test.m:28:1: ObjCProtocolDecl=SubP:28:1 [Context=c-index-api-loadTU-test.m] [Extent=28:1:30:4] -// CHECK: c-index-api-loadTU-test.m:24:1: ObjCProtocolRef=Proto:24:1 [Context=SubP] [Extent=24:1:26:4] +// CHECK: c-index-api-loadTU-test.m:28:17: ObjCProtocolRef=Proto:24:1 [Context=SubP] [Extent=24:1:26:4] // CHECK: c-index-api-loadTU-test.m:29:1: ObjCInstanceMethodDecl=spMethod:29:1 [Context=SubP] [Extent=29:1:29:11] // CHECK: c-index-api-loadTU-test.m:32:12: ObjCInterfaceDecl=Baz:32:1 [Context=c-index-api-loadTU-test.m] [Extent=32:1:39:4] // CHECK: c-index-api-loadTU-test.m:32:18: ObjCSuperClassRef=Bar:13:1 [Context=Baz] [Extent=13:1:17:4] -// CHECK: c-index-api-loadTU-test.m:28:1: ObjCProtocolRef=SubP:28:1 [Context=Baz] [Extent=28:1:30:4] +// CHECK: c-index-api-loadTU-test.m:32:23: ObjCProtocolRef=SubP:28:1 [Context=Baz] [Extent=28:1:30:4] // CHECK: c-index-api-loadTU-test.m:34:9: ObjCIvarDecl=_anIVar:34:9 [Context=Baz] [Extent=34:9:34:15] // CHECK: c-index-api-loadTU-test.m:37:1: ObjCInstanceMethodDecl=bazMethod:37:1 [Context=Baz] [Extent=37:1:37:20] // CHECK: c-index-api-loadTU-test.m:41:1: EnumDecl=:41:1 [Context=c-index-api-loadTU-test.m] [Extent=41:1:43:1] diff --git a/test/Index/c-index-getCursor-test.m b/test/Index/c-index-getCursor-test.m index 0567506f23..10f905fa3f 100644 --- a/test/Index/c-index-getCursor-test.m +++ b/test/Index/c-index-getCursor-test.m @@ -120,7 +120,7 @@ int main (int argc, const char * argv[]) { // CHECK: {start_line=47 start_col=2 end_line=47 end_col=3} TypedefDecl=id:0:0 // CHECK: {start_line=47 start_col=4 end_line=47 end_col=4} FunctionDefn=main:44:5 // CHECK: {start_line=47 start_col=5 end_line=47 end_col=5} VarDecl=c:47:12 -// CHECK: {start_line=47 start_col=6 end_line=47 end_col=9} ObjCProtocolRef=SubP:47:12 +// CHECK: {start_line=47 start_col=6 end_line=47 end_col=9} ObjCProtocolRef=SubP:27:1 // CHECK: {start_line=47 start_col=10 end_line=47 end_col=10} VarDecl=c:47:12 // CHECK: {start_line=47 start_col=11 end_line=47 end_col=11} FunctionDefn=main:44:5 // CHECK: {start_line=47 start_col=12 end_line=47 end_col=15} VarDecl=c:47:12 @@ -129,7 +129,7 @@ int main (int argc, const char * argv[]) { // CHECK: {start_line=48 start_col=2 end_line=48 end_col=3} TypedefDecl=id:0:0 // CHECK: {start_line=48 start_col=4 end_line=48 end_col=4} FunctionDefn=main:44:5 // CHECK: {start_line=48 start_col=5 end_line=48 end_col=5} VarDecl=d:48:13 -// CHECK: {start_line=48 start_col=6 end_line=48 end_col=10} ObjCProtocolRef=Proto:48:13 +// CHECK: {start_line=48 start_col=6 end_line=48 end_col=10} ObjCProtocolRef=Proto:23:1 // CHECK: {start_line=48 start_col=11 end_line=48 end_col=11} VarDecl=d:48:13 // CHECK: {start_line=48 start_col=12 end_line=48 end_col=12} FunctionDefn=main:44:5 // CHECK: {start_line=48 start_col=13 end_line=48 end_col=13} VarDecl=d:48:13 diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index e58a08a0d6..c08243e79c 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -262,7 +262,10 @@ void CDeclVisitor::VisitFunctionDecl(FunctionDecl *ND) { void CDeclVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) { // Issue callbacks for the containing class. Call(CXCursor_ObjCClassRef, ND); - // FIXME: Issue callbacks for protocol refs. + ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin(); + for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(), + E = ND->protocol_end(); I != E; ++I, ++PL) + Callback(CDecl, MakeCursorObjCProtocolRef(*I, *PL), CData); VisitDeclContext(dyn_cast(ND)); } @@ -282,9 +285,10 @@ void CDeclVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { D->getSuperClassLoc()), CData); - for (ObjCProtocolDecl::protocol_iterator I = D->protocol_begin(), - E = D->protocol_end(); I != E; ++I) - Call(CXCursor_ObjCProtocolRef, *I); + ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(); + for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(), + E = D->protocol_end(); I != E; ++I, ++PL) + Callback(CDecl, MakeCursorObjCProtocolRef(*I, *PL), CData); VisitDeclContext(dyn_cast(D)); } @@ -307,9 +311,10 @@ void CDeclVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *ND) { } void CDeclVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) { + ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin(); for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), - E = PID->protocol_end(); I != E; ++I) - Call(CXCursor_ObjCProtocolRef, *I); + E = PID->protocol_end(); I != E; ++I, ++PL) + Callback(CDecl, MakeCursorObjCProtocolRef(*I, *PL), CData); VisitDeclContext(dyn_cast(PID)); } @@ -346,12 +351,8 @@ static SourceLocation getLocationFromCursor(CXCursor C, } case CXCursor_ObjCSuperClassRef: return getCursorObjCSuperClassRef(C).second; - - case CXCursor_ObjCProtocolRef: { - ObjCProtocolDecl *OID = dyn_cast(ND); - assert(OID && "clang_getCursorLine(): Missing protocol decl"); - return OID->getLocation(); - } + case CXCursor_ObjCProtocolRef: + return getCursorObjCProtocolRef(C).second; case CXCursor_ObjCSelectorRef: { ObjCMessageExpr *OME = dyn_cast(getCursorStmt(C)); assert(OME && "clang_getCursorLine(): Missing message expr"); @@ -776,7 +777,7 @@ CXString clang_getCursorSpelling(CXCursor C) { ->getNameStart()); } case CXCursor_ObjCProtocolRef: { - ObjCProtocolDecl *OID = dyn_cast(ND); + ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first; assert(OID && "clang_getCursorLine(): Missing protocol decl"); return CIndexer::createCXString(OID->getIdentifier()->getNameStart()); } @@ -884,10 +885,8 @@ CXCursor clang_getCursor(CXTranslationUnit CTUnit, const char *source_name, CXCursor C = { CXCursor_ObjCClassRef, { Dcl, ALoc.getParentDecl(), 0 }}; return C; } - if (isa(Dcl)) { - CXCursor C = {CXCursor_ObjCProtocolRef, {Dcl, ALoc.getParentDecl(), 0}}; - return C; - } + if (ObjCProtocolDecl *Proto = dyn_cast(Dcl)) + return MakeCursorObjCProtocolRef(Proto, ALoc.AsNamedRef().Loc); } return MakeCXCursor(Dcl); } @@ -933,8 +932,7 @@ CXDecl clang_getCursorDecl(CXCursor C) { if (clang_isReference(C.kind)) { if (getCursorStmt(C)) { - if (C.kind == CXCursor_ObjCClassRef || - C.kind == CXCursor_ObjCProtocolRef) + if (C.kind == CXCursor_ObjCClassRef) return getCursorStmt(C); else return getDeclFromExpr(getCursorStmt(C)); diff --git a/tools/CIndex/CXCursor.cpp b/tools/CIndex/CXCursor.cpp index d6c38673e0..01d809a8db 100644 --- a/tools/CIndex/CXCursor.cpp +++ b/tools/CIndex/CXCursor.cpp @@ -90,6 +90,21 @@ cxcursor::getCursorObjCSuperClassRef(CXCursor C) { reinterpret_cast(C.data[1]))); } +CXCursor cxcursor::MakeCursorObjCProtocolRef(ObjCProtocolDecl *Super, + SourceLocation Loc) { + void *RawLoc = reinterpret_cast(Loc.getRawEncoding()); + CXCursor C = { CXCursor_ObjCProtocolRef, { Super, RawLoc, 0 } }; + return C; +} + +std::pair +cxcursor::getCursorObjCProtocolRef(CXCursor C) { + assert(C.kind == CXCursor_ObjCProtocolRef); + return std::make_pair(static_cast(C.data[0]), + SourceLocation::getFromRawEncoding( + reinterpret_cast(C.data[1]))); +} + Decl *cxcursor::getCursorDecl(CXCursor Cursor) { return (Decl *)Cursor.data[0]; } @@ -99,7 +114,8 @@ Expr *cxcursor::getCursorExpr(CXCursor Cursor) { } Stmt *cxcursor::getCursorStmt(CXCursor Cursor) { - if (Cursor.kind == CXCursor_ObjCSuperClassRef) + if (Cursor.kind == CXCursor_ObjCSuperClassRef || + Cursor.kind == CXCursor_ObjCProtocolRef) return 0; return (Stmt *)Cursor.data[1]; diff --git a/tools/CIndex/CXCursor.h b/tools/CIndex/CXCursor.h index c2f8de3356..26bbc7d59c 100644 --- a/tools/CIndex/CXCursor.h +++ b/tools/CIndex/CXCursor.h @@ -24,6 +24,7 @@ class Decl; class Expr; class NamedDecl; class ObjCInterfaceDecl; +class ObjCProtocolDecl; class Stmt; namespace cxcursor { @@ -39,7 +40,15 @@ CXCursor MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super, /// \brief Unpack an ObjCSuperClassRef cursor into the interface it references /// and optionally the location where the reference occurred. std::pair -getCursorObjCSuperClassRef(CXCursor C); + getCursorObjCSuperClassRef(CXCursor C); + +/// \brief Create an Objective-C protocol reference at the given location. +CXCursor MakeCursorObjCProtocolRef(ObjCProtocolDecl *Proto, SourceLocation Loc); + +/// \brief Unpack an ObjCProtocolRef cursor into the protocol it references +/// and optionally the location where the reference occurred. +std::pair + getCursorObjCProtocolRef(CXCursor C); Decl *getCursorDecl(CXCursor Cursor); Expr *getCursorExpr(CXCursor Cursor);