xref: /aosp_15_r20/external/clang/unittests/Tooling/LookupTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittest/Tooling/LookupTest.cpp ------------------------------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "TestVisitor.h"
11*67e74705SXin Li #include "clang/Tooling/Core/Lookup.h"
12*67e74705SXin Li using namespace clang;
13*67e74705SXin Li 
14*67e74705SXin Li namespace {
15*67e74705SXin Li struct GetDeclsVisitor : TestVisitor<GetDeclsVisitor> {
16*67e74705SXin Li   std::function<void(CallExpr *)> OnCall;
17*67e74705SXin Li   SmallVector<Decl *, 4> DeclStack;
18*67e74705SXin Li 
VisitCallExpr__anonea8a47530111::GetDeclsVisitor19*67e74705SXin Li   bool VisitCallExpr(CallExpr *Expr) {
20*67e74705SXin Li     OnCall(Expr);
21*67e74705SXin Li     return true;
22*67e74705SXin Li   }
23*67e74705SXin Li 
TraverseDecl__anonea8a47530111::GetDeclsVisitor24*67e74705SXin Li   bool TraverseDecl(Decl *D) {
25*67e74705SXin Li     DeclStack.push_back(D);
26*67e74705SXin Li     bool Ret = TestVisitor::TraverseDecl(D);
27*67e74705SXin Li     DeclStack.pop_back();
28*67e74705SXin Li     return Ret;
29*67e74705SXin Li   }
30*67e74705SXin Li };
31*67e74705SXin Li 
TEST(LookupTest,replaceNestedName)32*67e74705SXin Li TEST(LookupTest, replaceNestedName) {
33*67e74705SXin Li   GetDeclsVisitor Visitor;
34*67e74705SXin Li 
35*67e74705SXin Li   auto replaceCallExpr = [&](const CallExpr *Expr,
36*67e74705SXin Li                              StringRef ReplacementString) {
37*67e74705SXin Li     const auto *Callee = cast<DeclRefExpr>(Expr->getCallee()->IgnoreImplicit());
38*67e74705SXin Li     const ValueDecl *FD = Callee->getDecl();
39*67e74705SXin Li     return tooling::replaceNestedName(
40*67e74705SXin Li         Callee->getQualifier(), Visitor.DeclStack.back()->getDeclContext(), FD,
41*67e74705SXin Li         ReplacementString);
42*67e74705SXin Li   };
43*67e74705SXin Li 
44*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
45*67e74705SXin Li     EXPECT_EQ("bar", replaceCallExpr(Expr, "::bar"));
46*67e74705SXin Li   };
47*67e74705SXin Li   Visitor.runOver("namespace a { void foo(); }\n"
48*67e74705SXin Li                   "namespace a { void f() { foo(); } }\n");
49*67e74705SXin Li 
50*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
51*67e74705SXin Li     EXPECT_EQ("bar", replaceCallExpr(Expr, "::a::bar"));
52*67e74705SXin Li   };
53*67e74705SXin Li   Visitor.runOver("namespace a { void foo(); }\n"
54*67e74705SXin Li                   "namespace a { void f() { foo(); } }\n");
55*67e74705SXin Li 
56*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
57*67e74705SXin Li     EXPECT_EQ("a::bar", replaceCallExpr(Expr, "::a::bar"));
58*67e74705SXin Li   };
59*67e74705SXin Li   Visitor.runOver("namespace a { void foo(); }\n"
60*67e74705SXin Li                   "namespace b { void f() { a::foo(); } }\n");
61*67e74705SXin Li 
62*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
63*67e74705SXin Li     EXPECT_EQ("a::bar", replaceCallExpr(Expr, "::a::bar"));
64*67e74705SXin Li   };
65*67e74705SXin Li   Visitor.runOver("namespace a { void foo(); }\n"
66*67e74705SXin Li                   "namespace b { namespace a { void foo(); }\n"
67*67e74705SXin Li                   "void f() { a::foo(); } }\n");
68*67e74705SXin Li 
69*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
70*67e74705SXin Li     EXPECT_EQ("c::bar", replaceCallExpr(Expr, "::a::c::bar"));
71*67e74705SXin Li   };
72*67e74705SXin Li   Visitor.runOver("namespace a { namespace b { void foo(); }\n"
73*67e74705SXin Li                   "void f() { b::foo(); } }\n");
74*67e74705SXin Li 
75*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
76*67e74705SXin Li     EXPECT_EQ("bar", replaceCallExpr(Expr, "::a::bar"));
77*67e74705SXin Li   };
78*67e74705SXin Li   Visitor.runOver("namespace a { namespace b { void foo(); }\n"
79*67e74705SXin Li                   "void f() { b::foo(); } }\n");
80*67e74705SXin Li 
81*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
82*67e74705SXin Li     EXPECT_EQ("bar", replaceCallExpr(Expr, "::bar"));
83*67e74705SXin Li   };
84*67e74705SXin Li   Visitor.runOver("void foo(); void f() { foo(); }\n");
85*67e74705SXin Li 
86*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
87*67e74705SXin Li     EXPECT_EQ("::bar", replaceCallExpr(Expr, "::bar"));
88*67e74705SXin Li   };
89*67e74705SXin Li   Visitor.runOver("void foo(); void f() { ::foo(); }\n");
90*67e74705SXin Li 
91*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
92*67e74705SXin Li     EXPECT_EQ("a::bar", replaceCallExpr(Expr, "::a::bar"));
93*67e74705SXin Li   };
94*67e74705SXin Li   Visitor.runOver("namespace a { void foo(); }\nvoid f() { a::foo(); }\n");
95*67e74705SXin Li 
96*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
97*67e74705SXin Li     EXPECT_EQ("a::bar", replaceCallExpr(Expr, "::a::bar"));
98*67e74705SXin Li   };
99*67e74705SXin Li   Visitor.runOver("namespace a { int foo(); }\nauto f = a::foo();\n");
100*67e74705SXin Li 
101*67e74705SXin Li   Visitor.OnCall = [&](CallExpr *Expr) {
102*67e74705SXin Li     EXPECT_EQ("bar", replaceCallExpr(Expr, "::a::bar"));
103*67e74705SXin Li   };
104*67e74705SXin Li   Visitor.runOver(
105*67e74705SXin Li       "namespace a { int foo(); }\nusing a::foo;\nauto f = foo();\n");
106*67e74705SXin Li }
107*67e74705SXin Li 
108*67e74705SXin Li } // end anonymous namespace
109