annotate clang-tools-extra/clangd/ParsedAST.h @ 180:680fa57a2f20

fix compile errors.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 30 May 2020 17:44:06 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- ParsedAST.h - Building translation units ----------------*- C++-*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file exposes building a file as if it were open in clangd, and defines
anatofuz
parents:
diff changeset
10 // the ParsedAST structure that holds the results.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 // This is similar to a clang -fsyntax-only run that produces a clang AST, but
anatofuz
parents:
diff changeset
13 // we have several customizations:
anatofuz
parents:
diff changeset
14 // - preamble handling
anatofuz
parents:
diff changeset
15 // - capturing diagnostics for later access
anatofuz
parents:
diff changeset
16 // - running clang-tidy checks checks
anatofuz
parents:
diff changeset
17 //
anatofuz
parents:
diff changeset
18 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_PARSEDAST_H
anatofuz
parents:
diff changeset
21 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_PARSEDAST_H
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 #include "CollectMacros.h"
anatofuz
parents:
diff changeset
24 #include "Compiler.h"
anatofuz
parents:
diff changeset
25 #include "Diagnostics.h"
anatofuz
parents:
diff changeset
26 #include "Headers.h"
anatofuz
parents:
diff changeset
27 #include "Preamble.h"
anatofuz
parents:
diff changeset
28 #include "index/CanonicalIncludes.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
29 #include "support/Path.h"
150
anatofuz
parents:
diff changeset
30 #include "clang/Frontend/FrontendAction.h"
anatofuz
parents:
diff changeset
31 #include "clang/Frontend/PrecompiledPreamble.h"
anatofuz
parents:
diff changeset
32 #include "clang/Lex/Preprocessor.h"
anatofuz
parents:
diff changeset
33 #include "clang/Tooling/CompilationDatabase.h"
anatofuz
parents:
diff changeset
34 #include "clang/Tooling/Syntax/Tokens.h"
anatofuz
parents:
diff changeset
35 #include "llvm/ADT/ArrayRef.h"
anatofuz
parents:
diff changeset
36 #include <memory>
anatofuz
parents:
diff changeset
37 #include <string>
anatofuz
parents:
diff changeset
38 #include <vector>
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 namespace clang {
anatofuz
parents:
diff changeset
41 namespace clangd {
anatofuz
parents:
diff changeset
42 class SymbolIndex;
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 /// Stores and provides access to parsed AST.
anatofuz
parents:
diff changeset
45 class ParsedAST {
anatofuz
parents:
diff changeset
46 public:
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
47 /// Attempts to run Clang and store the parsed AST.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
48 /// If \p Preamble is non-null it is reused during parsing.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
49 /// This function does not check if preamble is valid to reuse.
150
anatofuz
parents:
diff changeset
50 static llvm::Optional<ParsedAST>
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
51 build(llvm::StringRef Filename, const ParseInputs &Inputs,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
52 std::unique_ptr<clang::CompilerInvocation> CI,
150
anatofuz
parents:
diff changeset
53 llvm::ArrayRef<Diag> CompilerInvocationDiags,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
54 std::shared_ptr<const PreambleData> Preamble);
150
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 ParsedAST(ParsedAST &&Other);
anatofuz
parents:
diff changeset
57 ParsedAST &operator=(ParsedAST &&Other);
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 ~ParsedAST();
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 /// Note that the returned ast will not contain decls from the preamble that
anatofuz
parents:
diff changeset
62 /// were not deserialized during parsing. Clients should expect only decls
anatofuz
parents:
diff changeset
63 /// from the main file to be in the AST.
anatofuz
parents:
diff changeset
64 ASTContext &getASTContext();
anatofuz
parents:
diff changeset
65 const ASTContext &getASTContext() const;
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 Preprocessor &getPreprocessor();
anatofuz
parents:
diff changeset
68 std::shared_ptr<Preprocessor> getPreprocessorPtr();
anatofuz
parents:
diff changeset
69 const Preprocessor &getPreprocessor() const;
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 SourceManager &getSourceManager() {
anatofuz
parents:
diff changeset
72 return getASTContext().getSourceManager();
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74 const SourceManager &getSourceManager() const {
anatofuz
parents:
diff changeset
75 return getASTContext().getSourceManager();
anatofuz
parents:
diff changeset
76 }
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 const LangOptions &getLangOpts() const {
anatofuz
parents:
diff changeset
79 return getASTContext().getLangOpts();
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 /// This function returns top-level decls present in the main file of the AST.
anatofuz
parents:
diff changeset
83 /// The result does not include the decls that come from the preamble.
anatofuz
parents:
diff changeset
84 /// (These should be const, but RecursiveASTVisitor requires Decl*).
anatofuz
parents:
diff changeset
85 ArrayRef<Decl *> getLocalTopLevelDecls();
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 const std::vector<Diag> &getDiagnostics() const;
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 /// Returns the estimated size of the AST and the accessory structures, in
anatofuz
parents:
diff changeset
90 /// bytes. Does not include the size of the preamble.
anatofuz
parents:
diff changeset
91 std::size_t getUsedBytes() const;
anatofuz
parents:
diff changeset
92 const IncludeStructure &getIncludeStructure() const;
anatofuz
parents:
diff changeset
93 const CanonicalIncludes &getCanonicalIncludes() const;
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 /// Gets all macro references (definition, expansions) present in the main
anatofuz
parents:
diff changeset
96 /// file, including those in the preamble region.
anatofuz
parents:
diff changeset
97 const MainFileMacros &getMacros() const;
anatofuz
parents:
diff changeset
98 /// Tokens recorded while parsing the main file.
anatofuz
parents:
diff changeset
99 /// (!) does not have tokens from the preamble.
anatofuz
parents:
diff changeset
100 const syntax::TokenBuffer &getTokens() const { return Tokens; }
anatofuz
parents:
diff changeset
101
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
102 /// Returns the version of the ParseInputs this AST was built from.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
103 llvm::StringRef version() const { return Version; }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
104
150
anatofuz
parents:
diff changeset
105 private:
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
106 ParsedAST(llvm::StringRef Version,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
107 std::shared_ptr<const PreambleData> Preamble,
150
anatofuz
parents:
diff changeset
108 std::unique_ptr<CompilerInstance> Clang,
anatofuz
parents:
diff changeset
109 std::unique_ptr<FrontendAction> Action, syntax::TokenBuffer Tokens,
anatofuz
parents:
diff changeset
110 MainFileMacros Macros, std::vector<Decl *> LocalTopLevelDecls,
anatofuz
parents:
diff changeset
111 std::vector<Diag> Diags, IncludeStructure Includes,
anatofuz
parents:
diff changeset
112 CanonicalIncludes CanonIncludes);
anatofuz
parents:
diff changeset
113
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
114 std::string Version;
150
anatofuz
parents:
diff changeset
115 // In-memory preambles must outlive the AST, it is important that this member
anatofuz
parents:
diff changeset
116 // goes before Clang and Action.
anatofuz
parents:
diff changeset
117 std::shared_ptr<const PreambleData> Preamble;
anatofuz
parents:
diff changeset
118 // We store an "incomplete" FrontendAction (i.e. no EndSourceFile was called
anatofuz
parents:
diff changeset
119 // on it) and CompilerInstance used to run it. That way we don't have to do
anatofuz
parents:
diff changeset
120 // complex memory management of all Clang structures on our own. (They are
anatofuz
parents:
diff changeset
121 // stored in CompilerInstance and cleaned up by
anatofuz
parents:
diff changeset
122 // FrontendAction.EndSourceFile).
anatofuz
parents:
diff changeset
123 std::unique_ptr<CompilerInstance> Clang;
anatofuz
parents:
diff changeset
124 std::unique_ptr<FrontendAction> Action;
anatofuz
parents:
diff changeset
125 /// Tokens recorded after the preamble finished.
anatofuz
parents:
diff changeset
126 /// - Includes all spelled tokens for the main file.
anatofuz
parents:
diff changeset
127 /// - Includes expanded tokens produced **after** preabmle.
anatofuz
parents:
diff changeset
128 /// - Does not have spelled or expanded tokens for files from preamble.
anatofuz
parents:
diff changeset
129 syntax::TokenBuffer Tokens;
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 /// All macro definitions and expansions in the main file.
anatofuz
parents:
diff changeset
132 MainFileMacros Macros;
anatofuz
parents:
diff changeset
133 // Data, stored after parsing.
anatofuz
parents:
diff changeset
134 std::vector<Diag> Diags;
anatofuz
parents:
diff changeset
135 // Top-level decls inside the current file. Not that this does not include
anatofuz
parents:
diff changeset
136 // top-level decls from the preamble.
anatofuz
parents:
diff changeset
137 std::vector<Decl *> LocalTopLevelDecls;
anatofuz
parents:
diff changeset
138 IncludeStructure Includes;
anatofuz
parents:
diff changeset
139 CanonicalIncludes CanonIncludes;
anatofuz
parents:
diff changeset
140 };
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 /// For testing/debugging purposes. Note that this method deserializes all
anatofuz
parents:
diff changeset
143 /// unserialized Decls, so use with care.
anatofuz
parents:
diff changeset
144 void dumpAST(ParsedAST &AST, llvm::raw_ostream &OS);
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 } // namespace clangd
anatofuz
parents:
diff changeset
147 } // namespace clang
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_PARSEDAST_H