diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -70,6 +70,7 @@ #include "llvm/Support/ScopedPrinter.h" #include #include +#include // We log detailed candidate here if you run with -debug-only=codecomplete. #define DEBUG_TYPE "CodeComplete" @@ -1655,9 +1656,10 @@ evaluateSymbolAndRelevance(Scores.Quality, Scores.Relevance); // NameMatch is in fact a multiplier on total score, so rescoring is // sound. - Scores.ExcludingName = Relevance.NameMatch - ? Scores.Total / Relevance.NameMatch - : Scores.Quality; + Scores.ExcludingName = + Relevance.NameMatch > std::numeric_limits::epsilon() + ? Scores.Total / Relevance.NameMatch + : Scores.Quality; return Scores; case RM::DecisionForest: diff --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp --- a/clang-tools-extra/clangd/FindSymbols.cpp +++ b/clang-tools-extra/clangd/FindSymbols.cpp @@ -25,6 +25,7 @@ #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Path.h" #include "llvm/Support/ScopedPrinter.h" +#include #include #define DEBUG_TYPE "FindSymbols" @@ -146,8 +147,9 @@ return; } Relevance.merge(Sym); - auto Score = evaluateSymbolAndRelevance(Quality.evaluateHeuristics(), - Relevance.evaluateHeuristics()); + auto QualScore = Quality.evaluateHeuristics(); + auto RelScore = Relevance.evaluateHeuristics(); + auto Score = evaluateSymbolAndRelevance(QualScore, RelScore); dlog("FindSymbols: {0}{1} = {2}\n{3}{4}\n", Sym.Scope, Sym.Name, Score, Quality, Relevance); @@ -159,7 +161,9 @@ Info.containerName = Scope.str(); // Exposed score excludes fuzzy-match component, for client-side re-ranking. - Info.score = Score / Relevance.NameMatch; + Info.score = Relevance.NameMatch > std::numeric_limits::epsilon() + ? Score / Relevance.NameMatch + : QualScore; Top.push({Score, std::move(Info)}); }); for (auto &R : std::move(Top).items())