1a9ac8606Spatrick //===--- IncrementalParser.h - Incremental Compilation ----------*- C++ -*-===// 2a9ac8606Spatrick // 3a9ac8606Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a9ac8606Spatrick // See https://llvm.org/LICENSE.txt for license information. 5a9ac8606Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a9ac8606Spatrick // 7a9ac8606Spatrick //===----------------------------------------------------------------------===// 8a9ac8606Spatrick // 9a9ac8606Spatrick // This file implements the class which performs incremental code compilation. 10a9ac8606Spatrick // 11a9ac8606Spatrick //===----------------------------------------------------------------------===// 12a9ac8606Spatrick 13a9ac8606Spatrick #ifndef LLVM_CLANG_LIB_INTERPRETER_INCREMENTALPARSER_H 14a9ac8606Spatrick #define LLVM_CLANG_LIB_INTERPRETER_INCREMENTALPARSER_H 15a9ac8606Spatrick 16a9ac8606Spatrick #include "clang/Interpreter/PartialTranslationUnit.h" 17a9ac8606Spatrick 18*12c85518Srobert #include "clang/AST/GlobalDecl.h" 19*12c85518Srobert 20a9ac8606Spatrick #include "llvm/ADT/ArrayRef.h" 21a9ac8606Spatrick #include "llvm/ADT/StringRef.h" 22a9ac8606Spatrick #include "llvm/Support/Error.h" 23a9ac8606Spatrick 24a9ac8606Spatrick #include <list> 25a9ac8606Spatrick #include <memory> 26a9ac8606Spatrick namespace llvm { 27a9ac8606Spatrick class LLVMContext; 28a9ac8606Spatrick } 29a9ac8606Spatrick 30a9ac8606Spatrick namespace clang { 31a9ac8606Spatrick class ASTConsumer; 32a9ac8606Spatrick class CompilerInstance; 33a9ac8606Spatrick class IncrementalAction; 34a9ac8606Spatrick class Parser; 35a9ac8606Spatrick 36a9ac8606Spatrick /// Provides support for incremental compilation. Keeps track of the state 37a9ac8606Spatrick /// changes between the subsequent incremental input. 38a9ac8606Spatrick /// 39a9ac8606Spatrick class IncrementalParser { 40a9ac8606Spatrick /// Long-lived, incremental parsing action. 41a9ac8606Spatrick std::unique_ptr<IncrementalAction> Act; 42a9ac8606Spatrick 43a9ac8606Spatrick /// Compiler instance performing the incremental compilation. 44a9ac8606Spatrick std::unique_ptr<CompilerInstance> CI; 45a9ac8606Spatrick 46a9ac8606Spatrick /// Parser. 47a9ac8606Spatrick std::unique_ptr<Parser> P; 48a9ac8606Spatrick 49a9ac8606Spatrick /// Consumer to process the produced top level decls. Owned by Act. 50a9ac8606Spatrick ASTConsumer *Consumer = nullptr; 51a9ac8606Spatrick 52a9ac8606Spatrick /// Counts the number of direct user input lines that have been parsed. 53a9ac8606Spatrick unsigned InputCount = 0; 54a9ac8606Spatrick 55a9ac8606Spatrick /// List containing every information about every incrementally parsed piece 56a9ac8606Spatrick /// of code. 57a9ac8606Spatrick std::list<PartialTranslationUnit> PTUs; 58a9ac8606Spatrick 59a9ac8606Spatrick public: 60a9ac8606Spatrick IncrementalParser(std::unique_ptr<CompilerInstance> Instance, 61a9ac8606Spatrick llvm::LLVMContext &LLVMCtx, llvm::Error &Err); 62a9ac8606Spatrick ~IncrementalParser(); 63a9ac8606Spatrick getCI()64a9ac8606Spatrick const CompilerInstance *getCI() const { return CI.get(); } 65a9ac8606Spatrick 66a9ac8606Spatrick /// Parses incremental input by creating an in-memory file. 67a9ac8606Spatrick ///\returns a \c PartialTranslationUnit which holds information about the 68a9ac8606Spatrick /// \c TranslationUnitDecl and \c llvm::Module corresponding to the input. 69a9ac8606Spatrick llvm::Expected<PartialTranslationUnit &> Parse(llvm::StringRef Input); 70a9ac8606Spatrick 71*12c85518Srobert /// Uses the CodeGenModule mangled name cache and avoids recomputing. 72*12c85518Srobert ///\returns the mangled name of a \c GD. 73*12c85518Srobert llvm::StringRef GetMangledName(GlobalDecl GD) const; 74*12c85518Srobert 75*12c85518Srobert void CleanUpPTU(PartialTranslationUnit &PTU); 76*12c85518Srobert getPTUs()77*12c85518Srobert std::list<PartialTranslationUnit> &getPTUs() { return PTUs; } 78*12c85518Srobert 79a9ac8606Spatrick private: 80a9ac8606Spatrick llvm::Expected<PartialTranslationUnit &> ParseOrWrapTopLevelDecl(); 81a9ac8606Spatrick }; 82a9ac8606Spatrick } // end namespace clang 83a9ac8606Spatrick 84a9ac8606Spatrick #endif // LLVM_CLANG_LIB_INTERPRETER_INCREMENTALPARSER_H 85