diff options
Diffstat (limited to 'include/clang/Frontend/ASTUnit.h')
-rw-r--r-- | include/clang/Frontend/ASTUnit.h | 87 |
1 files changed, 62 insertions, 25 deletions
diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 04dc5ed8cc56..f18972ab3445 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -16,10 +16,11 @@ #include "clang/Basic/SourceManager.h" #include "llvm/ADT/OwningPtr.h" -#include "clang/Frontend/TextDiagnosticBuffer.h" #include "clang/Basic/FileManager.h" #include "clang/Index/ASTLocation.h" #include <string> +#include <vector> +#include <cassert> namespace clang { class ASTContext; @@ -32,14 +33,12 @@ class HeaderSearch; class Preprocessor; class SourceManager; class TargetInfo; -class TextDiagnosticBuffer; using namespace idx; /// \brief Utility class for loading a ASTContext from a PCH file. /// class ASTUnit { - Diagnostic Diags; FileManager FileMgr; SourceManager SourceMgr; @@ -48,22 +47,39 @@ class ASTUnit { llvm::OwningPtr<Preprocessor> PP; llvm::OwningPtr<ASTContext> Ctx; bool tempFile; - + // OnlyLocalDecls - when true, walking this AST should only visit declarations // that come from the AST itself, not from included precompiled headers. // FIXME: This is temporary; eventually, CIndex will always do this. bool OnlyLocalDecls; - + + /// Track whether the main file was loaded from an AST or not. + bool MainFileIsAST; + + /// Track the top-level decls which appeared in an ASTUnit which was loaded + /// from a source file. + // + // FIXME: This is just an optimization hack to avoid deserializing large parts + // of a PCH file when using the Index library on an ASTUnit loaded from + // source. In the long term we should make the Index library use efficient and + // more scalable search mechanisms. + std::vector<Decl*> TopLevelDecls; + + /// The name of the original source file used to generate this ASTUnit. + std::string OriginalSourceFile; + // Critical optimization when using clang_getCursor(). ASTLocation LastLoc; - + ASTUnit(const ASTUnit&); // DO NOT IMPLEMENT ASTUnit &operator=(const ASTUnit &); // DO NOT IMPLEMENT public: - ASTUnit(DiagnosticClient *diagClient = NULL); + ASTUnit(bool MainFileIsAST); ~ASTUnit(); + bool isMainFileAST() const { return MainFileIsAST; } + const SourceManager &getSourceManager() const { return SourceMgr; } SourceManager &getSourceManager() { return SourceMgr; } @@ -73,37 +89,38 @@ public: const ASTContext &getASTContext() const { return *Ctx.get(); } ASTContext &getASTContext() { return *Ctx.get(); } - const Diagnostic &getDiagnostic() const { return Diags; } - Diagnostic &getDiagnostic() { return Diags; } - const FileManager &getFileManager() const { return FileMgr; } FileManager &getFileManager() { return FileMgr; } - + const std::string &getOriginalSourceFileName(); const std::string &getPCHFileName(); void unlinkTemporaryFile() { tempFile = true; } - + bool getOnlyLocalDecls() const { return OnlyLocalDecls; } - + void setLastASTLocation(ASTLocation ALoc) { LastLoc = ALoc; } ASTLocation getLastASTLocation() const { return LastLoc; } - + + std::vector<Decl*> &getTopLevelDecls() { + assert(!isMainFileAST() && "Invalid call for AST based ASTUnit!"); + return TopLevelDecls; + } + const std::vector<Decl*> &getTopLevelDecls() const { + assert(!isMainFileAST() && "Invalid call for AST based ASTUnit!"); + return TopLevelDecls; + } + /// \brief Create a ASTUnit from a PCH file. /// /// \param Filename - The PCH file to load. /// - /// \param DiagClient - The diagnostics client to use. Specify NULL - /// to use a default client that emits warnings/errors to standard error. - /// The ASTUnit objects takes ownership of this object. - /// - /// \param ErrMsg - Error message to report if the PCH file could not be - /// loaded. + /// \param Diags - The diagnostics engine to use for reporting errors; its + /// lifetime is expected to extend past that of the returned ASTUnit. /// /// \returns - The initialized ASTUnit or null if the PCH failed to load. static ASTUnit *LoadFromPCHFile(const std::string &Filename, - std::string *ErrMsg = 0, - DiagnosticClient *DiagClient = NULL, + Diagnostic &Diags, bool OnlyLocalDecls = false, bool UseBumpAllocator = false); @@ -113,15 +130,35 @@ public: /// \param CI - The compiler invocation to use; it must have exactly one input /// source file. /// - /// \param Diags - The diagnostics engine to use for reporting errors. + /// \param Diags - The diagnostics engine to use for reporting errors; its + /// lifetime is expected to extend past that of the returned ASTUnit. // // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we // shouldn't need to specify them at construction time. static ASTUnit *LoadFromCompilerInvocation(const CompilerInvocation &CI, Diagnostic &Diags, - bool OnlyLocalDecls = false, - bool UseBumpAllocator = false); + bool OnlyLocalDecls = false); + /// LoadFromCommandLine - Create an ASTUnit from a vector of command line + /// arguments, which must specify exactly one source file. + /// + /// \param ArgBegin - The beginning of the argument vector. + /// + /// \param ArgEnd - The end of the argument vector. + /// + /// \param Diags - The diagnostics engine to use for reporting errors; its + /// lifetime is expected to extend past that of the returned ASTUnit. + /// + /// \param ResourceFilesPath - The path to the compiler resource files. + // + // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we + // shouldn't need to specify them at construction time. + static ASTUnit *LoadFromCommandLine(const char **ArgBegin, + const char **ArgEnd, + Diagnostic &Diags, + llvm::StringRef ResourceFilesPath, + bool OnlyLocalDecls = false, + bool UseBumpAllocator = false); }; } // namespace clang |