class DeclGroupRef;
class TagDecl;
class HandleTagDeclDefinition;
-
+ class SemaConsumer; // layering violation required for safe SemaConsumer
+
/// ASTConsumer - This is an abstract interface that should be implemented by
/// clients that read ASTs. This abstraction layer allows the client to be
/// independent of the AST producer (e.g. parser vs AST dump file reader, etc).
class ASTConsumer {
+ /// \brief Whether this AST consumer also requires information about
+ /// semantic analysis.
+ bool SemaConsumer;
+
+ friend class SemaConsumer;
+
public:
+ ASTConsumer() : SemaConsumer(false) { }
+
virtual ~ASTConsumer() {}
/// Initialize - This is called to initialize the consumer, providing the
- /// ASTContext.
+ /// ASTContext and the Action.
virtual void Initialize(ASTContext &Context) {}
/// HandleTopLevelDecl - Handle the specified top-level declaration. This is
/// PrintStats - If desired, print any statistics.
virtual void PrintStats() {
}
+
+ // Support isa/cast/dyn_cast
+ static bool classof(const ASTConsumer *) { return true; }
};
} // end namespace clang.
class ASTContext;
class LabelStmt;
class Preprocessor;
+class Sema;
class SourceManager;
class SwitchCase;
class TargetInfo;
/// the given bitstream.
PCHWriter(llvm::BitstreamWriter &Stream);
- /// \brief Write a precompiled header for the given AST context.
- void WritePCH(ASTContext &Context, const Preprocessor &PP);
+ /// \brief Write a precompiled header for the given semantic analysis.
+ void WritePCH(Sema &SemaRef);
/// \brief Emit a source location.
void AddSourceLocation(SourceLocation Loc, RecordData &Record);
--- /dev/null
+//===--- SemaConsumer.h - Abstract interface for AST semantics --*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the SemaConsumer class, a subclass of
+// ASTConsumer that is used by AST clients that also require
+// additional semantic analysis.
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_CLANG_SEMA_SEMACONSUMER_H
+#define LLVM_CLANG_SEMA_SEMACONSUMER_H
+
+#include "clang/AST/ASTConsumer.h"
+
+namespace clang {
+ class Sema;
+
+ /// \brief An abstract interface that should be implemented by
+ /// clients that read ASTs and then require further semantic
+ /// analysis of the entities in those ASTs.
+ class SemaConsumer : public ASTConsumer {
+ public:
+ explicit SemaConsumer() {
+ ASTConsumer::SemaConsumer = true;
+ }
+
+ /// \brief Initialize the semantic consumer with the Sema instance
+ /// being used to perform semantic analysis on the abstract syntax
+ /// tree.
+ virtual void InitializeSema(Sema &S) {}
+
+ // isa/cast/dyn_cast support
+ static bool classof(const ASTConsumer *Consumer) {
+ return Consumer->SemaConsumer;
+ }
+ static bool classof(const SemaConsumer *) { return true; }
+ };
+}
+
+#endif
//===----------------------------------------------------------------------===//
#include "clang/Frontend/PCHWriter.h"
+#include "../Sema/Sema.h" // FIXME: move header into include/clang/Sema
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclContextInternals.h"
PCHWriter::PCHWriter(llvm::BitstreamWriter &Stream)
: Stream(Stream), NextTypeID(pch::NUM_PREDEF_TYPE_IDS), NumStatements(0) { }
-void PCHWriter::WritePCH(ASTContext &Context, const Preprocessor &PP) {
+void PCHWriter::WritePCH(Sema &SemaRef) {
+ ASTContext &Context = SemaRef.Context;
+ Preprocessor &PP = SemaRef.PP;
+
// Emit the file header.
Stream.Emit((unsigned)'C', 8);
Stream.Emit((unsigned)'P', 8);
#include "clang/Sema/ParseAST.h"
#include "Sema.h"
+#include "clang/Sema/SemaConsumer.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/ExternalASTSource.h"
#include "clang/AST/Stmt.h"
Consumer->Initialize(Ctx);
+ if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer))
+ SC->InitializeSema(S);
+
if (Ctx.getExternalSource())
Ctx.getExternalSource()->StartTranslationUnit(Consumer);
#include "ASTConsumers.h"
#include "clang/Frontend/PCHWriter.h"
+#include "clang/Sema/SemaConsumer.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/Lex/Preprocessor.h"
using namespace llvm;
namespace {
- class VISIBILITY_HIDDEN PCHGenerator : public ASTConsumer {
+ class VISIBILITY_HIDDEN PCHGenerator : public SemaConsumer {
const Preprocessor &PP;
std::string OutFile;
+ Sema *SemaPtr;
public:
explicit PCHGenerator(const Preprocessor &PP, const std::string &OutFile)
- : PP(PP), OutFile(OutFile) { }
+ : PP(PP), OutFile(OutFile), SemaPtr(0) { }
+ virtual void InitializeSema(Sema &S) { SemaPtr = &S; }
virtual void HandleTranslationUnit(ASTContext &Ctx);
};
}
PCHWriter Writer(Stream);
// Emit the PCH file
- Writer.WritePCH(Ctx, PP);
+ assert(SemaPtr && "No Sema?");
+ Writer.WritePCH(*SemaPtr);
// Open up the PCH file.
std::string ErrMsg;