aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReader.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-04-16 22:29:51 +0000
committerDouglas Gregor <dgregor@apple.com>2009-04-16 22:29:51 +0000
commitcb70bb2899944b42c6269caa9e39a81ca146fe81 (patch)
treef9c0cb378eae0f3d2a93fbcb056187ae4e94e5e6 /lib/Frontend/PCHReader.cpp
parentc9490c000f515c29f200a1215328d8ab9a0f3818 (diff)
Clean up the declaration-decoding step in the PCH reader, using the
same ueber-easy visitor scheme used for expressions/statements. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69320 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r--lib/Frontend/PCHReader.cpp85
1 files changed, 26 insertions, 59 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index ceba88049a..0f208fb7ac 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -16,6 +16,7 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclGroup.h"
+#include "clang/AST/DeclVisitor.h"
#include "clang/AST/Expr.h"
#include "clang/AST/StmtVisitor.h"
#include "clang/AST/Type.h"
@@ -37,7 +38,8 @@ using namespace clang;
// Declaration deserialization
//===----------------------------------------------------------------------===//
namespace {
- class VISIBILITY_HIDDEN PCHDeclReader {
+ class VISIBILITY_HIDDEN PCHDeclReader
+ : public DeclVisitor<PCHDeclReader, void> {
PCHReader &Reader;
const PCHReader::RecordData &Record;
unsigned &Idx;
@@ -1479,114 +1481,79 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
case pch::DECL_TRANSLATION_UNIT:
assert(Index == 0 && "Translation unit must be at index 0");
- Reader.VisitTranslationUnitDecl(Context.getTranslationUnitDecl());
D = Context.getTranslationUnitDecl();
- LoadedDecl(Index, D);
break;
case pch::DECL_TYPEDEF: {
- TypedefDecl *Typedef = TypedefDecl::Create(Context, 0, SourceLocation(),
- 0, QualType());
- LoadedDecl(Index, Typedef);
- Reader.VisitTypedefDecl(Typedef);
- D = Typedef;
+ D = TypedefDecl::Create(Context, 0, SourceLocation(), 0, QualType());
break;
}
case pch::DECL_ENUM: {
- EnumDecl *Enum = EnumDecl::Create(Context, 0, SourceLocation(), 0, 0);
- LoadedDecl(Index, Enum);
- Reader.VisitEnumDecl(Enum);
- D = Enum;
+ D = EnumDecl::Create(Context, 0, SourceLocation(), 0, 0);
break;
}
case pch::DECL_RECORD: {
- RecordDecl *Record = RecordDecl::Create(Context, TagDecl::TK_struct,
- 0, SourceLocation(), 0, 0);
- LoadedDecl(Index, Record);
- Reader.VisitRecordDecl(Record);
- D = Record;
+ D = RecordDecl::Create(Context, TagDecl::TK_struct, 0, SourceLocation(),
+ 0, 0);
break;
}
case pch::DECL_ENUM_CONSTANT: {
- EnumConstantDecl *ECD = EnumConstantDecl::Create(Context, 0,
- SourceLocation(), 0,
- QualType(), 0,
- llvm::APSInt());
- LoadedDecl(Index, ECD);
- Reader.VisitEnumConstantDecl(ECD);
- D = ECD;
+ D = EnumConstantDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+ 0, llvm::APSInt());
break;
}
case pch::DECL_FUNCTION: {
- FunctionDecl *Function = FunctionDecl::Create(Context, 0, SourceLocation(),
- DeclarationName(),
- QualType());
- LoadedDecl(Index, Function);
- Reader.VisitFunctionDecl(Function);
- D = Function;
+ D = FunctionDecl::Create(Context, 0, SourceLocation(), DeclarationName(),
+ QualType());
break;
}
case pch::DECL_FIELD: {
- FieldDecl *Field = FieldDecl::Create(Context, 0, SourceLocation(), 0,
- QualType(), 0, false);
- LoadedDecl(Index, Field);
- Reader.VisitFieldDecl(Field);
- D = Field;
+ D = FieldDecl::Create(Context, 0, SourceLocation(), 0, QualType(), 0,
+ false);
break;
}
case pch::DECL_VAR: {
- VarDecl *Var = VarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
- VarDecl::None, SourceLocation());
- LoadedDecl(Index, Var);
- Reader.VisitVarDecl(Var);
- D = Var;
+ D = VarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+ VarDecl::None, SourceLocation());
break;
}
case pch::DECL_PARM_VAR: {
- ParmVarDecl *Parm = ParmVarDecl::Create(Context, 0, SourceLocation(), 0,
- QualType(), VarDecl::None, 0);
- LoadedDecl(Index, Parm);
- Reader.VisitParmVarDecl(Parm);
- D = Parm;
+ D = ParmVarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+ VarDecl::None, 0);
break;
}
case pch::DECL_ORIGINAL_PARM_VAR: {
- OriginalParmVarDecl *Parm
- = OriginalParmVarDecl::Create(Context, 0, SourceLocation(), 0,
+ D = OriginalParmVarDecl::Create(Context, 0, SourceLocation(), 0,
QualType(), QualType(), VarDecl::None,
0);
- LoadedDecl(Index, Parm);
- Reader.VisitOriginalParmVarDecl(Parm);
- D = Parm;
break;
}
case pch::DECL_FILE_SCOPE_ASM: {
- FileScopeAsmDecl *Asm = FileScopeAsmDecl::Create(Context, 0,
- SourceLocation(), 0);
- LoadedDecl(Index, Asm);
- Reader.VisitFileScopeAsmDecl(Asm);
- D = Asm;
+ D = FileScopeAsmDecl::Create(Context, 0, SourceLocation(), 0);
break;
}
case pch::DECL_BLOCK: {
- BlockDecl *Block = BlockDecl::Create(Context, 0, SourceLocation());
- LoadedDecl(Index, Block);
- Reader.VisitBlockDecl(Block);
- D = Block;
+ D = BlockDecl::Create(Context, 0, SourceLocation());
break;
}
}
+ assert(D && "Unknown declaration creating PCH file");
+ if (D) {
+ LoadedDecl(Index, D);
+ Reader.Visit(D);
+ }
+
// If this declaration is also a declaration context, get the
// offsets for its tables of lexical and visible declarations.
if (DeclContext *DC = dyn_cast<DeclContext>(D)) {