Author: Kadir Cetinkaya Date: 2021-01-20T12:50:25+01:00 New Revision: a1d4649a5b176bf826685cac5cc4416b6498bdf9
URL: https://github.com/llvm/llvm-project/commit/a1d4649a5b176bf826685cac5cc4416b6498bdf9 DIFF: https://github.com/llvm/llvm-project/commit/a1d4649a5b176bf826685cac5cc4416b6498bdf9.diff LOG: [clangd] Fix division by zero when computing scores NameMatch could be a float close to zero, in such cases we were dividing by zero and moreover propogating a "NaN" to clients, which is invalid per JSON. This fixes the issue by only using Quality scores whenever the NameMatch is low, as we do in CodeCompletion ranking. Fixes https://github.com/clangd/clangd/issues/648. Differential Revision: https://reviews.llvm.org/D94755 Added: Modified: clang-tools-extra/clangd/CodeComplete.cpp clang-tools-extra/clangd/FindSymbols.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp index 9cc18ae789d5..976025b6353e 100644 --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -70,6 +70,7 @@ #include "llvm/Support/ScopedPrinter.h" #include <algorithm> #include <iterator> +#include <limits> // We log detailed candidate here if you run with -debug-only=codecomplete. #define DEBUG_TYPE "CodeComplete" @@ -1655,9 +1656,10 @@ class CodeCompleteFlow { 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<float>::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 index 0a10e3efb05c..e75a74b4b05c 100644 --- 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 <limits> #include <tuple> #define DEBUG_TYPE "FindSymbols" @@ -146,8 +147,9 @@ getWorkspaceSymbols(llvm::StringRef Query, int Limit, 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 @@ getWorkspaceSymbols(llvm::StringRef Query, int Limit, 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<float>::epsilon() + ? Score / Relevance.NameMatch + : QualScore; Top.push({Score, std::move(Info)}); }); for (auto &R : std::move(Top).items()) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits