diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index f340a65dfbc0..feb57b817746 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -1283,17 +1283,22 @@ class ObjCCategoryImplDecl : public ObjCImplDecl { // Category name IdentifierInfo *Id; + // Category name location + SourceLocation CategoryNameLoc; + ObjCCategoryImplDecl(DeclContext *DC, IdentifierInfo *Id, ObjCInterfaceDecl *classInterface, - SourceLocation nameLoc, SourceLocation atStartLoc) + SourceLocation nameLoc, SourceLocation atStartLoc, + SourceLocation CategoryNameLoc) : ObjCImplDecl(ObjCCategoryImpl, DC, classInterface, nameLoc, atStartLoc), - Id(Id) {} + Id(Id), CategoryNameLoc(CategoryNameLoc) {} public: static ObjCCategoryImplDecl *Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, ObjCInterfaceDecl *classInterface, SourceLocation nameLoc, - SourceLocation atStartLoc); + SourceLocation atStartLoc, + SourceLocation CategoryNameLoc); /// getIdentifier - Get the identifier that names the category /// interface associated with this implementation. @@ -1310,6 +1315,8 @@ public: ObjCCategoryDecl *getCategoryDecl() const; + SourceLocation getCategoryNameLoc() const { return CategoryNameLoc; } + /// getName - Get the name of identifier for the class interface associated /// with this implementation as a StringRef. // @@ -1338,6 +1345,9 @@ public: static bool classof(const Decl *D) { return classofKind(D->getKind()); } static bool classof(const ObjCCategoryImplDecl *D) { return true; } static bool classofKind(Kind K) { return K == ObjCCategoryImpl;} + + friend class ASTDeclReader; + friend class ASTDeclWriter; }; raw_ostream &operator<<(raw_ostream &OS, diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 981cc5ebd9ef..c71603167710 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -3303,11 +3303,13 @@ Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { if (!DC) return 0; + SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc()); ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, Importer.Import(D->getIdentifier()), Category->getClassInterface(), Importer.Import(D->getLocation()), - Importer.Import(D->getAtStartLoc())); + Importer.Import(D->getAtStartLoc()), + CategoryNameLoc); DeclContext *LexicalDC = DC; if (D->getDeclContext() != D->getLexicalDeclContext()) { diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index d4e32a3b5f28..2157762e7fdb 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -1039,9 +1039,10 @@ ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, ObjCInterfaceDecl *ClassInterface, SourceLocation nameLoc, - SourceLocation atStartLoc) { + SourceLocation atStartLoc, + SourceLocation CategoryNameLoc) { return new (C) ObjCCategoryImplDecl(DC, Id, ClassInterface, - nameLoc, atStartLoc); + nameLoc, atStartLoc, CategoryNameLoc); } ObjCCategoryDecl *ObjCCategoryImplDecl::getCategoryDecl() const { diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index b271ae66a10d..0fd3b25defea 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -831,7 +831,7 @@ Decl *Sema::ActOnStartCategoryImplementation( ObjCCategoryImplDecl *CDecl = ObjCCategoryImplDecl::Create(Context, CurContext, CatName, IDecl, - ClassLoc, AtCatImplLoc); + ClassLoc, AtCatImplLoc, CatLoc); /// Check that class of this category is already completely declared. if (!IDecl) { Diag(ClassLoc, diag::err_undef_interface) << ClassName; diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index e9833c394c90..0641b855019f 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -700,6 +700,7 @@ void ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) { void ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { VisitObjCImplDecl(D); D->setIdentifier(Reader.GetIdentifierInfo(F, Record, Idx)); + D->CategoryNameLoc = ReadSourceLocation(Record, Idx); } void ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { @@ -1725,7 +1726,7 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { break; case DECL_OBJC_CATEGORY_IMPL: D = ObjCCategoryImplDecl::Create(Context, 0, 0, 0, SourceLocation(), - SourceLocation()); + SourceLocation(), SourceLocation()); break; case DECL_OBJC_IMPLEMENTATION: D = ObjCImplementationDecl::Create(Context, 0, 0, 0, SourceLocation(), diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index afb7ca9f9f04..070ff8058cb0 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -593,6 +593,7 @@ void ASTDeclWriter::VisitObjCImplDecl(ObjCImplDecl *D) { void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { VisitObjCImplDecl(D); Writer.AddIdentifierRef(D->getIdentifier(), Record); + Writer.AddSourceLocation(D->getCategoryNameLoc(), Record); Code = serialization::DECL_OBJC_CATEGORY_IMPL; } diff --git a/clang/tools/libclang/IndexingContext.cpp b/clang/tools/libclang/IndexingContext.cpp index 0b18167e8068..b95d22d010a1 100644 --- a/clang/tools/libclang/IndexingContext.cpp +++ b/clang/tools/libclang/IndexingContext.cpp @@ -393,7 +393,7 @@ bool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { StrAdapter SA(*this); const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface(); SourceLocation ClassLoc = D->getLocation(); - SourceLocation CategoryLoc = ClassLoc; //FIXME: D->getCategoryNameLoc(); + SourceLocation CategoryLoc = D->getCategoryNameLoc(); getEntityInfo(IFaceD, ClassEntity, SA); CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;