13 #include "clang/Basic/TokenKinds.h" 14 #include "clang/Tooling/Syntax/Tokens.h" 15 #include "llvm/Support/ScopedPrinter.h" 16 #include "gmock/gmock.h" 17 #include "gtest/gtest.h" 23 using ::testing::ElementsAre;
25 TEST(ClangdUnitTest, GetBeginningOfIdentifier) {
27 struct Bar { int func(); }; 28 #define MACRO(X) void f() { X; } 32 for (std::string Text : std::vector<std::string>{
42 "MACRO(bar->^func())",
43 "MACRO(bar->^fun^c())",
44 "MACRO(bar->^func^())",
45 "MACRO(^bar->func())",
46 "MACRO(^bar^->func())",
47 "^MACRO(bar->func())",
48 "^MAC^RO(bar->func())",
49 "^MACRO^(bar->func())",
51 std::string WithPreamble = Preamble +
Text;
52 Annotations TestCase(WithPreamble);
56 AST, TestCase.points().back(), SourceMgr.getMainFileID());
59 SourceMgr.getFileOffset(SourceMgr.getSpellingLoc(Actual)));
60 EXPECT_EQ(TestCase.points().front(), ActualPos) << Text;
65 if (NamedDecl *ND = dyn_cast<NamedDecl>(arg))
66 if (ND->getName() ==
Name)
68 if (
auto *Stream = result_listener->stream()) {
69 llvm::raw_os_ostream OS(*Stream);
75 TEST(ClangdUnitTest, TopLevelDecls) {
81 TU.Code = "int main();";
82 auto AST = TU.
build();
86 TEST(ClangdUnitTest, DoesNotGetIncludedTopDecls) {
88 TU.HeaderCode = R
"cpp( 89 #define LL void foo(){} 102 auto AST = TU.
build();
106 TEST(ClangdUnitTest, TokensAfterPreamble) {
108 TU.AdditionalFiles[
"foo.h"] = R
"( 118 auto AST = TU.
build();
119 const syntax::TokenBuffer &T = AST.
getTokens();
122 ASSERT_GT(T.expandedTokens().size(), 2u);
124 EXPECT_EQ(T.expandedTokens().front().text(SM),
"first_token");
126 EXPECT_EQ(T.expandedTokens().back().kind(), tok::eof);
128 EXPECT_EQ(T.expandedTokens().drop_back().back().text(SM),
"last_token");
131 auto Spelled = T.spelledTokens(SM.getMainFileID());
132 ASSERT_FALSE(Spelled.empty());
133 EXPECT_EQ(Spelled.front().kind(), tok::hash);
134 EXPECT_EQ(Spelled.back().text(SM),
"last_token");
138 TEST(ClangdUnitTest, NoCrashOnTokensWithTidyCheck) {
142 TU.ClangTidyChecks =
"modernize-use-trailing-return-type";
143 TU.Code =
"inline int foo() {}";
145 auto AST = TU.
build();
146 const syntax::TokenBuffer &T = AST.
getTokens();
149 ASSERT_GT(T.expandedTokens().size(), 7u);
151 EXPECT_EQ(T.expandedTokens().front().text(SM),
"inline");
153 EXPECT_EQ(T.expandedTokens().back().kind(), tok::eof);
155 EXPECT_EQ(T.expandedTokens().drop_back().back().text(SM),
"}");
static llvm::Optional< ParsedAST > build(std::unique_ptr< clang::CompilerInvocation > CI, std::shared_ptr< const PreambleData > Preamble, std::unique_ptr< llvm::MemoryBuffer > Buffer, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, const SymbolIndex *Index, const ParseOptions &Opts)
Attempts to run Clang and store parsed AST.
ArrayRef< Decl * > getLocalTopLevelDecls()
This function returns top-level decls present in the main file of the AST.
const syntax::TokenBuffer & getTokens() const
Tokens recorded while parsing the main file.
SourceLocation getBeginningOfIdentifier(const ParsedAST &Unit, const Position &Pos, const FileID FID)
Get the beginning SourceLocation at a specified Pos.
Position offsetToPosition(llvm::StringRef Code, size_t Offset)
Turn an offset in Code into a [line, column] pair.
TEST(BackgroundQueueTest, Priority)
static constexpr llvm::StringLiteral Name
static TestTU withCode(llvm::StringRef Code)
SourceManager & getSourceManager()
const PreambleData * Preamble
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//