// \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;
/// \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 {
/// Check then save referenced protocols.
PDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs,
ProtoLocs, Context);
- PDecl->setLocEnd(EndProtoLoc);
+ PDecl->setEndOfDefinitionLoc(EndProtoLoc);
}
CheckObjCDeclScope(PDecl);
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.
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) {
void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
VisitRedeclarable(D);
VisitObjCContainerDecl(D);
- Writer.AddSourceLocation(D->getLocEnd(), Record);
ObjCProtocolDecl *Def = D->getDefinition();
Writer.AddDeclRef(Def, Record);
PLEnd = D->protocol_loc_end();
PL != PLEnd; ++PL)
Writer.AddSourceLocation(*PL, Record);
+ Writer.AddSourceLocation(D->getEndOfDefinitionLoc(), Record);
}
Code = serialization::DECL_OBJC_PROTOCOL;