[llvm-branch-commits] [clang-tools-extra] a1d4649 - [clangd] Fix division by zero when computing scores
Kadir Cetinkaya via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jan 20 03:55:27 PST 2021
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())
More information about the llvm-branch-commits
mailing list