diff --git a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp --- a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp @@ -141,10 +141,12 @@ } // No relevant "using" statements. Try the nearest namespace level. - const auto *NS = Inputs.ASTSelection.commonAncestor() - ->getDeclContext() - .getEnclosingNamespaceContext(); - if (auto *ND = dyn_cast(NS)) { + const DeclContext *ParentDeclCtx = + &Inputs.ASTSelection.commonAncestor()->getDeclContext(); + while (ParentDeclCtx && !ParentDeclCtx->isFileContext()) { + ParentDeclCtx = ParentDeclCtx->getLexicalParent(); + } + if (auto *ND = llvm::dyn_cast_or_null(ParentDeclCtx)) { auto Toks = Inputs.AST->getTokens().expandedTokens(ND->getSourceRange()); const auto *Tok = llvm::find_if(Toks, [](const syntax::Token &Tok) { return Tok.kind() == tok::l_brace; diff --git a/clang-tools-extra/clangd/unittests/TweakTests.cpp b/clang-tools-extra/clangd/unittests/TweakTests.cpp --- a/clang-tools-extra/clangd/unittests/TweakTests.cpp +++ b/clang-tools-extra/clangd/unittests/TweakTests.cpp @@ -2663,6 +2663,23 @@ void fun() { CALL(ff); +})cpp"}, + // Parent namespace != lexical parent namespace + {R"cpp( +#include "test.hpp" +namespace foo { void fun(); } + +void foo::fun() { + one::two::f^f(); +})cpp", + R"cpp( +#include "test.hpp" +using one::two::ff; + +namespace foo { void fun(); } + +void foo::fun() { + ff(); })cpp"}}; llvm::StringMap EditedFiles; for (const auto &Case : Cases) {