diff --git a/clang-tools-extra/clangd/Quality.cpp b/clang-tools-extra/clangd/Quality.cpp --- a/clang-tools-extra/clangd/Quality.cpp +++ b/clang-tools-extra/clangd/Quality.cpp @@ -474,6 +474,21 @@ if (NeedsFixIts) Score *= 0.5f; + // Use a sigmoid style boosting function similar to `References`, which flats + // out nicely for large values. This avoids a sharp gradient for heavily + // referenced symbols. Use smaller gradient for ScopeRefsInFile since ideally + // MainFileRefs <= ScopeRefsInFile. + if (MainFileRefs >= 2) { + // E.g.: (2, 1.12), (9, 2.0), (48, 3.0). + float S = std::pow(MainFileRefs, -0.11); + Score *= 11.0 * (1 - S) / (1 + S) + 0.7; + } + if (ScopeRefsInFile >= 2) { + // E.g.: (2, 1.04), (14, 2.0), (109, 3.0), (400, 3.6). + float S = std::pow(ScopeRefsInFile, -0.10); + Score *= 10.0 * (1 - S) / (1 + S) + 0.7; + } + return Score; }