Coverage Report

Created: 2023-09-30 09:22

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