xref: /llvm-project/clang-tools-extra/clangd/unittests/ASTSignalsTests.cpp (revision 042dd99484d6f393cc8a365def250e9d74c24d37)
12f395b70SUtkarsh Saxena //===-- ASTSignalsTests.cpp -------------------------------------*- C++ -*-===//
22f395b70SUtkarsh Saxena //
32f395b70SUtkarsh Saxena // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42f395b70SUtkarsh Saxena // See https://llvm.org/LICENSE.txt for license information.
52f395b70SUtkarsh Saxena // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62f395b70SUtkarsh Saxena //
72f395b70SUtkarsh Saxena //===----------------------------------------------------------------------===//
82f395b70SUtkarsh Saxena 
94d006520SSam McCall #include "ASTSignals.h"
102f395b70SUtkarsh Saxena #include "TestIndex.h"
112f395b70SUtkarsh Saxena #include "TestTU.h"
122f395b70SUtkarsh Saxena #include "llvm/ADT/StringRef.h"
132f395b70SUtkarsh Saxena #include "gmock/gmock.h"
142f395b70SUtkarsh Saxena #include "gtest/gtest.h"
152f395b70SUtkarsh Saxena 
162f395b70SUtkarsh Saxena namespace clang {
172f395b70SUtkarsh Saxena namespace clangd {
182f395b70SUtkarsh Saxena namespace {
192f395b70SUtkarsh Saxena 
202f395b70SUtkarsh Saxena using ::testing::_;
212f395b70SUtkarsh Saxena using ::testing::Pair;
222f395b70SUtkarsh Saxena using ::testing::UnorderedElementsAre;
232f395b70SUtkarsh Saxena 
TEST(ASTSignals,Derive)242f395b70SUtkarsh Saxena TEST(ASTSignals, Derive) {
252f395b70SUtkarsh Saxena   TestTU TU = TestTU::withCode(R"cpp(
262f395b70SUtkarsh Saxena   namespace ns1 {
272f395b70SUtkarsh Saxena   namespace ns2 {
282f395b70SUtkarsh Saxena   namespace {
292f395b70SUtkarsh Saxena   int func() {
302f395b70SUtkarsh Saxena     tar::X a;
312f395b70SUtkarsh Saxena     a.Y = 1;
322f395b70SUtkarsh Saxena     return ADD(tar::kConst, a.Y, tar::foo()) + fooInNS2() + tar::foo();
332f395b70SUtkarsh Saxena   }
342f395b70SUtkarsh Saxena   } // namespace
352f395b70SUtkarsh Saxena   } // namespace ns2
362f395b70SUtkarsh Saxena   } // namespace ns1
372f395b70SUtkarsh Saxena   )cpp");
382f395b70SUtkarsh Saxena 
392f395b70SUtkarsh Saxena   TU.HeaderCode = R"cpp(
402f395b70SUtkarsh Saxena   #define ADD(x, y, z) (x + y + z)
412f395b70SUtkarsh Saxena   namespace tar {  // A related namespace.
422f395b70SUtkarsh Saxena   int kConst = 5;
432f395b70SUtkarsh Saxena   int foo();
442f395b70SUtkarsh Saxena   void bar();  // Unused symbols are not recorded.
452f395b70SUtkarsh Saxena   class X {
462f395b70SUtkarsh Saxena     public: int Y;
472f395b70SUtkarsh Saxena   };
482f395b70SUtkarsh Saxena   } // namespace tar
492f395b70SUtkarsh Saxena   namespace ns1::ns2 { int fooInNS2(); }}
502f395b70SUtkarsh Saxena   )cpp";
512f395b70SUtkarsh Saxena   ASTSignals Signals = ASTSignals::derive(TU.build());
522f395b70SUtkarsh Saxena   std::vector<std::pair<StringRef, int>> NS;
532f395b70SUtkarsh Saxena   for (const auto &P : Signals.RelatedNamespaces)
542f395b70SUtkarsh Saxena     NS.emplace_back(P.getKey(), P.getValue());
552f395b70SUtkarsh Saxena   EXPECT_THAT(NS, UnorderedElementsAre(Pair("ns1::", 1), Pair("ns1::ns2::", 1),
562f395b70SUtkarsh Saxena                                        Pair("tar::", /*foo, kConst, X*/ 3)));
572f395b70SUtkarsh Saxena 
582f395b70SUtkarsh Saxena   std::vector<std::pair<SymbolID, int>> Sym;
592f395b70SUtkarsh Saxena   for (const auto &P : Signals.ReferencedSymbols)
602f395b70SUtkarsh Saxena     Sym.emplace_back(P.getFirst(), P.getSecond());
612f395b70SUtkarsh Saxena   EXPECT_THAT(
622f395b70SUtkarsh Saxena       Sym,
632f395b70SUtkarsh Saxena       UnorderedElementsAre(
642f395b70SUtkarsh Saxena           Pair(ns("tar").ID, 4), Pair(ns("ns1").ID, 1),
652f395b70SUtkarsh Saxena           Pair(ns("ns1::ns2").ID, 1), Pair(_ /*int func();*/, 1),
662f395b70SUtkarsh Saxena           Pair(cls("tar::X").ID, 1), Pair(var("tar::kConst").ID, 1),
672f395b70SUtkarsh Saxena           Pair(func("tar::foo").ID, 2), Pair(func("ns1::ns2::fooInNS2").ID, 1),
682f395b70SUtkarsh Saxena           Pair(sym("Y", index::SymbolKind::Variable, "@N@tar@S@X@FI@\\0").ID,
692f395b70SUtkarsh Saxena                2),
702f395b70SUtkarsh Saxena           Pair(_ /*a*/, 3)));
71*042dd994SDavid Goldman   EXPECT_EQ(Signals.InsertionDirective, Symbol::IncludeDirective::Include);
722f395b70SUtkarsh Saxena }
732f395b70SUtkarsh Saxena } // namespace
742f395b70SUtkarsh Saxena } // namespace clangd
752f395b70SUtkarsh Saxena } // namespace clang
76