1 | //===--- TestTU.h - Scratch source files for testing -------------*- 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 | // Many tests for indexing, code completion etc are most naturally expressed |
10 | // using code examples. |
11 | // TestTU lets test define these examples in a common way without dealing with |
12 | // the mechanics of VFS and compiler interactions, and then easily grab the |
13 | // AST, particular symbols, etc. |
14 | // |
15 | //===---------------------------------------------------------------------===// |
16 | |
17 | #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTTU_H |
18 | #define |
19 | |
20 | #include "../TidyProvider.h" |
21 | #include "Compiler.h" |
22 | #include "FeatureModule.h" |
23 | #include "ParsedAST.h" |
24 | #include "TestFS.h" |
25 | #include "index/Index.h" |
26 | #include "llvm/ADT/StringMap.h" |
27 | #include <memory> |
28 | #include <string> |
29 | #include <utility> |
30 | #include <vector> |
31 | |
32 | namespace clang { |
33 | namespace clangd { |
34 | |
35 | struct TestTU { |
36 | static TestTU withCode(llvm::StringRef Code) { |
37 | TestTU TU; |
38 | TU.Code = std::string(Code); |
39 | return TU; |
40 | } |
41 | |
42 | static TestTU (llvm::StringRef ) { |
43 | TestTU TU; |
44 | TU.HeaderCode = std::string(HeaderCode); |
45 | return TU; |
46 | } |
47 | |
48 | // The code to be compiled. |
49 | std::string Code; |
50 | std::string Filename = "TestTU.cpp" ; |
51 | |
52 | // Define contents of a header which will be implicitly included by Code. |
53 | std::string ; |
54 | std::string = "TestTU.h" ; |
55 | |
56 | // Name and contents of each file. |
57 | llvm::StringMap<std::string> AdditionalFiles; |
58 | |
59 | // Extra arguments for the compiler invocation. |
60 | std::vector<std::string> ; |
61 | |
62 | // Predefine macros such as __UINTPTR_TYPE__. |
63 | bool PredefineMacros = false; |
64 | |
65 | TidyProvider ClangTidyProvider = {}; |
66 | // Index to use when building AST. |
67 | const SymbolIndex *ExternalIndex = nullptr; |
68 | |
69 | // Simulate a header guard of the header (using an #import directive). |
70 | bool = true; |
71 | |
72 | // Parse options pass on to the ParseInputs |
73 | ParseOptions ParseOpts = {}; |
74 | |
75 | // Whether to use overlay the TestFS over the real filesystem. This is |
76 | // required for use of implicit modules.where the module file is written to |
77 | // disk and later read back. |
78 | // FIXME: Change the way reading/writing modules work to allow us to keep them |
79 | // in memory across multiple clang invocations, at least in tests, to |
80 | // eliminate the need for real file system here. |
81 | // Please avoid using this for things other than implicit modules. The plan is |
82 | // to eliminate this option some day. |
83 | bool OverlayRealFileSystemForModules = false; |
84 | |
85 | FeatureModuleSet *FeatureModules = nullptr; |
86 | |
87 | // By default, build() will report Error diagnostics as GTest errors. |
88 | // Suppress this behavior by adding an 'error-ok' comment to the code. |
89 | // The result will always have getDiagnostics() populated. |
90 | ParsedAST build() const; |
91 | std::shared_ptr<const PreambleData> |
92 | preamble(PreambleParsedCallback PreambleCallback = nullptr) const; |
93 | ParseInputs inputs(MockFS &FS) const; |
94 | SymbolSlab () const; |
95 | RefSlab () const; |
96 | std::unique_ptr<SymbolIndex> index() const; |
97 | }; |
98 | |
99 | // Look up an index symbol by qualified name, which must be unique. |
100 | const Symbol &findSymbol(const SymbolSlab &, llvm::StringRef QName); |
101 | // Look up an AST symbol by qualified name, which must be unique and top-level. |
102 | const NamedDecl &findDecl(ParsedAST &AST, llvm::StringRef QName); |
103 | // Look up an AST symbol that satisfies \p Filter. |
104 | const NamedDecl &findDecl(ParsedAST &AST, |
105 | std::function<bool(const NamedDecl &)> Filter); |
106 | // Look up an AST symbol by unqualified name, which must be unique. |
107 | const NamedDecl &findUnqualifiedDecl(ParsedAST &AST, llvm::StringRef Name); |
108 | |
109 | } // namespace clangd |
110 | } // namespace clang |
111 | |
112 | #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTTU_H |
113 | |