Author: Nathan Ridge Date: 2021-09-21T03:23:04-04:00 New Revision: d87d1aa07612116a5c2a660f678856d3bda94f46
URL: https://github.com/llvm/llvm-project/commit/d87d1aa07612116a5c2a660f678856d3bda94f46 DIFF: https://github.com/llvm/llvm-project/commit/d87d1aa07612116a5c2a660f678856d3bda94f46.diff LOG: [clangd] Deduplicate inlay hints Duplicates can sometimes appear due to e.g. explicit template instantiations Differential Revision: https://reviews.llvm.org/D110051 Added: Modified: clang-tools-extra/clangd/InlayHints.cpp clang-tools-extra/clangd/Protocol.cpp clang-tools-extra/clangd/Protocol.h clang-tools-extra/clangd/unittests/InlayHintTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index 167f8001d6e43..73864b7849345 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -366,6 +366,12 @@ std::vector<InlayHint> inlayHints(ParsedAST &AST) { std::vector<InlayHint> Results; InlayHintVisitor Visitor(Results, AST); Visitor.TraverseAST(AST.getASTContext()); + + // De-duplicate hints. Duplicates can sometimes occur due to e.g. explicit + // template instantiations. + llvm::sort(Results); + Results.erase(std::unique(Results.begin(), Results.end()), Results.end()); + return Results; } diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp index c0e96f63952c8..5fa2d21f5df71 100644 --- a/clang-tools-extra/clangd/Protocol.cpp +++ b/clang-tools-extra/clangd/Protocol.cpp @@ -1326,6 +1326,14 @@ llvm::json::Value toJSON(const InlayHint &H) { return llvm::json::Object{ {"range", H.range}, {"kind", H.kind}, {"label", H.label}}; } +bool operator==(const InlayHint &A, const InlayHint &B) { + return std::tie(A.kind, A.range, A.label) == + std::tie(B.kind, B.range, B.label); +} +bool operator<(const InlayHint &A, const InlayHint &B) { + return std::tie(A.kind, A.range, A.label) < + std::tie(B.kind, B.range, B.label); +} static const char *toString(OffsetEncoding OE) { switch (OE) { diff --git a/clang-tools-extra/clangd/Protocol.h b/clang-tools-extra/clangd/Protocol.h index cd469c2394072..3a43a48367c05 100644 --- a/clang-tools-extra/clangd/Protocol.h +++ b/clang-tools-extra/clangd/Protocol.h @@ -1548,6 +1548,8 @@ struct InlayHint { std::string label; }; llvm::json::Value toJSON(const InlayHint &); +bool operator==(const InlayHint &, const InlayHint &); +bool operator<(const InlayHint &, const InlayHint &); struct ReferenceContext { /// Include the declaration of the current symbol. diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp index cda2ba41e2648..1c69d504ec6dc 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -612,6 +612,18 @@ TEST(TypeHints, DefaultTemplateArgs) { ExpectedHint{": A<float>", "var"}); } +TEST(TypeHints, Deduplication) { + assertTypeHints(R"cpp( + template <typename T> + void foo() { + auto $var[[var]] = 42; + } + template void foo<int>(); + template void foo<float>(); + )cpp", + ExpectedHint{": int", "var"}); +} + // FIXME: Low-hanging fruit where we could omit a type hint: // - auto x = TypeName(...); // - auto x = (TypeName) (...); @@ -625,4 +637,4 @@ TEST(TypeHints, DefaultTemplateArgs) { } // namespace } // namespace clangd -} // namespace clang \ No newline at end of file +} // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits