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