Move ObjCProtocolDecl::EndLoc into its DefinitionData, and give

ObjCProtocolDecl proper source-range information.

llvm-svn: 147420
This commit is contained in:
Douglas Gregor 2012-01-02 01:18:16 +00:00
parent 05a1f4d60b
commit 1bd9617671
4 changed files with 23 additions and 10 deletions

View File

@ -1071,14 +1071,15 @@ class ObjCProtocolDecl : public ObjCContainerDecl,
// \brief The declaration that defines this protocol.
ObjCProtocolDecl *Definition;
/// Referenced protocols
/// \brief Referenced protocols
ObjCProtocolList ReferencedProtocols;
/// \brief Marks the '>' or identifier.
SourceLocation EndLoc;
};
DefinitionData *Data;
SourceLocation EndLoc; // marks the '>' or identifier.
DefinitionData &data() const {
assert(Data && "Objective-C protocol has no definition!");
return *Data;
@ -1181,10 +1182,21 @@ public:
/// \brief Starts the definition of this Objective-C protocol.
void startDefinition();
// Location information, modeled after the Stmt API.
SourceLocation getLocStart() const { return getAtStartLoc(); } // '@'protocol
SourceLocation getLocEnd() const { return EndLoc; }
void setLocEnd(SourceLocation LE) { EndLoc = LE; }
virtual SourceRange getSourceRange() const {
if (isThisDeclarationADefinition())
return ObjCContainerDecl::getSourceRange();
return SourceRange(getAtStartLoc(), getLocation());
}
SourceLocation getEndOfDefinitionLoc() const {
if (!hasDefinition())
return getLocation();
return data().EndLoc;
}
void setEndOfDefinitionLoc(SourceLocation LE) { data().EndLoc = LE; }
typedef redeclarable_base::redecl_iterator redecl_iterator;
redecl_iterator redecls_begin() const {

View File

@ -615,7 +615,7 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc,
/// Check then save referenced protocols.
PDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs,
ProtoLocs, Context);
PDecl->setLocEnd(EndProtoLoc);
PDecl->setEndOfDefinitionLoc(EndProtoLoc);
}
CheckObjCDeclScope(PDecl);

View File

@ -764,7 +764,6 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
RedeclarableResult Redecl = VisitRedeclarable(PD);
VisitObjCContainerDecl(PD);
PD->setLocEnd(ReadSourceLocation(Record, Idx));
// Determine whether we need to merge this declaration with another @protocol
// with the same name.
@ -822,6 +821,8 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
Reader.getContext());
PD->setEndOfDefinitionLoc(ReadSourceLocation(Record, Idx));
// Note that we have deserialized a definition.
Reader.PendingDefinitions.insert(PD);
} else if (Def && Def->Data) {

View File

@ -518,7 +518,6 @@ void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
VisitRedeclarable(D);
VisitObjCContainerDecl(D);
Writer.AddSourceLocation(D->getLocEnd(), Record);
ObjCProtocolDecl *Def = D->getDefinition();
Writer.AddDeclRef(Def, Record);
@ -532,6 +531,7 @@ void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
PLEnd = D->protocol_loc_end();
PL != PLEnd; ++PL)
Writer.AddSourceLocation(*PL, Record);
Writer.AddSourceLocation(D->getEndOfDefinitionLoc(), Record);
}
Code = serialization::DECL_OBJC_PROTOCOL;