ilya-biryukov added inline comments.

================
Comment at: 
clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:179
+
+  if (ContainingNS) {
+    for (auto ReDeclNS : ContainingNS->redecls())
----------------
usaxena95 wrote:
> ilya-biryukov wrote:
> > Could you explain why don't we always just run across the whole TU?
> > What disadvantages would that have?
> Working with a using decl inside the `ContainingNS` is quite similar to our 
> initial version with GlobalNS. 
> For example we take advantage of that to replace the whole qualifier with 
> just TargetNS. We use the fact that since `using namespace TargetNS;` was 
> valid inside `ContainingNS` then qualifying the reference with just 
> `TargetNS` would also be valid inside `ContainingNS`.
> 
> When we are outside `ContainingNS`,  we would have to fully qualify the ref 
> to be 100% correct. To reduce the qualification we might have to figure out 
> which is enclosing NS for the reference.
> 
> ```
> namespace aa {
> namespace bb { 
> struct map {}; 
> }
> using namespace b^b;
> }
> int main() { 
>  aa::map m1;  // We do not qualify this currently.
> }
> ```
> 
If we detect references outside `ContainingNS`, which are definitely broken, 
fully-qualifying seems better than silently ignoring those.

I think they're quite easy to detect:
- Their target should be inside `TargetNS`,
- Their `QualifierLoc` should reference `ContainingNS`.

We know that those won't work anymore, so we should qualify them.

Leaving broken code is definitely a bad idea, if we can easily detect and fix 
it.


================
Comment at: 
clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:110
     return false;
-  if (!dyn_cast<Decl>(TargetDirective->getDeclContext()))
-    return false;
+  auto *DeclCtx = TargetDirective->getDeclContext();
   // FIXME: Unavailable for namespaces containing using-namespace decl.
----------------
NIT: you could use `DC` here, clangd uses Go-style short identifiers for locals 
and parameters extensively


================
Comment at: 
clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:146
+  std::vector<CharSourceRange> QualifierReplacements;
+  auto SelectRefToQualify = [&](ReferenceLoc Ref) {
+    if (Ref.Targets.empty())
----------------
NIT: Maybe call it `QualifyRef`? Was a bit confused by `Select`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69162/new/

https://reviews.llvm.org/D69162



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to