[PATCH] D68562: [clangd] Add RemoveUsingNamespace tweak.

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 7 08:18:11 PDT 2019


ilya-biryukov added inline comments.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:86
+  if (const Decl *ParentDecl = Node->Parent->ASTNode.get<Decl>()) {
+    return llvm::isa<TranslationUnitDecl>(ParentDecl);
+  }
----------------
NIT: remove redundant `{}`  around this `return`


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:99
+    return false;
+  if (!dyn_cast<Decl>(TargetDirective->getDeclContext()))
+    return false;
----------------
I believe this check is redundant in presence of `isTopLevelDecl()`...
(It used to check the 'using namespace' is not inside a function body)


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:121
+      for (auto *T : Ref.Targets) {
+        // FIXME: handle inline namespaces, unscoped enumerators.
+        if (T->getDeclContext() != TargetDirective->getNominatedNamespace())
----------------
Could you take a look at handling these?

Also happy if we make it a separate change, but we shouldn't delay this.
Both are important cases.

The examples should roughly be:
```
namespace std {
inline namespace v1 {
  struct vector {};
}
}

using namespace std;
vector v;
```

and
```
namespace tokens {
enum Token {
  comma, identifier, numeric
};
}

using namespace tokens;
auto x = comma; 
```


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp:163
+std::string RemoveUsingNamespace::title() const {
+  return llvm::formatv("Remove using namespace, add qualifiers instead");
+}
----------------
NIT: could you rephrase as `re-qualify names instead`
"add qualifiers" confuses some people, this can be read as "add a const qualifier"


================
Comment at: clang-tools-extra/clangd/unittests/TweakTests.cpp:781
+        namespace bb { struct map {}; }
+        using namespace bb; // Qualifies this.
+      }
----------------
Argh, this should definitely be fixed :-(
One simple way to handle this particular only qualify references, which come **after** the first `using namespace` we are removing.

There's a `SourceManager::isBeforeInTranslationUnit` function that can be used to find out whether something is written before or after a particular point.

This won't fix all of the cases, but fixing in the general case seems hard.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D68562





More information about the cfe-commits mailing list