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