xref: /openbsd-src/gnu/llvm/clang/lib/Interpreter/IncrementalParser.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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