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