Author: ioeric Date: Thu Jul 5 01:14:04 2018 New Revision: 336318 URL: http://llvm.org/viewvc/llvm-project?rev=336318&view=rev Log: [clangd] Treat class constructor as in the same scope as the class in ranking.
Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, cfe-commits Differential Revision: https://reviews.llvm.org/D48933 Modified: clang-tools-extra/trunk/clangd/Quality.cpp clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp clang-tools-extra/trunk/unittests/clangd/TestTU.cpp clang-tools-extra/trunk/unittests/clangd/TestTU.h Modified: clang-tools-extra/trunk/clangd/Quality.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Quality.cpp?rev=336318&r1=336317&r2=336318&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Quality.cpp (original) +++ clang-tools-extra/trunk/clangd/Quality.cpp Thu Jul 5 01:14:04 2018 @@ -11,10 +11,12 @@ #include "URI.h" #include "index/Index.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclVisitor.h" #include "clang/Basic/CharInfo.h" #include "clang/Basic/SourceManager.h" #include "clang/Sema/CodeCompleteConsumer.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" @@ -195,6 +197,9 @@ ComputeScope(const NamedDecl *D) { if (auto *R = dyn_cast_or_null<RecordDecl>(D)) if (R->isInjectedClassName()) DC = DC->getParent(); + // Class constructor should have the same scope as the class. + if (const auto *Ctor = llvm::dyn_cast<CXXConstructorDecl>(D)) + DC = DC->getParent(); bool InClass = false; for (; !DC->isFileContext(); DC = DC->getParent()) { if (DC->isFunctionOrMethod()) Modified: clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp?rev=336318&r1=336317&r2=336318&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp Thu Jul 5 01:14:04 2018 @@ -21,6 +21,9 @@ #include "Quality.h" #include "TestFS.h" #include "TestTU.h" +#include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" +#include "llvm/Support/Casting.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -199,6 +202,31 @@ TEST(QualityTests, SortText) { EXPECT_LT(sortText(0, "a"), sortText(0, "z")); } +TEST(QualityTests, NoBoostForClassConstructor) { + auto Header = TestTU::withHeaderCode(R"cpp( + class Foo { + public: + Foo(int); + }; + )cpp"); + auto Symbols = Header.headerSymbols(); + auto AST = Header.build(); + + const NamedDecl *Foo = &findDecl(AST, "Foo"); + SymbolRelevanceSignals Cls; + Cls.merge(CodeCompletionResult(Foo, /*Priority=*/0)); + + const NamedDecl *CtorDecl = &findAnyDecl(AST, [](const NamedDecl &ND) { + return (ND.getQualifiedNameAsString() == "Foo::Foo") && + llvm::isa<CXXConstructorDecl>(&ND); + }); + SymbolRelevanceSignals Ctor; + Ctor.merge(CodeCompletionResult(CtorDecl, /*Priority=*/0)); + + EXPECT_EQ(Cls.Scope, SymbolRelevanceSignals::GlobalScope); + EXPECT_EQ(Ctor.Scope, SymbolRelevanceSignals::GlobalScope); +} + } // namespace } // namespace clangd } // namespace clang Modified: clang-tools-extra/trunk/unittests/clangd/TestTU.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/TestTU.cpp?rev=336318&r1=336317&r2=336318&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/TestTU.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/TestTU.cpp Thu Jul 5 01:14:04 2018 @@ -93,26 +93,35 @@ const NamedDecl &findDecl(ParsedAST &AST return LookupDecl(*Scope, Components.back()); } -const NamedDecl &findAnyDecl(ParsedAST &AST, llvm::StringRef Name) { +const NamedDecl &findAnyDecl(ParsedAST &AST, + std::function<bool(const NamedDecl &)> Callback) { struct Visitor : RecursiveASTVisitor<Visitor> { - llvm::StringRef Name; + decltype(Callback) CB; llvm::SmallVector<const NamedDecl *, 1> Decls; bool VisitNamedDecl(const NamedDecl *ND) { - if (auto *ID = ND->getIdentifier()) - if (ID->getName() == Name) - Decls.push_back(ND); + if (CB(*ND)) + Decls.push_back(ND); return true; } } Visitor; - Visitor.Name = Name; + Visitor.CB = Callback; for (Decl *D : AST.getLocalTopLevelDecls()) Visitor.TraverseDecl(D); if (Visitor.Decls.size() != 1) { - ADD_FAILURE() << Visitor.Decls.size() << " symbols named " << Name; + ADD_FAILURE() << Visitor.Decls.size() << " symbols matched."; assert(Visitor.Decls.size() == 1); } return *Visitor.Decls.front(); } +const NamedDecl &findAnyDecl(ParsedAST &AST, llvm::StringRef Name) { + return findAnyDecl(AST, [Name](const NamedDecl &ND) { + if (auto *ID = ND.getIdentifier()) + if (ID->getName() == Name) + return true; + return false; + }); +} + } // namespace clangd } // namespace clang Modified: clang-tools-extra/trunk/unittests/clangd/TestTU.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/TestTU.h?rev=336318&r1=336317&r2=336318&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/TestTU.h (original) +++ clang-tools-extra/trunk/unittests/clangd/TestTU.h Thu Jul 5 01:14:04 2018 @@ -56,6 +56,9 @@ struct TestTU { const Symbol &findSymbol(const SymbolSlab &, llvm::StringRef QName); // Look up an AST symbol by qualified name, which must be unique and top-level. const NamedDecl &findDecl(ParsedAST &AST, llvm::StringRef QName); +// Look up a main-file AST symbol that satisfies \p Filter. +const NamedDecl &findAnyDecl(ParsedAST &AST, + std::function<bool(const NamedDecl &)> Filter); // Look up a main-file AST symbol by unqualified name, which must be unique. const NamedDecl &findAnyDecl(ParsedAST &AST, llvm::StringRef Name); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits