[PATCH] D49012: [clangd] Uprank delcarations when "using q::name" is present in the main file

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 6 02:53:45 PDT 2018

sammccall added a comment.

Nice! Mostly just a few nits.

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:83
+    namespace foo {
+    class Bar {};
nit: can we have slightly more descriptive names here as this is a long test?
e.g. `namespace hdr { class Used; }`
(I think if you forward-declare the class, clang-format will let you have it on one line)

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:88
+    namespace bar {
+    class Foo {};
+    } // namespace bar
this bar::Foo proximity test doesn't seem to be substantially different from header(), could you drop it to reduce noise?(

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:122
   EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 1.0f)
-      << "Current file and header";
+      << "Current file and definition in header";
definition is not relevant here, AFAICS, revert this comment?
(and in fact this is defined in the main file, not the header)

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:128
+  UsingShadowDecl *Shadow;
+  auto findUsingDecl = [&SymbolName, &Shadow,
+                        &FoundDecl](const NamedDecl &ND) -> bool {
nit: spelling out the captures and types here adds a lot of noise to the test and doesn't seem to gain much in return. What about inlining this, capturing `[&]`, and letting the return type be implicit?

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:131
+    if (const UsingDecl *Using = dyn_cast<UsingDecl>(&ND)) {
+      if (UsingShadowDecl *ShadowDecl = *Using->shadow_begin()) {
+        if (ShadowDecl->getTargetDecl()->getName() == SymbolName) {
doesn't this crash if there are no shadows?

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:133
+        if (ShadowDecl->getTargetDecl()->getName() == SymbolName) {
+          Shadow = ShadowDecl;
+          FoundDecl = Shadow->getTargetDecl();
`findAnyDecl` is designed to return the decl you find, idiomatically the filter shouldn't have side effects.

What about:
auto *Shadow = *findAnyDecl(AST, [&](const NamedDecl& ND) {
  if (... Using = ...)
    return Using->getQualifiedNameAsString() == "Bar" && Using->shadow_size();
  return false;
CodeCompletionResult Result(Shadow->getTargetDecl());

Comment at: clang-tools-extra/unittests/clangd/QualityTests.cpp:146
+  EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 1.0f)
+      << "Uprank declaration which has using directive in current directory";
nit: "current directory" isn't relevant here, rather "main file"?
nit: "uprank" isn't quite right here - ranking/scoring is a concern of extraction, rather evaluate(). Prefer just describing the situation ("Using declaration in main file")
nit: these are using declarations, not using directives

Comment at: clang/include/clang/Sema/CodeCompleteConsumer.h:852
+                       std::vector<FixItHint> FixIts = std::vector<FixItHint>(),
+                       const UsingShadowDecl *ShadowDecl = nullptr)
       : Declaration(Declaration), Priority(Priority), Kind(RK_Declaration),
we don't need both the constructor and the setter/public field - I think the constructor param is actually unused. Drop?

Comment at: clang/include/clang/Sema/CodeCompleteConsumer.h:911
+  void setShadowDecl(const UsingShadowDecl *Shadow) {
+    this->ShadowDecl = Shadow;
the field is already public, no need to add a setter


More information about the cfe-commits mailing list