xref: /llvm-project/clang-tools-extra/clangd/unittests/tweaks/RemoveUsingNamespaceTests.cpp (revision 46575f60380b18bf20c5f4cafc5fd06f561c4e7b)
15934a791SAdam Czachorowski //===-- RemoveUsingNamespaceTest.cpp ----------------------------*- C++ -*-===//
25934a791SAdam Czachorowski //
35934a791SAdam Czachorowski // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45934a791SAdam Czachorowski // See https://llvm.org/LICENSE.txt for license information.
55934a791SAdam Czachorowski // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65934a791SAdam Czachorowski //
75934a791SAdam Czachorowski //===----------------------------------------------------------------------===//
85934a791SAdam Czachorowski 
95934a791SAdam Czachorowski #include "TweakTesting.h"
105934a791SAdam Czachorowski #include "gmock/gmock-matchers.h"
115934a791SAdam Czachorowski #include "gmock/gmock.h"
125934a791SAdam Czachorowski #include "gtest/gtest.h"
135934a791SAdam Czachorowski 
145934a791SAdam Czachorowski namespace clang {
155934a791SAdam Czachorowski namespace clangd {
165934a791SAdam Czachorowski namespace {
175934a791SAdam Czachorowski 
185934a791SAdam Czachorowski TWEAK_TEST(RemoveUsingNamespace);
195934a791SAdam Czachorowski 
TEST_F(RemoveUsingNamespaceTest,All)205934a791SAdam Czachorowski TEST_F(RemoveUsingNamespaceTest, All) {
215934a791SAdam Czachorowski   std::pair<llvm::StringRef /*Input*/, llvm::StringRef /*Expected*/> Cases[] = {
225934a791SAdam Czachorowski       {// Remove all occurrences of ns. Qualify only unqualified.
235934a791SAdam Czachorowski        R"cpp(
245934a791SAdam Czachorowski       namespace ns1 { struct vector {}; }
255934a791SAdam Czachorowski       namespace ns2 { struct map {}; }
265934a791SAdam Czachorowski       using namespace n^s1;
275934a791SAdam Czachorowski       using namespace ns2;
285934a791SAdam Czachorowski       using namespace ns1;
295934a791SAdam Czachorowski       int main() {
305934a791SAdam Czachorowski         ns1::vector v1;
315934a791SAdam Czachorowski         vector v2;
325934a791SAdam Czachorowski         map m1;
335934a791SAdam Czachorowski       }
345934a791SAdam Czachorowski     )cpp",
355934a791SAdam Czachorowski        R"cpp(
365934a791SAdam Czachorowski       namespace ns1 { struct vector {}; }
375934a791SAdam Czachorowski       namespace ns2 { struct map {}; }
385934a791SAdam Czachorowski 
395934a791SAdam Czachorowski       using namespace ns2;
405934a791SAdam Czachorowski 
415934a791SAdam Czachorowski       int main() {
425934a791SAdam Czachorowski         ns1::vector v1;
435934a791SAdam Czachorowski         ns1::vector v2;
445934a791SAdam Czachorowski         map m1;
455934a791SAdam Czachorowski       }
465934a791SAdam Czachorowski     )cpp"},
475934a791SAdam Czachorowski       {// Ident to be qualified is a macro arg.
485934a791SAdam Czachorowski        R"cpp(
495934a791SAdam Czachorowski       #define DECLARE(x, y) x y
505934a791SAdam Czachorowski       namespace ns { struct vector {}; }
515934a791SAdam Czachorowski       using namespace n^s;
525934a791SAdam Czachorowski       int main() {
535934a791SAdam Czachorowski         DECLARE(ns::vector, v1);
545934a791SAdam Czachorowski         DECLARE(vector, v2);
555934a791SAdam Czachorowski       }
565934a791SAdam Czachorowski     )cpp",
575934a791SAdam Czachorowski        R"cpp(
585934a791SAdam Czachorowski       #define DECLARE(x, y) x y
595934a791SAdam Czachorowski       namespace ns { struct vector {}; }
605934a791SAdam Czachorowski 
615934a791SAdam Czachorowski       int main() {
625934a791SAdam Czachorowski         DECLARE(ns::vector, v1);
635934a791SAdam Czachorowski         DECLARE(ns::vector, v2);
645934a791SAdam Czachorowski       }
655934a791SAdam Czachorowski     )cpp"},
665934a791SAdam Czachorowski       {// Nested namespace: Fully qualify ident from inner ns.
675934a791SAdam Czachorowski        R"cpp(
685934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
695934a791SAdam Czachorowski       using namespace aa::b^b;
705934a791SAdam Czachorowski       int main() {
715934a791SAdam Czachorowski         map m;
725934a791SAdam Czachorowski       }
735934a791SAdam Czachorowski     )cpp",
745934a791SAdam Czachorowski        R"cpp(
755934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
765934a791SAdam Czachorowski 
775934a791SAdam Czachorowski       int main() {
785934a791SAdam Czachorowski         aa::bb::map m;
795934a791SAdam Czachorowski       }
805934a791SAdam Czachorowski     )cpp"},
815934a791SAdam Czachorowski       {// Nested namespace: Fully qualify ident from inner ns.
825934a791SAdam Czachorowski        R"cpp(
835934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
845934a791SAdam Czachorowski       using namespace a^a;
855934a791SAdam Czachorowski       int main() {
865934a791SAdam Czachorowski         bb::map m;
875934a791SAdam Czachorowski       }
885934a791SAdam Czachorowski     )cpp",
895934a791SAdam Czachorowski        R"cpp(
905934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
915934a791SAdam Czachorowski 
925934a791SAdam Czachorowski       int main() {
935934a791SAdam Czachorowski         aa::bb::map m;
945934a791SAdam Czachorowski       }
955934a791SAdam Czachorowski     )cpp"},
965934a791SAdam Czachorowski       {// Typedef.
975934a791SAdam Czachorowski        R"cpp(
985934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
995934a791SAdam Czachorowski       using namespace a^a;
1005934a791SAdam Czachorowski       typedef bb::map map;
1015934a791SAdam Czachorowski       int main() { map M; }
1025934a791SAdam Czachorowski     )cpp",
1035934a791SAdam Czachorowski        R"cpp(
1045934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
1055934a791SAdam Czachorowski 
1065934a791SAdam Czachorowski       typedef aa::bb::map map;
1075934a791SAdam Czachorowski       int main() { map M; }
1085934a791SAdam Czachorowski     )cpp"},
1095934a791SAdam Czachorowski       {// FIXME: Nested namespaces: Not aware of using ns decl of outer ns.
1105934a791SAdam Czachorowski        R"cpp(
1115934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
1125934a791SAdam Czachorowski       using name[[space aa::b]]b;
1135934a791SAdam Czachorowski       using namespace aa;
1145934a791SAdam Czachorowski       int main() {
1155934a791SAdam Czachorowski         map m;
1165934a791SAdam Czachorowski       }
1175934a791SAdam Czachorowski     )cpp",
1185934a791SAdam Czachorowski        R"cpp(
1195934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
1205934a791SAdam Czachorowski 
1215934a791SAdam Czachorowski       using namespace aa;
1225934a791SAdam Czachorowski       int main() {
1235934a791SAdam Czachorowski         aa::bb::map m;
1245934a791SAdam Czachorowski       }
1255934a791SAdam Czachorowski     )cpp"},
1265934a791SAdam Czachorowski       {// Does not qualify ident from inner namespace.
1275934a791SAdam Czachorowski        R"cpp(
1285934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
1295934a791SAdam Czachorowski       using namespace aa::bb;
1305934a791SAdam Czachorowski       using namespace a^a;
1315934a791SAdam Czachorowski       int main() {
1325934a791SAdam Czachorowski         map m;
1335934a791SAdam Czachorowski       }
1345934a791SAdam Czachorowski     )cpp",
1355934a791SAdam Czachorowski        R"cpp(
1365934a791SAdam Czachorowski       namespace aa { namespace bb { struct map {}; }}
1375934a791SAdam Czachorowski       using namespace aa::bb;
1385934a791SAdam Czachorowski 
1395934a791SAdam Czachorowski       int main() {
1405934a791SAdam Czachorowski         map m;
1415934a791SAdam Czachorowski       }
1425934a791SAdam Czachorowski     )cpp"},
1435934a791SAdam Czachorowski       {// Available only for top level namespace decl.
1445934a791SAdam Czachorowski        R"cpp(
1455934a791SAdam Czachorowski         namespace aa {
1465934a791SAdam Czachorowski           namespace bb { struct map {}; }
1475934a791SAdam Czachorowski           using namespace b^b;
1485934a791SAdam Czachorowski         }
1495934a791SAdam Czachorowski         int main() { aa::map m; }
1505934a791SAdam Czachorowski     )cpp",
1515934a791SAdam Czachorowski        "unavailable"},
1525934a791SAdam Czachorowski       {// FIXME: Unavailable for namespaces containing using-namespace decl.
1535934a791SAdam Czachorowski        R"cpp(
1545934a791SAdam Czachorowski       namespace aa {
1555934a791SAdam Czachorowski         namespace bb { struct map {}; }
1565934a791SAdam Czachorowski         using namespace bb;
1575934a791SAdam Czachorowski       }
1585934a791SAdam Czachorowski       using namespace a^a;
1595934a791SAdam Czachorowski       int main() {
1605934a791SAdam Czachorowski         map m;
1615934a791SAdam Czachorowski       }
1625934a791SAdam Czachorowski     )cpp",
1635934a791SAdam Czachorowski        "unavailable"},
1645934a791SAdam Czachorowski       {R"cpp(
1655934a791SAdam Czachorowski       namespace a::b { struct Foo {}; }
1665934a791SAdam Czachorowski       using namespace a;
1675934a791SAdam Czachorowski       using namespace a::[[b]];
1685934a791SAdam Czachorowski       using namespace b;
1695934a791SAdam Czachorowski       int main() { Foo F;}
1705934a791SAdam Czachorowski     )cpp",
1715934a791SAdam Czachorowski        R"cpp(
1725934a791SAdam Czachorowski       namespace a::b { struct Foo {}; }
1735934a791SAdam Czachorowski       using namespace a;
1745934a791SAdam Czachorowski 
1755934a791SAdam Czachorowski 
1765934a791SAdam Czachorowski       int main() { a::b::Foo F;}
1775934a791SAdam Czachorowski     )cpp"},
1785934a791SAdam Czachorowski       {R"cpp(
1795934a791SAdam Czachorowski       namespace a::b { struct Foo {}; }
1805934a791SAdam Czachorowski       using namespace a;
1815934a791SAdam Czachorowski       using namespace a::b;
1825934a791SAdam Czachorowski       using namespace [[b]];
1835934a791SAdam Czachorowski       int main() { Foo F;}
1845934a791SAdam Czachorowski     )cpp",
1855934a791SAdam Czachorowski        R"cpp(
1865934a791SAdam Czachorowski       namespace a::b { struct Foo {}; }
1875934a791SAdam Czachorowski       using namespace a;
1885934a791SAdam Czachorowski 
1895934a791SAdam Czachorowski 
1905934a791SAdam Czachorowski       int main() { b::Foo F;}
1915934a791SAdam Czachorowski     )cpp"},
1925934a791SAdam Czachorowski       {// Enumerators.
1935934a791SAdam Czachorowski        R"cpp(
1945934a791SAdam Czachorowski       namespace tokens {
1955934a791SAdam Czachorowski       enum Token {
1965934a791SAdam Czachorowski         comma, identifier, numeric
1975934a791SAdam Czachorowski       };
1985934a791SAdam Czachorowski       }
1995934a791SAdam Czachorowski       using namespace tok^ens;
2005934a791SAdam Czachorowski       int main() {
2015934a791SAdam Czachorowski         auto x = comma;
2025934a791SAdam Czachorowski       }
2035934a791SAdam Czachorowski     )cpp",
2045934a791SAdam Czachorowski        R"cpp(
2055934a791SAdam Czachorowski       namespace tokens {
2065934a791SAdam Czachorowski       enum Token {
2075934a791SAdam Czachorowski         comma, identifier, numeric
2085934a791SAdam Czachorowski       };
2095934a791SAdam Czachorowski       }
2105934a791SAdam Czachorowski 
2115934a791SAdam Czachorowski       int main() {
2125934a791SAdam Czachorowski         auto x = tokens::comma;
2135934a791SAdam Czachorowski       }
2145934a791SAdam Czachorowski     )cpp"},
2155934a791SAdam Czachorowski       {// inline namespaces.
2165934a791SAdam Czachorowski        R"cpp(
2175934a791SAdam Czachorowski       namespace std { inline namespace ns1 { inline namespace ns2 { struct vector {}; }}}
2185934a791SAdam Czachorowski       using namespace st^d;
2195934a791SAdam Czachorowski       int main() {
2205934a791SAdam Czachorowski         vector V;
2215934a791SAdam Czachorowski       }
2225934a791SAdam Czachorowski     )cpp",
2235934a791SAdam Czachorowski        R"cpp(
2245934a791SAdam Czachorowski       namespace std { inline namespace ns1 { inline namespace ns2 { struct vector {}; }}}
2255934a791SAdam Czachorowski 
2265934a791SAdam Czachorowski       int main() {
2275934a791SAdam Czachorowski         std::vector V;
2285934a791SAdam Czachorowski       }
229f5a2ef80Sv1nh1shungry     )cpp"},
230f5a2ef80Sv1nh1shungry       {// Does not qualify operators declared in a non-class context
231f5a2ef80Sv1nh1shungry        R"cpp(
232f5a2ef80Sv1nh1shungry       namespace ns {
233f5a2ef80Sv1nh1shungry       struct Foo {};
234f5a2ef80Sv1nh1shungry       void operator+(const Foo &, int) {}
235f5a2ef80Sv1nh1shungry       }
236f5a2ef80Sv1nh1shungry       using namespace n^s;
237f5a2ef80Sv1nh1shungry       int main() {
238f5a2ef80Sv1nh1shungry         Foo foo;
239f5a2ef80Sv1nh1shungry         foo + 10;
240f5a2ef80Sv1nh1shungry       }
241f5a2ef80Sv1nh1shungry     )cpp",
242f5a2ef80Sv1nh1shungry        R"cpp(
243f5a2ef80Sv1nh1shungry       namespace ns {
244f5a2ef80Sv1nh1shungry       struct Foo {};
245f5a2ef80Sv1nh1shungry       void operator+(const Foo &, int) {}
246f5a2ef80Sv1nh1shungry       }
247f5a2ef80Sv1nh1shungry 
248f5a2ef80Sv1nh1shungry       int main() {
249f5a2ef80Sv1nh1shungry         ns::Foo foo;
250f5a2ef80Sv1nh1shungry         foo + 10;
251f5a2ef80Sv1nh1shungry       }
25282ca918bSv1nh1shungry     )cpp"},
25382ca918bSv1nh1shungry       {// Does not qualify user-defined literals
25482ca918bSv1nh1shungry        R"cpp(
25582ca918bSv1nh1shungry       namespace ns {
25682ca918bSv1nh1shungry       long double operator "" _w(long double);
25782ca918bSv1nh1shungry       }
25882ca918bSv1nh1shungry       using namespace n^s;
25982ca918bSv1nh1shungry       int main() { 1.5_w; }
26082ca918bSv1nh1shungry     )cpp",
26182ca918bSv1nh1shungry        R"cpp(
26282ca918bSv1nh1shungry       namespace ns {
26382ca918bSv1nh1shungry       long double operator "" _w(long double);
26482ca918bSv1nh1shungry       }
26582ca918bSv1nh1shungry 
26682ca918bSv1nh1shungry       int main() { 1.5_w; }
267*46575f60Sv1nh1shungry     )cpp"},
268*46575f60Sv1nh1shungry       {
269*46575f60Sv1nh1shungry           R"cpp(
270*46575f60Sv1nh1shungry       namespace a { inline namespace b { void foobar(); } }
271*46575f60Sv1nh1shungry       using namespace a::[[b]];
272*46575f60Sv1nh1shungry       int main() { foobar(); }
273*46575f60Sv1nh1shungry     )cpp",
274*46575f60Sv1nh1shungry           R"cpp(
275*46575f60Sv1nh1shungry       namespace a { inline namespace b { void foobar(); } }
276*46575f60Sv1nh1shungry 
277*46575f60Sv1nh1shungry       int main() { a::b::foobar(); }
2785934a791SAdam Czachorowski     )cpp"}};
2795934a791SAdam Czachorowski   for (auto C : Cases)
2805934a791SAdam Czachorowski     EXPECT_EQ(C.second, apply(C.first)) << C.first;
2815934a791SAdam Czachorowski }
2825934a791SAdam Czachorowski 
2835934a791SAdam Czachorowski } // namespace
2845934a791SAdam Czachorowski } // namespace clangd
2855934a791SAdam Czachorowski } // namespace clang
286