aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-02 01:18:16 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-02 01:18:16 +0000
commitec1a58b201b3276966aaade8ac3ac4705aba96c2 (patch)
tree50199a563624176c8e9acca64775190d220f654d
parentc9d3c7edb513e9b8a6ab65b04133653e71d7a72b (diff)
Move ObjCProtocolDecl::EndLoc into its DefinitionData, and give
ObjCProtocolDecl proper source-range information. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147420 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/DeclObjC.h26
-rw-r--r--lib/Sema/SemaDeclObjC.cpp2
-rw-r--r--lib/Serialization/ASTReaderDecl.cpp3
-rw-r--r--lib/Serialization/ASTWriterDecl.cpp2
4 files changed, 23 insertions, 10 deletions
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index 5f6bdec1cf..9d9b9b1d7d 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -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 {
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index e76971188f..9658174f97 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -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);
diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp
index 46dcc8757d..75a2aad5e4 100644
--- a/lib/Serialization/ASTReaderDecl.cpp
+++ b/lib/Serialization/ASTReaderDecl.cpp
@@ -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) {
diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp
index 4701b8fc38..8510feca5e 100644
--- a/lib/Serialization/ASTWriterDecl.cpp
+++ b/lib/Serialization/ASTWriterDecl.cpp
@@ -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;