forked from OSchip/llvm-project
Move ObjCProtocolDecl::EndLoc into its DefinitionData, and give
ObjCProtocolDecl proper source-range information. llvm-svn: 147420
This commit is contained in:
parent
05a1f4d60b
commit
1bd9617671
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue