From: Steve Naroff Date: Fri, 11 Apr 2008 19:35:35 +0000 (+0000) Subject: Add class and super class location info to ObjCInterfaceDecl... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d6a07aaf62b40cdfbd96f6b874d02b06fc22d015;p=clang Add class and super class location info to ObjCInterfaceDecl... git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49553 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 0efdd2e60d..f286e2f87d 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -235,12 +235,15 @@ class ObjCInterfaceDecl : public NamedDecl, public DeclContext { bool ForwardDecl:1; // declared with @class. bool InternalInterface:1; // true - no @interface for @implementation + SourceLocation ClassLoc; // location of the class identifier. + SourceLocation SuperClassLoc; // location of the super class identifier. SourceLocation EndLoc; // marks the '>', '}', or identifier. SourceLocation AtEndLoc; // marks the end of the entire interface. ObjCInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos, - IdentifierInfo *Id, bool FD, bool isInternal) + IdentifierInfo *Id, SourceLocation CLoc, + bool FD, bool isInternal) : NamedDecl(ObjCInterface, atLoc, Id), DeclContext(ObjCInterface), TypeForDecl(0), SuperClass(0), ReferencedProtocols(0), NumReferencedProtocols(0), Ivars(0), @@ -248,14 +251,17 @@ class ObjCInterfaceDecl : public NamedDecl, public DeclContext { InstanceMethods(0), NumInstanceMethods(0), ClassMethods(0), NumClassMethods(0), CategoryList(0), PropertyDecl(0), NumPropertyDecl(0), - ForwardDecl(FD), InternalInterface(isInternal) { + ForwardDecl(FD), InternalInterface(isInternal), + ClassLoc(CLoc) { AllocIntfRefProtocols(numRefProtos); } public: static ObjCInterfaceDecl *Create(ASTContext &C, SourceLocation atLoc, - unsigned numRefProtos, IdentifierInfo *Id, + unsigned numRefProtos, + IdentifierInfo *Id, + SourceLocation ClassLoc = SourceLocation(), bool ForwardDecl = false, bool isInternal = false); @@ -363,6 +369,10 @@ public: SourceLocation getLocEnd() const { return EndLoc; } void setLocEnd(SourceLocation LE) { EndLoc = LE; }; + SourceLocation getClassLoc() const { return ClassLoc; } + void setSuperClassLoc(SourceLocation Loc) { SuperClassLoc = Loc; } + SourceLocation getSuperClassLoc() const { return SuperClassLoc; } + // We also need to record the @end location. SourceLocation getAtEndLoc() const { return AtEndLoc; } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 8126485c4f..0b73ca5b57 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -37,11 +37,12 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, SourceLocation atLoc, unsigned numRefProtos, - IdentifierInfo *Id, + IdentifierInfo *Id, + SourceLocation ClassLoc, bool ForwardDecl, bool isInternal){ void *Mem = C.getAllocator().Allocate(); return new (Mem) ObjCInterfaceDecl(atLoc, numRefProtos, - Id, ForwardDecl, + Id, ClassLoc, ForwardDecl, isInternal); } diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index a0d4ff7995..92858726b4 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -112,7 +112,8 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) // Synthesize "@class Protocol; ObjCInterfaceDecl *ProtocolDecl = ObjCInterfaceDecl::Create(Context, SourceLocation(), 0, - &Context.Idents.get("Protocol"), true); + &Context.Idents.get("Protocol"), + SourceLocation(), true); Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl)); // Synthesize "typedef struct objc_object { Class isa; } *id;" diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 127645044c..776a50f6f2 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -98,7 +98,7 @@ Sema::DeclTy *Sema::ActOnStartClassInterface( } else { IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, NumProtocols, - ClassName); + ClassName, ClassLoc); ObjCInterfaceDecls[ClassName] = IDecl; // Remember that this needs to be removed when the scope is popped. @@ -126,6 +126,7 @@ Sema::DeclTy *Sema::ActOnStartClassInterface( } } IDecl->setSuperClass(SuperClassEntry); + IDecl->setSuperClassLoc(SuperLoc); IDecl->setLocEnd(SuperLoc); } else { // we have a root class. IDecl->setLocEnd(ClassLoc); @@ -383,7 +384,7 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation( // Legacy case of @implementation with no corresponding @interface. // Build, chain & install the interface decl into the identifier. IDecl = ObjCInterfaceDecl::Create(Context, AtClassImplLoc, 0, ClassName, - false, true); + ClassLoc, false, true); ObjCInterfaceDecls[ClassName] = IDecl; IDecl->setSuperClass(SDecl); IDecl->setLocEnd(ClassLoc); @@ -591,7 +592,7 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, ObjCInterfaceDecl *IDecl = dyn_cast_or_null(PrevDecl); if (!IDecl) { // Not already seen? Make a forward decl. IDecl = ObjCInterfaceDecl::Create(Context, AtClassLoc, 0, IdentList[i], - true); + SourceLocation(), true); ObjCInterfaceDecls[IdentList[i]] = IDecl; // Remember that this needs to be removed when the scope is popped.