Author: dgregor Date: Tue Dec 27 16:43:10 2011 New Revision: 147299 URL: http://llvm.org/viewvc/llvm-project?rev=147299&view=rev Log: Eliminate ObjCClassDecl, which is redundant now that ObjCInterfaceDecl covers both declarations (@class) and definitions (@interface) of an Objective-C class.
Modified: cfe/trunk/include/clang/AST/DeclObjC.h cfe/trunk/include/clang/AST/RecursiveASTVisitor.h cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h cfe/trunk/include/clang/Basic/DeclNodes.td cfe/trunk/include/clang/Serialization/ASTBitCodes.h cfe/trunk/lib/AST/ASTImporter.cpp cfe/trunk/lib/AST/DeclBase.cpp cfe/trunk/lib/AST/DeclObjC.cpp cfe/trunk/lib/AST/DeclPrinter.cpp cfe/trunk/lib/AST/DumpXML.cpp cfe/trunk/lib/CodeGen/CGDecl.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/Frontend/ASTUnit.cpp cfe/trunk/lib/Rewrite/RewriteObjC.cpp cfe/trunk/lib/Sema/CodeCompleteConsumer.cpp cfe/trunk/lib/Sema/SemaCodeComplete.cpp cfe/trunk/lib/Sema/SemaDeclObjC.cpp cfe/trunk/lib/Sema/SemaLookup.cpp cfe/trunk/lib/Serialization/ASTReaderDecl.cpp cfe/trunk/lib/Serialization/ASTWriter.cpp cfe/trunk/lib/Serialization/ASTWriterDecl.cpp cfe/trunk/test/Index/TestClassDecl.m cfe/trunk/test/Index/TestClassForwardDecl.m cfe/trunk/test/Index/annotate-tokens.m cfe/trunk/test/Index/file-refs.m cfe/trunk/test/Index/properties-class-extensions.m cfe/trunk/tools/libclang/CIndex.cpp cfe/trunk/tools/libclang/CIndexUSRs.cpp cfe/trunk/tools/libclang/CursorVisitor.h cfe/trunk/tools/libclang/IndexDecl.cpp cfe/trunk/tools/libclang/IndexingContext.cpp cfe/trunk/tools/libclang/IndexingContext.h Modified: cfe/trunk/include/clang/AST/DeclObjC.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/DeclObjC.h (original) +++ cfe/trunk/include/clang/AST/DeclObjC.h Tue Dec 27 16:43:10 2011 @@ -1145,39 +1145,6 @@ friend class ASTDeclWriter; }; -/// ObjCClassDecl - Specifies a list of forward class declarations. For example: -/// -/// @class NSCursor, NSImage, NSPasteboard, NSWindow; -/// -class ObjCClassDecl : public Decl { - ObjCInterfaceDecl *Interface; - SourceLocation InterfaceLoc; - - ObjCClassDecl(DeclContext *DC, SourceLocation L, - ObjCInterfaceDecl *Interface, SourceLocation InterfaceLoc); - - friend class ASTDeclReader; - friend class ASTDeclWriter; - -public: - static ObjCClassDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, - ObjCInterfaceDecl *Interface = 0, - SourceLocation InterfaceLoc = SourceLocation()); - - ObjCInterfaceDecl *getForwardInterfaceDecl() const { - return Interface; - } - - /// \brief Retrieve the location of the class name. - SourceLocation getNameLoc() const { return InterfaceLoc; } - - virtual SourceRange getSourceRange() const; - - static bool classof(const Decl *D) { return classofKind(D->getKind()); } - static bool classof(const ObjCClassDecl *D) { return true; } - static bool classofKind(Kind K) { return K == ObjCClass; } -}; - /// ObjCForwardProtocolDecl - Specifies a list of forward protocol declarations. /// For example: /// Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Tue Dec 27 16:43:10 2011 @@ -1162,10 +1162,6 @@ DEF_TRAVERSE_DECL(LinkageSpecDecl, { }) -DEF_TRAVERSE_DECL(ObjCClassDecl, { - // FIXME: implement this - }) - DEF_TRAVERSE_DECL(ObjCForwardProtocolDecl, { // FIXME: implement this }) Modified: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (original) +++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h Tue Dec 27 16:43:10 2011 @@ -83,7 +83,6 @@ DEFAULT_DISPATCH(Record) DEFAULT_DISPATCH(Enum) DEFAULT_DISPATCH(ObjCInterface) - DEFAULT_DISPATCH(ObjCClass) DEFAULT_DISPATCH(ObjCMethod) DEFAULT_DISPATCH(ObjCProtocol) DEFAULT_DISPATCH(ObjCCategory) Modified: cfe/trunk/include/clang/Basic/DeclNodes.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DeclNodes.td?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DeclNodes.td (original) +++ cfe/trunk/include/clang/Basic/DeclNodes.td Tue Dec 27 16:43:10 2011 @@ -67,7 +67,6 @@ def LinkageSpec : Decl, DeclContext; def ObjCPropertyImpl : Decl; def ObjCForwardProtocol : Decl; -def ObjCClass : Decl; def FileScopeAsm : Decl; def AccessSpec : Decl; def Friend : Decl; Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original) +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Tue Dec 27 16:43:10 2011 @@ -814,8 +814,6 @@ DECL_OBJC_IVAR, /// \brief A ObjCAtDefsFieldDecl record. DECL_OBJC_AT_DEFS_FIELD, - /// \brief A ObjCClassDecl record. - DECL_OBJC_CLASS, /// \brief A ObjCForwardProtocolDecl record. DECL_OBJC_FORWARD_PROTOCOL, /// \brief A ObjCCategoryDecl record. Modified: cfe/trunk/lib/AST/ASTImporter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTImporter.cpp (original) +++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Dec 27 16:43:10 2011 @@ -128,7 +128,6 @@ Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); Decl *VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); - Decl *VisitObjCClassDecl(ObjCClassDecl *D); Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); @@ -3605,35 +3604,6 @@ return ToForward; } -Decl *ASTNodeImporter::VisitObjCClassDecl(ObjCClassDecl *D) { - // Import the context of this declaration. - DeclContext *DC = Importer.ImportContext(D->getDeclContext()); - if (!DC) - return 0; - - DeclContext *LexicalDC = DC; - if (D->getDeclContext() != D->getLexicalDeclContext()) { - LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); - if (!LexicalDC) - return 0; - } - - // Import the location of this declaration. - SourceLocation Loc = Importer.Import(D->getLocation()); - ObjCInterfaceDecl *ToIface - = cast_or_null<ObjCInterfaceDecl>( - Importer.Import(D->getForwardInterfaceDecl())); - ObjCClassDecl *ToClass = ObjCClassDecl::Create(Importer.getToContext(), DC, - Loc, - ToIface, - Importer.Import(D->getNameLoc())); - - ToClass->setLexicalDeclContext(LexicalDC); - LexicalDC->addDeclInternal(ToClass); - Importer.Imported(D, ToClass); - return ToClass; -} - Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { // For template arguments, we adopt the translation unit as our declaration // context. This context will be fixed when the actual template declaration Modified: cfe/trunk/lib/AST/DeclBase.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclBase.cpp (original) +++ cfe/trunk/lib/AST/DeclBase.cpp Tue Dec 27 16:43:10 2011 @@ -495,7 +495,6 @@ case LinkageSpec: case FileScopeAsm: case StaticAssert: - case ObjCClass: case ObjCPropertyImpl: case ObjCForwardProtocol: case Block: @@ -1062,11 +1061,6 @@ if (D->getDeclContext() == DCtx) makeDeclVisibleInContextImpl(ND, false); - // Insert any forward-declared Objective-C interface into the lookup - // data structure. - if (ObjCClassDecl *Class = dyn_cast<ObjCClassDecl>(*D)) - makeDeclVisibleInContextImpl(Class->getForwardInterfaceDecl(), false); - // If this declaration is itself a transparent declaration context or // inline namespace, add its members (recursively). if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D)) Modified: cfe/trunk/lib/AST/DeclObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclObjC.cpp (original) +++ cfe/trunk/lib/AST/DeclObjC.cpp Tue Dec 27 16:43:10 2011 @@ -1011,28 +1011,6 @@ } //===----------------------------------------------------------------------===// -// ObjCClassDecl -//===----------------------------------------------------------------------===// - -ObjCClassDecl::ObjCClassDecl(DeclContext *DC, SourceLocation L, - ObjCInterfaceDecl *Interface, - SourceLocation InterfaceLoc) - : Decl(ObjCClass, DC, L), Interface(Interface), InterfaceLoc(InterfaceLoc) -{ -} - -ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC, - SourceLocation L, - ObjCInterfaceDecl *Interface, - SourceLocation InterfaceLoc) { - return new (C) ObjCClassDecl(DC, L, Interface, InterfaceLoc); -} - -SourceRange ObjCClassDecl::getSourceRange() const { - return SourceRange(getLocation(), InterfaceLoc); -} - -//===----------------------------------------------------------------------===// // ObjCForwardProtocolDecl //===----------------------------------------------------------------------===// Modified: cfe/trunk/lib/AST/DeclPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclPrinter.cpp (original) +++ cfe/trunk/lib/AST/DeclPrinter.cpp Tue Dec 27 16:43:10 2011 @@ -70,7 +70,6 @@ void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); void VisitClassTemplateDecl(ClassTemplateDecl *D); void VisitObjCMethodDecl(ObjCMethodDecl *D); - void VisitObjCClassDecl(ObjCClassDecl *D); void VisitObjCImplementationDecl(ObjCImplementationDecl *D); void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); @@ -847,10 +846,6 @@ // Objective-C declarations //---------------------------------------------------------------------------- -void DeclPrinter::VisitObjCClassDecl(ObjCClassDecl *D) { - Out << "@class " << *D->getForwardInterfaceDecl(); -} - void DeclPrinter::VisitObjCMethodDecl(ObjCMethodDecl *OMD) { if (OMD->isInstanceMethod()) Out << "- "; Modified: cfe/trunk/lib/AST/DumpXML.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DumpXML.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/AST/DumpXML.cpp (original) +++ cfe/trunk/lib/AST/DumpXML.cpp Tue Dec 27 16:43:10 2011 @@ -740,11 +740,6 @@ visitDeclContext(D); } - // ObjCClassDecl - void visitObjCClassDeclChildren(ObjCClassDecl *D) { - visitDeclRef(D->getForwardInterfaceDecl()); - } - // ObjCInterfaceDecl void visitCategoryList(ObjCCategoryDecl *D) { if (!D) return; Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Tue Dec 27 16:43:10 2011 @@ -65,7 +65,6 @@ case Decl::AccessSpec: case Decl::LinkageSpec: case Decl::ObjCPropertyImpl: - case Decl::ObjCClass: case Decl::ObjCForwardProtocol: case Decl::FileScopeAsm: case Decl::Friend: Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Dec 27 16:43:10 2011 @@ -2375,7 +2375,6 @@ // Objective-C Decls // Forward declarations, no (immediate) code generation. - case Decl::ObjCClass: case Decl::ObjCForwardProtocol: case Decl::ObjCInterface: break; Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original) +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Tue Dec 27 16:43:10 2011 @@ -837,11 +837,6 @@ AddTopLevelDeclarationToHash(*P, Hash); return; } - - if (ObjCClassDecl *Class = dyn_cast<ObjCClassDecl>(D)) { - AddTopLevelDeclarationToHash(Class->getForwardInterfaceDecl(), Hash); - return; - } } class TopLevelDeclTrackerConsumer : public ASTConsumer { Modified: cfe/trunk/lib/Rewrite/RewriteObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteObjC.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Rewrite/RewriteObjC.cpp (original) +++ cfe/trunk/lib/Rewrite/RewriteObjC.cpp Tue Dec 27 16:43:10 2011 @@ -165,10 +165,13 @@ // Top Level Driver code. virtual bool HandleTopLevelDecl(DeclGroupRef D) { for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) { - if (isa<ObjCClassDecl>((*I))) { - RewriteForwardClassDecl(D); - break; + if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*I)) { + if (!Class->isThisDeclarationADefinition()) { + RewriteForwardClassDecl(D); + break; + } } + HandleTopLevelSingleDecl(*I); } return true; @@ -256,7 +259,7 @@ void RewriteInclude(); void RewriteForwardClassDecl(DeclGroupRef D); void RewriteForwardClassDecl(const llvm::SmallVector<Decl*, 8> &DG); - void RewriteForwardClassEpilogue(ObjCClassDecl *ClassDecl, + void RewriteForwardClassEpilogue(ObjCInterfaceDecl *ClassDecl, const std::string &typedefString); void RewriteImplementations(); void RewritePropertyImplDecl(ObjCPropertyImplDecl *PID, @@ -668,27 +671,23 @@ for (DeclContext::decl_iterator DI = LSD->decls_begin(), DIEnd = LSD->decls_end(); DI != DIEnd; ) { - if (isa<ObjCClassDecl>((*DI))) { - SmallVector<Decl *, 8> DG; - Decl *D = (*DI); - SourceLocation Loc = D->getLocation(); - while (DI != DIEnd && - isa<ObjCClassDecl>(D) && D->getLocation() == Loc) { - ObjCClassDecl *Class = cast<ObjCClassDecl>(D); - DG.push_back(D); - ++DI; - D = (*DI); - - // Following the ObjCClassDecl, we should have the corresponding - // ObjCInterfaceDecl. Skip over it. - if (DI != DIEnd && isa<ObjCInterfaceDecl>(D) && - Class->getForwardInterfaceDecl() == D) { + if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>((*DI))) { + if (!IFace->isThisDeclarationADefinition()) { + SmallVector<Decl *, 8> DG; + SourceLocation StartLoc = IFace->getLocStart(); + do { + if (isa<ObjCInterfaceDecl>(*DI) && + !cast<ObjCInterfaceDecl>(*DI)->isThisDeclarationADefinition() && + StartLoc == (*DI)->getLocStart()) + DG.push_back(*DI); + else + break; + ++DI; - D = (*DI); - } + } while (DI != DIEnd); + RewriteForwardClassDecl(DG); + continue; } - RewriteForwardClassDecl(DG); - continue; } HandleTopLevelSingleDecl(*DI); ++DI; @@ -873,9 +872,9 @@ typedefString += ";\n#endif\n"; } -void RewriteObjC::RewriteForwardClassEpilogue(ObjCClassDecl *ClassDecl, +void RewriteObjC::RewriteForwardClassEpilogue(ObjCInterfaceDecl *ClassDecl, const std::string &typedefString) { - SourceLocation startLoc = ClassDecl->getLocation(); + SourceLocation startLoc = ClassDecl->getLocStart(); const char *startBuf = SM->getCharacterData(startLoc); const char *semiPtr = strchr(startBuf, ';'); // Replace the @class with typedefs corresponding to the classes. @@ -885,8 +884,7 @@ void RewriteObjC::RewriteForwardClassDecl(DeclGroupRef D) { std::string typedefString; for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) { - ObjCClassDecl *ClassDecl = cast<ObjCClassDecl>(*I); - ObjCInterfaceDecl *ForwardDecl = ClassDecl->getForwardInterfaceDecl(); + ObjCInterfaceDecl *ForwardDecl = cast<ObjCInterfaceDecl>(*I); if (I == D.begin()) { // Translate to typedef's that forward reference structs with the same name // as the class. As a convenience, we include the original declaration @@ -898,15 +896,14 @@ RewriteOneForwardClassDecl(ForwardDecl, typedefString); } DeclGroupRef::iterator I = D.begin(); - RewriteForwardClassEpilogue(cast<ObjCClassDecl>(*I), typedefString); + RewriteForwardClassEpilogue(cast<ObjCInterfaceDecl>(*I), typedefString); } void RewriteObjC::RewriteForwardClassDecl( const llvm::SmallVector<Decl*, 8> &D) { std::string typedefString; for (unsigned i = 0; i < D.size(); i++) { - ObjCClassDecl *ClassDecl = cast<ObjCClassDecl>(D[i]); - ObjCInterfaceDecl *ForwardDecl = ClassDecl->getForwardInterfaceDecl(); + ObjCInterfaceDecl *ForwardDecl = cast<ObjCInterfaceDecl>(D[i]); if (i == 0) { typedefString += "// @class "; typedefString += ForwardDecl->getNameAsString(); @@ -914,7 +911,7 @@ } RewriteOneForwardClassDecl(ForwardDecl, typedefString); } - RewriteForwardClassEpilogue(cast<ObjCClassDecl>(D[0]), typedefString); + RewriteForwardClassEpilogue(cast<ObjCInterfaceDecl>(D[0]), typedefString); } void RewriteObjC::RewriteMethodDeclaration(ObjCMethodDecl *Method) { @@ -4990,10 +4987,6 @@ RewriteRecordBody(RD); break; } - case Decl::ObjCClass: { - llvm_unreachable("RewriteObjC::HandleDeclInMainFile - ObjCClassDecl"); - break; - } default: break; } Modified: cfe/trunk/lib/Sema/CodeCompleteConsumer.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/CodeCompleteConsumer.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Sema/CodeCompleteConsumer.cpp (original) +++ cfe/trunk/lib/Sema/CodeCompleteConsumer.cpp Tue Dec 27 16:43:10 2011 @@ -424,8 +424,14 @@ Availability = CXAvailability_NotAvailable; CursorKind = getCursorKindForDecl(Declaration); - if (CursorKind == CXCursor_UnexposedDecl) - CursorKind = CXCursor_NotImplemented; + if (CursorKind == CXCursor_UnexposedDecl) { + // FIXME: Forward declarations of Objective-C classes are not directly + // exposed, but we want code completion to treat them like an @interface. + if (isa<ObjCInterfaceDecl>(Declaration)) + CursorKind = CXCursor_ObjCInterfaceDecl; + else + CursorKind = CXCursor_NotImplemented; + } break; case RK_Macro: Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original) +++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Tue Dec 27 16:43:10 2011 @@ -2781,14 +2781,20 @@ return CXCursor_FunctionDecl; case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; - case Decl::ObjCClass: // FIXME return CXCursor_UnexposedDecl; case Decl::ObjCForwardProtocol: // FIXME return CXCursor_UnexposedDecl; case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; - case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; + + case Decl::ObjCInterface: + if (cast<ObjCInterfaceDecl>(D)->isThisDeclarationADefinition()) + return CXCursor_ObjCInterfaceDecl; + + // Forward declarations are not directly exposed. + return CXCursor_UnexposedDecl; + case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; case Decl::ObjCMethod: return cast<ObjCMethodDecl>(D)->isInstanceMethod() @@ -5490,15 +5496,6 @@ if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && (!OnlyUnimplemented || !Class->getImplementation())) Results.AddResult(Result(Class, 0), CurContext, 0, false); - - // Record any forward-declared interfaces we find. - if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { - ObjCInterfaceDecl *IDecl = Forward->getForwardInterfaceDecl(); - if ((!OnlyForwardDeclarations || !IDecl->hasDefinition()) && - (!OnlyUnimplemented || !IDecl->getImplementation())) - Results.AddResult(Result(IDecl, 0), CurContext, - 0, false); - } } } Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Tue Dec 27 16:43:10 2011 @@ -1775,21 +1775,12 @@ = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); ObjCInterfaceDecl *IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtClassLoc, - IdentList[i], PrevIDecl, IdentLocs[i], true); + IdentList[i], PrevIDecl, IdentLocs[i]); IDecl->setAtEndRange(IdentLocs[i]); - // Create the forward declaration. Note that we intentionally do this - // before we add the ObjCInterfaceDecl we just created, so that the - // rewriter sees the ObjCClassDecl first. - // FIXME: ObjCClassDecl should probably just go away. - ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, CurContext, AtClassLoc, - IDecl, IdentLocs[i]); - CurContext->addDecl(CDecl); - PushOnScopeChains(IDecl, TUScope); - - CheckObjCDeclScope(CDecl); - DeclsInGroup.push_back(CDecl); + CheckObjCDeclScope(IDecl); + DeclsInGroup.push_back(IDecl); } return BuildDeclaratorGroup(DeclsInGroup.data(), DeclsInGroup.size(), false); Modified: cfe/trunk/lib/Sema/SemaLookup.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaLookup.cpp (original) +++ cfe/trunk/lib/Sema/SemaLookup.cpp Tue Dec 27 16:43:10 2011 @@ -2776,12 +2776,6 @@ Visited.add(ND); } } - } else if (ObjCClassDecl *Class = dyn_cast<ObjCClassDecl>(*D)) { - ObjCInterfaceDecl *IFace = Class->getForwardInterfaceDecl(); - if (NamedDecl *ND = Result.getAcceptableDecl(IFace)) { - Consumer.FoundDecl(ND, Visited.checkHidden(ND), Ctx, InBaseClass); - Visited.add(ND); - } } // Visit transparent contexts and inline namespaces inside this context. Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Tue Dec 27 16:43:10 2011 @@ -279,7 +279,6 @@ void VisitObjCIvarDecl(ObjCIvarDecl *D); void VisitObjCProtocolDecl(ObjCProtocolDecl *D); void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D); - void VisitObjCClassDecl(ObjCClassDecl *D); void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); void VisitObjCCategoryDecl(ObjCCategoryDecl *D); void VisitObjCImplDecl(ObjCImplDecl *D); @@ -782,12 +781,6 @@ VisitFieldDecl(FD); } -void ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) { - VisitDecl(CD); - CD->Interface = ReadDeclAs<ObjCInterfaceDecl>(Record, Idx); - CD->InterfaceLoc = ReadSourceLocation(Record, Idx); -} - void ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { VisitDecl(FPD); unsigned NumProtoRefs = Record[Idx++]; @@ -1944,9 +1937,6 @@ D = ObjCAtDefsFieldDecl::Create(Context, 0, SourceLocation(), SourceLocation(), 0, QualType(), 0); break; - case DECL_OBJC_CLASS: - D = ObjCClassDecl::Create(Context, 0, SourceLocation()); - break; case DECL_OBJC_FORWARD_PROTOCOL: D = ObjCForwardProtocolDecl::Create(Context, 0, SourceLocation()); break; Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Tue Dec 27 16:43:10 2011 @@ -865,7 +865,6 @@ RECORD(DECL_OBJC_PROTOCOL); RECORD(DECL_OBJC_IVAR); RECORD(DECL_OBJC_AT_DEFS_FIELD); - RECORD(DECL_OBJC_CLASS); RECORD(DECL_OBJC_FORWARD_PROTOCOL); RECORD(DECL_OBJC_CATEGORY); RECORD(DECL_OBJC_CATEGORY_IMPL); Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Tue Dec 27 16:43:10 2011 @@ -114,7 +114,6 @@ void VisitObjCIvarDecl(ObjCIvarDecl *D); void VisitObjCProtocolDecl(ObjCProtocolDecl *D); void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D); - void VisitObjCClassDecl(ObjCClassDecl *D); void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); void VisitObjCCategoryDecl(ObjCCategoryDecl *D); void VisitObjCImplDecl(ObjCImplDecl *D); @@ -538,13 +537,6 @@ Code = serialization::DECL_OBJC_AT_DEFS_FIELD; } -void ASTDeclWriter::VisitObjCClassDecl(ObjCClassDecl *D) { - VisitDecl(D); - Writer.AddDeclRef(D->Interface, Record); - Writer.AddSourceLocation(D->InterfaceLoc, Record); - Code = serialization::DECL_OBJC_CLASS; -} - void ASTDeclWriter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { VisitDecl(D); Record.push_back(D->protocol_size()); Modified: cfe/trunk/test/Index/TestClassDecl.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/TestClassDecl.m?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/test/Index/TestClassDecl.m (original) +++ cfe/trunk/test/Index/TestClassDecl.m Tue Dec 27 16:43:10 2011 @@ -16,7 +16,7 @@ } // CHECK-scan: [1:1 - 8:1] Invalid Cursor => NoDeclFound -// CHECK-scan: [8:1 - 8:8] UnexposedDecl=[8:8] +// CHECK-scan: [8:1 - 8:8] UnexposedDecl=Foo:8:8 // CHECK-scan: [8:8 - 8:11] ObjCClassRef=Foo:10:12 // CHECK-scan: [8:11 - 10:1] Invalid Cursor => NoDeclFound // CHECK-scan: [10:1 - 11:5] ObjCInterfaceDecl=Foo:10:12 Modified: cfe/trunk/test/Index/TestClassForwardDecl.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/TestClassForwardDecl.m?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/test/Index/TestClassForwardDecl.m (original) +++ cfe/trunk/test/Index/TestClassForwardDecl.m Tue Dec 27 16:43:10 2011 @@ -13,7 +13,7 @@ } // CHECK-scan: [1:1 - 8:1] Invalid Cursor => NoDeclFound -// CHECK-scan: [8:1 - 8:8] UnexposedDecl=[8:8] +// CHECK-scan: [8:1 - 8:8] UnexposedDecl=Foo:8:8 // CHECK-scan: [8:8 - 8:11] ObjCClassRef=Foo:8:8 // CHECK-scan: [8:11 - 10:1] Invalid Cursor => NoDeclFound // CHECK-scan: [10:1 - 10:15] FunctionDecl=function:10:6 (Definition) Modified: cfe/trunk/test/Index/annotate-tokens.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-tokens.m?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/test/Index/annotate-tokens.m (original) +++ cfe/trunk/test/Index/annotate-tokens.m Tue Dec 27 16:43:10 2011 @@ -452,8 +452,8 @@ // CHECK: Punctuation: ")" [88:24 - 88:25] ObjCProtocolExpr=Proto:85:1 // CHECK: Punctuation: ";" [88:25 - 88:26] CompoundStmt= // CHECK: Punctuation: "}" [89:1 - 89:2] CompoundStmt= -// CHECK: Punctuation: "@" [93:1 - 93:2] UnexposedDecl=[93:8] -// CHECK: Keyword: "class" [93:2 - 93:7] UnexposedDecl=[93:8] +// CHECK: Punctuation: "@" [93:1 - 93:2] UnexposedDecl=Rdar8595462_A:93:8 +// CHECK: Keyword: "class" [93:2 - 93:7] UnexposedDecl=Rdar8595462_A:93:8 // CHECK: Identifier: "Rdar8595462_A" [93:8 - 93:21] ObjCClassRef=Rdar8595462_A:93:8 // CHECK: Punctuation: ";" [93:21 - 93:22] // CHECK: Punctuation: "@" [94:1 - 94:2] ObjCInterfaceDecl=Rdar8595462_B:94:12 Modified: cfe/trunk/test/Index/file-refs.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/file-refs.m?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/test/Index/file-refs.m (original) +++ cfe/trunk/test/Index/file-refs.m Tue Dec 27 16:43:10 2011 @@ -43,6 +43,7 @@ // RUN: -file-refs-at=%s:7:18 \ // CHECK: ObjCImplementationDecl=Foo:7:17 (Definition) +// CHECK-NEXT: UnexposedDecl=Foo:1:8 =[1:8 - 1:11] // CHECK-NEXT: ObjCClassRef=Foo:3:12 =[1:8 - 1:11] // CHECK-NEXT: ObjCInterfaceDecl=Foo:3:12 =[3:12 - 3:15] // CHECK-NEXT: ObjCImplementationDecl=Foo:7:17 (Definition) =[7:17 - 7:20] Modified: cfe/trunk/test/Index/properties-class-extensions.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/properties-class-extensions.m?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/test/Index/properties-class-extensions.m (original) +++ cfe/trunk/test/Index/properties-class-extensions.m Tue Dec 27 16:43:10 2011 @@ -70,7 +70,7 @@ // CHECK-NOT: properties-class-extensions.m:16:25: ObjCInstanceMethodDecl=bar:16:25 Extent=[16:25 - 16:28] // CHECK: properties-class-extensions.m:19:26: ObjCInstanceMethodDecl=setBar::19:26 Extent=[19:26 - 19:29] // CHECK: properties-class-extensions.m:19:26: ParmDecl=bar:19:26 (Definition) Extent=[19:26 - 19:29] -// CHECK: properties-class-extensions.m:24:1: UnexposedDecl=[24:8] Extent=[24:1 - 24:23] +// CHECK: properties-class-extensions.m:24:8: UnexposedDecl=Rdar8467189_Bar:24:8 // CHECK: properties-class-extensions.m:24:8: ObjCClassRef=Rdar8467189_Bar:24:8 Extent=[24:8 - 24:23] // CHECK: properties-class-extensions.m:25:11: ObjCProtocolDecl=Rdar8467189_FooProtocol:25:11 (Definition) Extent=[25:1 - 27:5] // CHECK: properties-class-extensions.m:26:39: ObjCPropertyDecl=Rdar8467189_Bar:26:39 Extent=[26:1 - 26:54] Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Tue Dec 27 16:43:10 2011 @@ -297,12 +297,6 @@ CurDC = dyn_cast<DeclContext>(D); - // We handle forward decls via ObjCClassDecl. - if (ObjCInterfaceDecl *InterD = dyn_cast<ObjCInterfaceDecl>(D)) { - if (!InterD->isThisDeclarationADefinition()) - continue; - } - if (TagDecl *TD = dyn_cast<TagDecl>(D)) if (!TD->isFreeStanding()) continue; @@ -1004,6 +998,11 @@ } bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { + if (!D->isThisDeclarationADefinition()) { + // Forward declaration is treated like a reference. + return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU)); + } + // Issue callbacks for super class. if (D->getSuperClass() && Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(), @@ -1058,13 +1057,6 @@ return false; } -bool CursorVisitor::VisitObjCClassDecl(ObjCClassDecl *D) { - if (Visit(MakeCursorObjCClassRef(D->getForwardInterfaceDecl(), - D->getNameLoc(), TU))) - return true; - return false; -} - bool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) { if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl()) return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU)); @@ -3890,8 +3882,6 @@ return clang_getNullCursor(); if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); - if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D)) - return MakeCursorOverloadedDeclRef(Classes, D->getLocation(), tu); if (ObjCForwardProtocolDecl *Protocols = dyn_cast<ObjCForwardProtocolDecl>(D)) return MakeCursorOverloadedDeclRef(Protocols, D->getLocation(), tu); @@ -4140,19 +4130,20 @@ return C; return clang_getNullCursor(); - case Decl::ObjCInterface: + case Decl::ObjCInterface: { // There are two notions of a "definition" for an Objective-C // class: the interface and its implementation. When we resolved a // reference to an Objective-C class, produce the @interface as // the definition; when we were provided with the interface, // produce the @implementation as the definition. + ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D); if (WasReference) { - if (ObjCInterfaceDecl *Def = cast<ObjCInterfaceDecl>(D)->getDefinition()) + if (ObjCInterfaceDecl *Def = IFace->getDefinition()) return MakeCXCursor(Def, TU); - } else if (ObjCImplementationDecl *Impl - = cast<ObjCInterfaceDecl>(D)->getImplementation()) + } else if (ObjCImplementationDecl *Impl = IFace->getImplementation()) return MakeCXCursor(Impl, TU); return clang_getNullCursor(); + } case Decl::ObjCProperty: // FIXME: We don't really know where to find the @@ -4171,10 +4162,6 @@ return MakeCursorOverloadedDeclRef(cast<ObjCForwardProtocolDecl>(D), D->getLocation(), TU); - case Decl::ObjCClass: - return MakeCursorOverloadedDeclRef(cast<ObjCClassDecl>(D), D->getLocation(), - TU); - case Decl::Friend: if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl()) return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); @@ -4230,8 +4217,6 @@ Decl *D = Storage.get<Decl*>(); if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) return Using->shadow_size(); - if (isa<ObjCClassDecl>(D)) - return 1; if (ObjCForwardProtocolDecl *Protocols =dyn_cast<ObjCForwardProtocolDecl>(D)) return Protocols->protocol_size(); @@ -4261,8 +4246,6 @@ std::advance(Pos, index); return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU); } - if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D)) - return MakeCXCursor(Classes->getForwardInterfaceDecl(), TU); if (ObjCForwardProtocolDecl *Protocols = dyn_cast<ObjCForwardProtocolDecl>(D)) return MakeCXCursor(Protocols->protocol_begin()[index], TU); @@ -5191,7 +5174,6 @@ case Decl::ObjCAtDefsField: case Decl::ObjCCategory: case Decl::ObjCCategoryImpl: - case Decl::ObjCClass: case Decl::ObjCCompatibleAlias: case Decl::ObjCForwardProtocol: case Decl::ObjCImplementation: Modified: cfe/trunk/tools/libclang/CIndexUSRs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexUSRs.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CIndexUSRs.cpp (original) +++ cfe/trunk/tools/libclang/CIndexUSRs.cpp Tue Dec 27 16:43:10 2011 @@ -75,7 +75,6 @@ void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); void VisitClassTemplateDecl(ClassTemplateDecl *D); - void VisitObjCClassDecl(ObjCClassDecl *CD); void VisitObjCContainerDecl(ObjCContainerDecl *CD); void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *P); void VisitObjCMethodDecl(ObjCMethodDecl *MD); @@ -310,12 +309,6 @@ N.printName(Out); } -void USRGenerator::VisitObjCClassDecl(ObjCClassDecl *D) { - // FIXME: @class declarations can refer to multiple classes. We need - // to be able to traverse these. - IgnoreResults = true; -} - void USRGenerator::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { // FIXME: @protocol declarations can refer to multiple protocols. We need // to be able to traverse these. Modified: cfe/trunk/tools/libclang/CursorVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CursorVisitor.h?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CursorVisitor.h (original) +++ cfe/trunk/tools/libclang/CursorVisitor.h Tue Dec 27 16:43:10 2011 @@ -216,7 +216,6 @@ bool VisitObjCImplementationDecl(ObjCImplementationDecl *D); // FIXME: ObjCCompatibleAliasDecl requires aliased-class locations. bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); - bool VisitObjCClassDecl(ObjCClassDecl *D); bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD); bool VisitLinkageSpecDecl(LinkageSpecDecl *D); bool VisitNamespaceDecl(NamespaceDecl *D); Modified: cfe/trunk/tools/libclang/IndexDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexDecl.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/tools/libclang/IndexDecl.cpp (original) +++ cfe/trunk/tools/libclang/IndexDecl.cpp Tue Dec 27 16:43:10 2011 @@ -77,11 +77,6 @@ return true; } - bool VisitObjCClassDecl(ObjCClassDecl *D) { - IndexCtx.handleObjCClass(D); - return true; - } - bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { ObjCForwardProtocolDecl::protocol_loc_iterator LI = D->protocol_loc_begin(); for (ObjCForwardProtocolDecl::protocol_iterator @@ -96,14 +91,12 @@ } bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { - // Forward decls are handled at VisitObjCClassDecl. - if (!D->isThisDeclarationADefinition()) - return true; - IndexCtx.handleObjCInterface(D); - IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.indexDeclContext(D); + if (D->isThisDeclarationADefinition()) { + IndexCtx.indexTUDeclsInObjCContainer(); + IndexCtx.indexDeclContext(D); + } return true; } Modified: cfe/trunk/tools/libclang/IndexingContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.cpp?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/tools/libclang/IndexingContext.cpp (original) +++ cfe/trunk/tools/libclang/IndexingContext.cpp Tue Dec 27 16:43:10 2011 @@ -335,24 +335,22 @@ return handleDecl(D, D->getLocation(), getCursor(D), DInfo); } -bool IndexingContext::handleObjCClass(const ObjCClassDecl *D) { - ObjCInterfaceDecl *IFaceD = D->getForwardInterfaceDecl(); - SourceLocation Loc = D->getNameLoc(); - bool isRedeclaration = IFaceD->getLocation() != Loc; - +bool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { // For @class forward declarations, suppress them the same way as references. - if (suppressRefs()) { - if (markEntityOccurrenceInFile(IFaceD, Loc)) + if (!D->isThisDeclarationADefinition()) { + if (suppressRefs() && markEntityOccurrenceInFile(D, D->getLocation())) return false; // already occurred. - } - ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration, - /*isImplementation=*/false); - return handleObjCContainer(IFaceD, Loc, - MakeCursorObjCClassRef(IFaceD, Loc, CXTU), ContDInfo); -} + // FIXME: This seems like the wrong definition for redeclaration. + bool isRedeclaration = D->hasDefinition() || D->getPreviousDeclaration(); + ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration, + /*isImplementation=*/false); + return handleObjCContainer(D, D->getLocation(), + MakeCursorObjCClassRef(D, D->getLocation(), + CXTU), + ContDInfo); + } -bool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { ScratchAlloc SA(*this); CXIdxBaseClassInfo BaseClass; @@ -370,8 +368,8 @@ } ObjCProtocolList EmptyProtoList; - ObjCProtocolListInfo ProtInfo(D->hasDefinition()? D->getReferencedProtocols() - : EmptyProtoList, + ObjCProtocolListInfo ProtInfo(D->hasDefinition() ? D->getReferencedProtocols() + : EmptyProtoList, *this, SA); ObjCInterfaceDeclInfo InterInfo(D); Modified: cfe/trunk/tools/libclang/IndexingContext.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.h?rev=147299&r1=147298&r2=147299&view=diff ============================================================================== --- cfe/trunk/tools/libclang/IndexingContext.h (original) +++ cfe/trunk/tools/libclang/IndexingContext.h Tue Dec 27 16:43:10 2011 @@ -17,7 +17,6 @@ namespace clang { class FileEntry; class ObjCPropertyDecl; - class ObjCClassDecl; class ClassTemplateDecl; class FunctionTemplateDecl; class TypeAliasTemplateDecl; @@ -370,7 +369,6 @@ bool handleTypedefName(const TypedefNameDecl *D); - bool handleObjCClass(const ObjCClassDecl *D); bool handleObjCInterface(const ObjCInterfaceDecl *D); bool handleObjCImplementation(const ObjCImplementationDecl *D); _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits