forked from OSchip/llvm-project
Implement PCH support for C++ namespaces.
llvm-svn: 96738
This commit is contained in:
parent
e96503faa1
commit
e31bbd904d
|
@ -267,8 +267,8 @@ public:
|
|||
}
|
||||
|
||||
void setAnonymousNamespace(NamespaceDecl *D) {
|
||||
assert(D->isAnonymousNamespace());
|
||||
assert(D->getParent() == this);
|
||||
assert(!D || D->isAnonymousNamespace());
|
||||
assert(!D || D->getParent() == this);
|
||||
AnonymousNamespace = D;
|
||||
}
|
||||
|
||||
|
|
|
@ -524,7 +524,9 @@ namespace clang {
|
|||
/// associates a declaration name with one or more declaration
|
||||
/// IDs. This data is used when performing qualified name lookup
|
||||
/// into a DeclContext via DeclContext::lookup.
|
||||
DECL_CONTEXT_VISIBLE
|
||||
DECL_CONTEXT_VISIBLE,
|
||||
/// \brief A NamespaceDecl record.
|
||||
DECL_NAMESPACE
|
||||
};
|
||||
|
||||
/// \brief Record codes for each kind of statement or expression.
|
||||
|
|
|
@ -39,6 +39,7 @@ namespace {
|
|||
void VisitDecl(Decl *D);
|
||||
void VisitTranslationUnitDecl(TranslationUnitDecl *TU);
|
||||
void VisitNamedDecl(NamedDecl *ND);
|
||||
void VisitNamespaceDecl(NamespaceDecl *D);
|
||||
void VisitTypeDecl(TypeDecl *TD);
|
||||
void VisitTypedefDecl(TypedefDecl *TD);
|
||||
void VisitTagDecl(TagDecl *TD);
|
||||
|
@ -96,6 +97,18 @@ void PCHDeclReader::VisitNamedDecl(NamedDecl *ND) {
|
|||
ND->setDeclName(Reader.ReadDeclarationName(Record, Idx));
|
||||
}
|
||||
|
||||
void PCHDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {
|
||||
VisitNamedDecl(D);
|
||||
D->setLBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
D->setRBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
D->setNextNamespace(
|
||||
cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
D->setOriginalNamespace(
|
||||
cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
D->setAnonymousNamespace(
|
||||
cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
}
|
||||
|
||||
void PCHDeclReader::VisitTypeDecl(TypeDecl *TD) {
|
||||
VisitNamedDecl(TD);
|
||||
TD->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
|
||||
|
@ -743,6 +756,10 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
|
|||
case pch::DECL_BLOCK:
|
||||
D = BlockDecl::Create(*Context, 0, SourceLocation());
|
||||
break;
|
||||
|
||||
case pch::DECL_NAMESPACE:
|
||||
D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0);
|
||||
break;
|
||||
}
|
||||
|
||||
assert(D && "Unknown declaration reading PCH file");
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace {
|
|||
void VisitDecl(Decl *D);
|
||||
void VisitTranslationUnitDecl(TranslationUnitDecl *D);
|
||||
void VisitNamedDecl(NamedDecl *D);
|
||||
void VisitNamespaceDecl(NamespaceDecl *D);
|
||||
void VisitTypeDecl(TypeDecl *D);
|
||||
void VisitTypedefDecl(TypedefDecl *D);
|
||||
void VisitTagDecl(TagDecl *D);
|
||||
|
@ -99,6 +100,16 @@ void PCHDeclWriter::VisitNamedDecl(NamedDecl *D) {
|
|||
Writer.AddDeclarationName(D->getDeclName(), Record);
|
||||
}
|
||||
|
||||
void PCHDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) {
|
||||
VisitNamedDecl(D);
|
||||
Writer.AddSourceLocation(D->getLBracLoc(), Record);
|
||||
Writer.AddSourceLocation(D->getRBracLoc(), Record);
|
||||
Writer.AddDeclRef(D->getNextNamespace(), Record);
|
||||
Writer.AddDeclRef(D->getOriginalNamespace(), Record);
|
||||
Writer.AddDeclRef(D->getAnonymousNamespace(), Record);
|
||||
Code = pch::DECL_NAMESPACE;
|
||||
}
|
||||
|
||||
void PCHDeclWriter::VisitTypeDecl(TypeDecl *D) {
|
||||
VisitNamedDecl(D);
|
||||
Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
|
||||
|
|
Loading…
Reference in New Issue