kbobyrev updated this revision to Diff 363383. kbobyrev added a comment. Add test, improve docs in code.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107047/new/ https://reviews.llvm.org/D107047 Files: clang-tools-extra/clangd/AST.cpp clang-tools-extra/clangd/unittests/ASTTests.cpp Index: clang-tools-extra/clangd/unittests/ASTTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ASTTests.cpp +++ clang-tools-extra/clangd/unittests/ASTTests.cpp @@ -259,6 +259,18 @@ {"ns2::", "ns2::", ""}, {"ns1::"}, }, + { + R"cpp( + namespace ns { + extern "C" { + typedef int Foo; + } + } + void insert(); // ns::Foo + )cpp", + {"ns::"}, + {}, + }, }; for (const auto &Case : Cases) { Annotations Test(Case.Test); Index: clang-tools-extra/clangd/AST.cpp =================================================================== --- clang-tools-extra/clangd/AST.cpp +++ clang-tools-extra/clangd/AST.cpp @@ -119,14 +119,17 @@ (void)ReachedNS; NNS = NestedNameSpecifier::Create(Context, nullptr, false, TD->getTypeForDecl()); - } else { + } else if (auto *NSD = llvm::dyn_cast<NamespaceDecl>(CurContext)) { ReachedNS = true; - auto *NSD = llvm::cast<NamespaceDecl>(CurContext); NNS = NestedNameSpecifier::Create(Context, nullptr, NSD); - // Anonymous and inline namespace names are not spelled while qualifying a - // name, so skip those. + // Anonymous and inline namespace names are not spelled while qualifying + // a name, so skip those. if (NSD->isAnonymousNamespace() || NSD->isInlineNamespace()) continue; + } else { + // Other types of contexts cannot be spelled in code, just skip over + // them. + continue; } // Stop if this namespace is already visible at DestContext. if (IsVisible(NNS))
Index: clang-tools-extra/clangd/unittests/ASTTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ASTTests.cpp +++ clang-tools-extra/clangd/unittests/ASTTests.cpp @@ -259,6 +259,18 @@ {"ns2::", "ns2::", ""}, {"ns1::"}, }, + { + R"cpp( + namespace ns { + extern "C" { + typedef int Foo; + } + } + void insert(); // ns::Foo + )cpp", + {"ns::"}, + {}, + }, }; for (const auto &Case : Cases) { Annotations Test(Case.Test); Index: clang-tools-extra/clangd/AST.cpp =================================================================== --- clang-tools-extra/clangd/AST.cpp +++ clang-tools-extra/clangd/AST.cpp @@ -119,14 +119,17 @@ (void)ReachedNS; NNS = NestedNameSpecifier::Create(Context, nullptr, false, TD->getTypeForDecl()); - } else { + } else if (auto *NSD = llvm::dyn_cast<NamespaceDecl>(CurContext)) { ReachedNS = true; - auto *NSD = llvm::cast<NamespaceDecl>(CurContext); NNS = NestedNameSpecifier::Create(Context, nullptr, NSD); - // Anonymous and inline namespace names are not spelled while qualifying a - // name, so skip those. + // Anonymous and inline namespace names are not spelled while qualifying + // a name, so skip those. if (NSD->isAnonymousNamespace() || NSD->isInlineNamespace()) continue; + } else { + // Other types of contexts cannot be spelled in code, just skip over + // them. + continue; } // Stop if this namespace is already visible at DestContext. if (IsVisible(NNS))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits