Add class and super class location info to ObjCInterfaceDecl...
llvm-svn: 49553
This commit is contained in:
parent
988990f842
commit
5a4611cdda
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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<ObjCInterfaceDecl>();
|
||||
return new (Mem) ObjCInterfaceDecl(atLoc, numRefProtos,
|
||||
Id, ForwardDecl,
|
||||
Id, ClassLoc, ForwardDecl,
|
||||
isInternal);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;"
|
||||
|
|
|
@ -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<ObjCInterfaceDecl>(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.
|
||||
|
|
Loading…
Reference in New Issue