summaryrefslogtreecommitdiffstats
path: root/clangd/unittests/TestTU.h
diff options
context:
space:
mode:
Diffstat (limited to 'clangd/unittests/TestTU.h')
-rw-r--r--clangd/unittests/TestTU.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/clangd/unittests/TestTU.h b/clangd/unittests/TestTU.h
new file mode 100644
index 00000000..6ac4c86a
--- /dev/null
+++ b/clangd/unittests/TestTU.h
@@ -0,0 +1,84 @@
+//===--- TestTU.h - Scratch source files for testing -------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Many tests for indexing, code completion etc are most naturally expressed
+// using code examples.
+// TestTU lets test define these examples in a common way without dealing with
+// the mechanics of VFS and compiler interactions, and then easily grab the
+// AST, particular symbols, etc.
+//
+//===---------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTTU_H
+#define LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTTU_H
+
+#include "ClangdUnit.h"
+#include "Path.h"
+#include "index/Index.h"
+#include "llvm/ADT/StringMap.h"
+#include "gtest/gtest.h"
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace clang {
+namespace clangd {
+
+struct TestTU {
+ static TestTU withCode(llvm::StringRef Code) {
+ TestTU TU;
+ TU.Code = Code;
+ return TU;
+ }
+
+ static TestTU withHeaderCode(llvm::StringRef HeaderCode) {
+ TestTU TU;
+ TU.HeaderCode = HeaderCode;
+ return TU;
+ }
+
+ // The code to be compiled.
+ std::string Code;
+ std::string Filename = "TestTU.cpp";
+
+ // Define contents of a header which will be implicitly included by Code.
+ std::string HeaderCode;
+ std::string HeaderFilename = "TestTU.h";
+
+ // Name and contents of each file.
+ llvm::StringMap<std::string> AdditionalFiles;
+
+ // Extra arguments for the compiler invocation.
+ std::vector<const char *> ExtraArgs;
+
+ llvm::Optional<std::string> ClangTidyChecks;
+ // Index to use when building AST.
+ const SymbolIndex *ExternalIndex = nullptr;
+
+ // Simulate a header guard of the header (using an #import directive).
+ bool ImplicitHeaderGuard = true;
+
+ ParsedAST build() const;
+ SymbolSlab headerSymbols() const;
+ std::unique_ptr<SymbolIndex> index() const;
+};
+
+// Look up an index symbol by qualified name, which must be unique.
+const Symbol &findSymbol(const SymbolSlab &, llvm::StringRef QName);
+// Look up an AST symbol by qualified name, which must be unique and top-level.
+const NamedDecl &findDecl(ParsedAST &AST, llvm::StringRef QName);
+// Look up an AST symbol that satisfies \p Filter.
+const NamedDecl &findDecl(ParsedAST &AST,
+ std::function<bool(const NamedDecl &)> Filter);
+// Look up an AST symbol by unqualified name, which must be unique.
+const NamedDecl &findUnqualifiedDecl(ParsedAST &AST, llvm::StringRef Name);
+
+} // namespace clangd
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTTU_H