tom-anders created this revision. tom-anders added reviewers: nridge, kadircet. Herald added a subscriber: arphaman. Herald added a project: All. tom-anders requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
For example, in the folliwong code #include <string> using namespace std::string_literals; int main() { strin^ // Completes `string` instead of `std::string` } The using declaration would make completion drop the std namespace, even though it shouldn't. printNamespaceScope() skips inline namespaces, so to fix this use printQualifiedName() instead See https://github.com/clangd/clangd/issues/1451 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D140915 Files: clang-tools-extra/clangd/CodeComplete.cpp clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp Index: clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -1700,9 +1700,11 @@ namespace ns1 {} namespace ns2 {} // ignore namespace ns3 { namespace nns3 {} } + namespace ns4 { inline namespace ns4_inline {} } namespace foo { using namespace ns1; using namespace ns3::nns3; + using namespace ns4::ns4_inline; } namespace ns { void f() { @@ -1711,10 +1713,11 @@ } )cpp"); - EXPECT_THAT(Requests, - ElementsAre(Field( - &FuzzyFindRequest::Scopes, - UnorderedElementsAre("foo::", "ns1::", "ns3::nns3::")))); + EXPECT_THAT( + Requests, + ElementsAre(Field(&FuzzyFindRequest::Scopes, + UnorderedElementsAre("foo::", "ns1::", "ns3::nns3::", + "ns4::ns4_inline::")))); } TEST(CompletionTest, UnresolvedQualifierIdQuery) { Index: clang-tools-extra/clangd/CodeComplete.cpp =================================================================== --- clang-tools-extra/clangd/CodeComplete.cpp +++ clang-tools-extra/clangd/CodeComplete.cpp @@ -670,8 +670,12 @@ for (auto *Context : CCContext.getVisitedContexts()) { if (isa<TranslationUnitDecl>(Context)) Scopes.AccessibleScopes.push_back(""); // global namespace - else if (isa<NamespaceDecl>(Context)) - Scopes.AccessibleScopes.push_back(printNamespaceScope(*Context)); + else if (const auto *ND = dyn_cast<NamespaceDecl>(Context)) { + if (ND->isInlineNamespace()) + Scopes.AccessibleScopes.push_back(printQualifiedName(*ND) + "::"); + else + Scopes.AccessibleScopes.push_back(printNamespaceScope(*ND)); + } } const CXXScopeSpec *SemaSpecifier =
Index: clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -1700,9 +1700,11 @@ namespace ns1 {} namespace ns2 {} // ignore namespace ns3 { namespace nns3 {} } + namespace ns4 { inline namespace ns4_inline {} } namespace foo { using namespace ns1; using namespace ns3::nns3; + using namespace ns4::ns4_inline; } namespace ns { void f() { @@ -1711,10 +1713,11 @@ } )cpp"); - EXPECT_THAT(Requests, - ElementsAre(Field( - &FuzzyFindRequest::Scopes, - UnorderedElementsAre("foo::", "ns1::", "ns3::nns3::")))); + EXPECT_THAT( + Requests, + ElementsAre(Field(&FuzzyFindRequest::Scopes, + UnorderedElementsAre("foo::", "ns1::", "ns3::nns3::", + "ns4::ns4_inline::")))); } TEST(CompletionTest, UnresolvedQualifierIdQuery) { Index: clang-tools-extra/clangd/CodeComplete.cpp =================================================================== --- clang-tools-extra/clangd/CodeComplete.cpp +++ clang-tools-extra/clangd/CodeComplete.cpp @@ -670,8 +670,12 @@ for (auto *Context : CCContext.getVisitedContexts()) { if (isa<TranslationUnitDecl>(Context)) Scopes.AccessibleScopes.push_back(""); // global namespace - else if (isa<NamespaceDecl>(Context)) - Scopes.AccessibleScopes.push_back(printNamespaceScope(*Context)); + else if (const auto *ND = dyn_cast<NamespaceDecl>(Context)) { + if (ND->isInlineNamespace()) + Scopes.AccessibleScopes.push_back(printQualifiedName(*ND) + "::"); + else + Scopes.AccessibleScopes.push_back(printNamespaceScope(*ND)); + } } const CXXScopeSpec *SemaSpecifier =
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits