From 375bb1413c041055262c8a416f20d10474a5eda9 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 27 Dec 2011 22:43:10 +0000 Subject: [PATCH] Eliminate ObjCClassDecl, which is redundant now that ObjCInterfaceDecl covers both declarations (@class) and definitions (@interface) of an Objective-C class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147299 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 33 ---------- include/clang/AST/RecursiveASTVisitor.h | 4 -- .../Analysis/Visitors/CFGRecStmtDeclVisitor.h | 1 - include/clang/Basic/DeclNodes.td | 1 - include/clang/Serialization/ASTBitCodes.h | 2 - lib/AST/ASTImporter.cpp | 30 --------- lib/AST/DeclBase.cpp | 6 -- lib/AST/DeclObjC.cpp | 22 ------- lib/AST/DeclPrinter.cpp | 5 -- lib/AST/DumpXML.cpp | 5 -- lib/CodeGen/CGDecl.cpp | 1 - lib/CodeGen/CodeGenModule.cpp | 1 - lib/Frontend/ASTUnit.cpp | 5 -- lib/Rewrite/RewriteObjC.cpp | 63 +++++++++---------- lib/Sema/CodeCompleteConsumer.cpp | 10 ++- lib/Sema/SemaCodeComplete.cpp | 19 +++--- lib/Sema/SemaDeclObjC.cpp | 15 +---- lib/Sema/SemaLookup.cpp | 6 -- lib/Serialization/ASTReaderDecl.cpp | 10 --- lib/Serialization/ASTWriter.cpp | 1 - lib/Serialization/ASTWriterDecl.cpp | 8 --- test/Index/TestClassDecl.m | 2 +- test/Index/TestClassForwardDecl.m | 2 +- test/Index/annotate-tokens.m | 4 +- test/Index/file-refs.m | 1 + test/Index/properties-class-extensions.m | 2 +- tools/libclang/CIndex.cpp | 38 +++-------- tools/libclang/CIndexUSRs.cpp | 7 --- tools/libclang/CursorVisitor.h | 1 - tools/libclang/IndexDecl.cpp | 15 ++--- tools/libclang/IndexingContext.cpp | 30 +++++---- tools/libclang/IndexingContext.h | 2 - 32 files changed, 81 insertions(+), 271 deletions(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 34fd4d71e7..789b75558d 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -1145,39 +1145,6 @@ public: 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: /// diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 2bc85a569e..0c19351d88 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -1162,10 +1162,6 @@ DEF_TRAVERSE_DECL(ClassScopeFunctionSpecializationDecl, { DEF_TRAVERSE_DECL(LinkageSpecDecl, { }) -DEF_TRAVERSE_DECL(ObjCClassDecl, { - // FIXME: implement this - }) - DEF_TRAVERSE_DECL(ObjCForwardProtocolDecl, { // FIXME: implement this }) diff --git a/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h b/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h index 5c5ec2d7af..b9c8b04e28 100644 --- a/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h +++ b/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h @@ -83,7 +83,6 @@ public: DEFAULT_DISPATCH(Record) DEFAULT_DISPATCH(Enum) DEFAULT_DISPATCH(ObjCInterface) - DEFAULT_DISPATCH(ObjCClass) DEFAULT_DISPATCH(ObjCMethod) DEFAULT_DISPATCH(ObjCProtocol) DEFAULT_DISPATCH(ObjCCategory) diff --git a/include/clang/Basic/DeclNodes.td b/include/clang/Basic/DeclNodes.td index 37c6a8b15a..fbe4831f6b 100644 --- a/include/clang/Basic/DeclNodes.td +++ b/include/clang/Basic/DeclNodes.td @@ -67,7 +67,6 @@ def Named : Decl<1>; def LinkageSpec : Decl, DeclContext; def ObjCPropertyImpl : Decl; def ObjCForwardProtocol : Decl; -def ObjCClass : Decl; def FileScopeAsm : Decl; def AccessSpec : Decl; def Friend : Decl; diff --git a/include/clang/Serialization/ASTBitCodes.h b/include/clang/Serialization/ASTBitCodes.h index 073ad80d74..7fd550f992 100644 --- a/include/clang/Serialization/ASTBitCodes.h +++ b/include/clang/Serialization/ASTBitCodes.h @@ -814,8 +814,6 @@ namespace clang { 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. diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index a95c941e02..67045059cf 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -128,7 +128,6 @@ namespace clang { 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 @@ ASTNodeImporter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 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( - 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 diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 024f370c56..983673fec8 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -495,7 +495,6 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { case LinkageSpec: case FileScopeAsm: case StaticAssert: - case ObjCClass: case ObjCPropertyImpl: case ObjCForwardProtocol: case Block: @@ -1062,11 +1061,6 @@ void DeclContext::buildLookup(DeclContext *DCtx) { if (D->getDeclContext() == DCtx) makeDeclVisibleInContextImpl(ND, false); - // Insert any forward-declared Objective-C interface into the lookup - // data structure. - if (ObjCClassDecl *Class = dyn_cast(*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(*D)) diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index a204e45bac..75100ecb3c 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -1010,28 +1010,6 @@ void ObjCProtocolDecl::completedForwardDecl() { L->CompletedObjCForwardRef(this); } -//===----------------------------------------------------------------------===// -// 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 //===----------------------------------------------------------------------===// diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp index 03a69a0418..9b72bb416a 100644 --- a/lib/AST/DeclPrinter.cpp +++ b/lib/AST/DeclPrinter.cpp @@ -70,7 +70,6 @@ namespace { 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 @@ void DeclPrinter::VisitClassTemplateDecl(ClassTemplateDecl *D) { // Objective-C declarations //---------------------------------------------------------------------------- -void DeclPrinter::VisitObjCClassDecl(ObjCClassDecl *D) { - Out << "@class " << *D->getForwardInterfaceDecl(); -} - void DeclPrinter::VisitObjCMethodDecl(ObjCMethodDecl *OMD) { if (OMD->isInstanceMethod()) Out << "- "; diff --git a/lib/AST/DumpXML.cpp b/lib/AST/DumpXML.cpp index e0ea612dc2..959bbcbb17 100644 --- a/lib/AST/DumpXML.cpp +++ b/lib/AST/DumpXML.cpp @@ -740,11 +740,6 @@ struct XMLDumper : public XMLDeclVisitor, visitDeclContext(D); } - // ObjCClassDecl - void visitObjCClassDeclChildren(ObjCClassDecl *D) { - visitDeclRef(D->getForwardInterfaceDecl()); - } - // ObjCInterfaceDecl void visitCategoryList(ObjCCategoryDecl *D) { if (!D) return; diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index ff85fc5688..e8f00e7dde 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -65,7 +65,6 @@ void CodeGenFunction::EmitDecl(const Decl &D) { case Decl::AccessSpec: case Decl::LinkageSpec: case Decl::ObjCPropertyImpl: - case Decl::ObjCClass: case Decl::ObjCForwardProtocol: case Decl::FileScopeAsm: case Decl::Friend: diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 16d01efb93..12c4dff39c 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -2375,7 +2375,6 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) { // Objective-C Decls // Forward declarations, no (immediate) code generation. - case Decl::ObjCClass: case Decl::ObjCForwardProtocol: case Decl::ObjCInterface: break; diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 10ec6be37b..241a2c3296 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -837,11 +837,6 @@ void AddTopLevelDeclarationToHash(Decl *D, unsigned &Hash) { AddTopLevelDeclarationToHash(*P, Hash); return; } - - if (ObjCClassDecl *Class = dyn_cast(D)) { - AddTopLevelDeclarationToHash(Class->getForwardInterfaceDecl(), Hash); - return; - } } class TopLevelDeclTrackerConsumer : public ASTConsumer { diff --git a/lib/Rewrite/RewriteObjC.cpp b/lib/Rewrite/RewriteObjC.cpp index 57acba3de0..4b41e5a445 100644 --- a/lib/Rewrite/RewriteObjC.cpp +++ b/lib/Rewrite/RewriteObjC.cpp @@ -165,10 +165,13 @@ namespace { // Top Level Driver code. virtual bool HandleTopLevelDecl(DeclGroupRef D) { for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) { - if (isa((*I))) { - RewriteForwardClassDecl(D); - break; + if (ObjCInterfaceDecl *Class = dyn_cast(*I)) { + if (!Class->isThisDeclarationADefinition()) { + RewriteForwardClassDecl(D); + break; + } } + HandleTopLevelSingleDecl(*I); } return true; @@ -256,7 +259,7 @@ namespace { void RewriteInclude(); void RewriteForwardClassDecl(DeclGroupRef D); void RewriteForwardClassDecl(const llvm::SmallVector &DG); - void RewriteForwardClassEpilogue(ObjCClassDecl *ClassDecl, + void RewriteForwardClassEpilogue(ObjCInterfaceDecl *ClassDecl, const std::string &typedefString); void RewriteImplementations(); void RewritePropertyImplDecl(ObjCPropertyImplDecl *PID, @@ -668,27 +671,23 @@ void RewriteObjC::HandleTopLevelSingleDecl(Decl *D) { for (DeclContext::decl_iterator DI = LSD->decls_begin(), DIEnd = LSD->decls_end(); DI != DIEnd; ) { - if (isa((*DI))) { - SmallVector DG; - Decl *D = (*DI); - SourceLocation Loc = D->getLocation(); - while (DI != DIEnd && - isa(D) && D->getLocation() == Loc) { - ObjCClassDecl *Class = cast(D); - DG.push_back(D); - ++DI; - D = (*DI); - - // Following the ObjCClassDecl, we should have the corresponding - // ObjCInterfaceDecl. Skip over it. - if (DI != DIEnd && isa(D) && - Class->getForwardInterfaceDecl() == D) { + if (ObjCInterfaceDecl *IFace = dyn_cast((*DI))) { + if (!IFace->isThisDeclarationADefinition()) { + SmallVector DG; + SourceLocation StartLoc = IFace->getLocStart(); + do { + if (isa(*DI) && + !cast(*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 @@ static void RewriteOneForwardClassDecl(ObjCInterfaceDecl *ForwardDecl, 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::RewriteForwardClassEpilogue(ObjCClassDecl *ClassDecl, void RewriteObjC::RewriteForwardClassDecl(DeclGroupRef D) { std::string typedefString; for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) { - ObjCClassDecl *ClassDecl = cast(*I); - ObjCInterfaceDecl *ForwardDecl = ClassDecl->getForwardInterfaceDecl(); + ObjCInterfaceDecl *ForwardDecl = cast(*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 @@ void RewriteObjC::RewriteForwardClassDecl(DeclGroupRef D) { RewriteOneForwardClassDecl(ForwardDecl, typedefString); } DeclGroupRef::iterator I = D.begin(); - RewriteForwardClassEpilogue(cast(*I), typedefString); + RewriteForwardClassEpilogue(cast(*I), typedefString); } void RewriteObjC::RewriteForwardClassDecl( const llvm::SmallVector &D) { std::string typedefString; for (unsigned i = 0; i < D.size(); i++) { - ObjCClassDecl *ClassDecl = cast(D[i]); - ObjCInterfaceDecl *ForwardDecl = ClassDecl->getForwardInterfaceDecl(); + ObjCInterfaceDecl *ForwardDecl = cast(D[i]); if (i == 0) { typedefString += "// @class "; typedefString += ForwardDecl->getNameAsString(); @@ -914,7 +911,7 @@ void RewriteObjC::RewriteForwardClassDecl( } RewriteOneForwardClassDecl(ForwardDecl, typedefString); } - RewriteForwardClassEpilogue(cast(D[0]), typedefString); + RewriteForwardClassEpilogue(cast(D[0]), typedefString); } void RewriteObjC::RewriteMethodDeclaration(ObjCMethodDecl *Method) { @@ -4990,10 +4987,6 @@ void RewriteObjC::HandleDeclInMainFile(Decl *D) { RewriteRecordBody(RD); break; } - case Decl::ObjCClass: { - llvm_unreachable("RewriteObjC::HandleDeclInMainFile - ObjCClassDecl"); - break; - } default: break; } diff --git a/lib/Sema/CodeCompleteConsumer.cpp b/lib/Sema/CodeCompleteConsumer.cpp index da9860361b..17e02c7473 100644 --- a/lib/Sema/CodeCompleteConsumer.cpp +++ b/lib/Sema/CodeCompleteConsumer.cpp @@ -424,8 +424,14 @@ void CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) { 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(Declaration)) + CursorKind = CXCursor_ObjCInterfaceDecl; + else + CursorKind = CXCursor_NotImplemented; + } break; case RK_Macro: diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 79985e8b32..72cc37ccdd 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -2781,14 +2781,20 @@ CXCursorKind clang::getCursorKindForDecl(Decl *D) { 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(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(D)->isInstanceMethod() @@ -5490,15 +5496,6 @@ static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 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(*D)) { - ObjCInterfaceDecl *IDecl = Forward->getForwardInterfaceDecl(); - if ((!OnlyForwardDeclarations || !IDecl->hasDefinition()) && - (!OnlyUnimplemented || !IDecl->getImplementation())) - Results.AddResult(Result(IDecl, 0), CurContext, - 0, false); - } } } diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index c86f735d57..168ccfc3f5 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1775,21 +1775,12 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, = dyn_cast_or_null(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); diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index a5fc682d18..389abd5ec7 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -2776,12 +2776,6 @@ static void LookupVisibleDecls(DeclContext *Ctx, LookupResult &Result, Visited.add(ND); } } - } else if (ObjCClassDecl *Class = dyn_cast(*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. diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 3819191e0c..476f8b5c02 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -279,7 +279,6 @@ namespace clang { 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 @@ void ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) { VisitFieldDecl(FD); } -void ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) { - VisitDecl(CD); - CD->Interface = ReadDeclAs(Record, Idx); - CD->InterfaceLoc = ReadSourceLocation(Record, Idx); -} - void ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { VisitDecl(FPD); unsigned NumProtoRefs = Record[Idx++]; @@ -1944,9 +1937,6 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { 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; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index feeb27f338..1302d538f5 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -865,7 +865,6 @@ void ASTWriter::WriteBlockInfoBlock() { 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); diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index 7ae601810b..0692c023e4 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/lib/Serialization/ASTWriterDecl.cpp @@ -114,7 +114,6 @@ namespace clang { 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 @@ void ASTDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) { 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()); diff --git a/test/Index/TestClassDecl.m b/test/Index/TestClassDecl.m index bc4f2afb73..2abc39d78c 100644 --- a/test/Index/TestClassDecl.m +++ b/test/Index/TestClassDecl.m @@ -16,7 +16,7 @@ void function(Foo * arg) } // 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 diff --git a/test/Index/TestClassForwardDecl.m b/test/Index/TestClassForwardDecl.m index d3d720c2ba..b37f5ff937 100644 --- a/test/Index/TestClassForwardDecl.m +++ b/test/Index/TestClassForwardDecl.m @@ -13,7 +13,7 @@ void function(Foo * arg) } // 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) diff --git a/test/Index/annotate-tokens.m b/test/Index/annotate-tokens.m index 34115d6d54..9eb87be133 100644 --- a/test/Index/annotate-tokens.m +++ b/test/Index/annotate-tokens.m @@ -452,8 +452,8 @@ static Rdar8595462_A * Rdar8595462_staticVar; // 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 diff --git a/test/Index/file-refs.m b/test/Index/file-refs.m index 2267259d58..3f9d33687a 100644 --- a/test/Index/file-refs.m +++ b/test/Index/file-refs.m @@ -43,6 +43,7 @@ void test2(Sub *s, id p) { // 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] diff --git a/test/Index/properties-class-extensions.m b/test/Index/properties-class-extensions.m index 7b1e90fcd6..96706d2aeb 100644 --- a/test/Index/properties-class-extensions.m +++ b/test/Index/properties-class-extensions.m @@ -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] diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 525c5fc0f5..33feadfdf1 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -297,12 +297,6 @@ void CursorVisitor::visitDeclsFromFileRegion(FileID File, CurDC = dyn_cast(D); - // We handle forward decls via ObjCClassDecl. - if (ObjCInterfaceDecl *InterD = dyn_cast(D)) { - if (!InterD->isThisDeclarationADefinition()) - continue; - } - if (TagDecl *TD = dyn_cast(D)) if (!TD->isFreeStanding()) continue; @@ -1004,6 +998,11 @@ bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) { } 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 @@ bool CursorVisitor::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 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 @@ CXCursor clang_getCursorReferenced(CXCursor C) { return clang_getNullCursor(); if (UsingDecl *Using = dyn_cast(D)) return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); - if (ObjCClassDecl *Classes = dyn_cast(D)) - return MakeCursorOverloadedDeclRef(Classes, D->getLocation(), tu); if (ObjCForwardProtocolDecl *Protocols = dyn_cast(D)) return MakeCursorOverloadedDeclRef(Protocols, D->getLocation(), tu); @@ -4140,19 +4130,20 @@ CXCursor clang_getCursorDefinition(CXCursor C) { 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(D); if (WasReference) { - if (ObjCInterfaceDecl *Def = cast(D)->getDefinition()) + if (ObjCInterfaceDecl *Def = IFace->getDefinition()) return MakeCXCursor(Def, TU); - } else if (ObjCImplementationDecl *Impl - = cast(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 @@ CXCursor clang_getCursorDefinition(CXCursor C) { return MakeCursorOverloadedDeclRef(cast(D), D->getLocation(), TU); - case Decl::ObjCClass: - return MakeCursorOverloadedDeclRef(cast(D), D->getLocation(), - TU); - case Decl::Friend: if (NamedDecl *Friend = cast(D)->getFriendDecl()) return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); @@ -4230,8 +4217,6 @@ unsigned clang_getNumOverloadedDecls(CXCursor C) { Decl *D = Storage.get(); if (UsingDecl *Using = dyn_cast(D)) return Using->shadow_size(); - if (isa(D)) - return 1; if (ObjCForwardProtocolDecl *Protocols =dyn_cast(D)) return Protocols->protocol_size(); @@ -4261,8 +4246,6 @@ CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) { std::advance(Pos, index); return MakeCXCursor(cast(*Pos)->getTargetDecl(), TU); } - if (ObjCClassDecl *Classes = dyn_cast(D)) - return MakeCXCursor(Classes->getForwardInterfaceDecl(), TU); if (ObjCForwardProtocolDecl *Protocols = dyn_cast(D)) return MakeCXCursor(Protocols->protocol_begin()[index], TU); @@ -5191,7 +5174,6 @@ static CXLanguageKind getDeclLanguage(const Decl *D) { case Decl::ObjCAtDefsField: case Decl::ObjCCategory: case Decl::ObjCCategoryImpl: - case Decl::ObjCClass: case Decl::ObjCCompatibleAlias: case Decl::ObjCForwardProtocol: case Decl::ObjCImplementation: diff --git a/tools/libclang/CIndexUSRs.cpp b/tools/libclang/CIndexUSRs.cpp index 40d4fb1c69..1b57ef23ad 100644 --- a/tools/libclang/CIndexUSRs.cpp +++ b/tools/libclang/CIndexUSRs.cpp @@ -75,7 +75,6 @@ public: 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 @@ void USRGenerator::VisitObjCMethodDecl(ObjCMethodDecl *D) { 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. diff --git a/tools/libclang/CursorVisitor.h b/tools/libclang/CursorVisitor.h index ec08655154..184d36f180 100644 --- a/tools/libclang/CursorVisitor.h +++ b/tools/libclang/CursorVisitor.h @@ -216,7 +216,6 @@ public: 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); diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index 96a21d8486..38868138cf 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -77,11 +77,6 @@ public: 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 @@ public: } 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; } diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index 11b2ed3c35..49dfa05cf1 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -335,24 +335,22 @@ bool IndexingContext::handleTypedefName(const TypedefNameDecl *D) { 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 @@ bool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { } ObjCProtocolList EmptyProtoList; - ObjCProtocolListInfo ProtInfo(D->hasDefinition()? D->getReferencedProtocols() - : EmptyProtoList, + ObjCProtocolListInfo ProtInfo(D->hasDefinition() ? D->getReferencedProtocols() + : EmptyProtoList, *this, SA); ObjCInterfaceDeclInfo InterInfo(D); diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index 206e322337..90801d9694 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -17,7 +17,6 @@ namespace clang { class FileEntry; class ObjCPropertyDecl; - class ObjCClassDecl; class ClassTemplateDecl; class FunctionTemplateDecl; class TypeAliasTemplateDecl; @@ -370,7 +369,6 @@ public: bool handleTypedefName(const TypedefNameDecl *D); - bool handleObjCClass(const ObjCClassDecl *D); bool handleObjCInterface(const ObjCInterfaceDecl *D); bool handleObjCImplementation(const ObjCImplementationDecl *D); -- 2.40.0