nridge updated this revision to Diff 373782. nridge added a comment. address nit
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D110051/new/ https://reviews.llvm.org/D110051 Files: 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 Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -591,6 +591,18 @@ )cpp"); } +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) (...); Index: clang-tools-extra/clangd/Protocol.h =================================================================== --- clang-tools-extra/clangd/Protocol.h +++ clang-tools-extra/clangd/Protocol.h @@ -1548,6 +1548,8 @@ 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. Index: clang-tools-extra/clangd/Protocol.cpp =================================================================== --- clang-tools-extra/clangd/Protocol.cpp +++ clang-tools-extra/clangd/Protocol.cpp @@ -1326,6 +1326,14 @@ 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) { Index: clang-tools-extra/clangd/InlayHints.cpp =================================================================== --- clang-tools-extra/clangd/InlayHints.cpp +++ clang-tools-extra/clangd/InlayHints.cpp @@ -347,6 +347,12 @@ 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; }
Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -591,6 +591,18 @@ )cpp"); } +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) (...); Index: clang-tools-extra/clangd/Protocol.h =================================================================== --- clang-tools-extra/clangd/Protocol.h +++ clang-tools-extra/clangd/Protocol.h @@ -1548,6 +1548,8 @@ 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. Index: clang-tools-extra/clangd/Protocol.cpp =================================================================== --- clang-tools-extra/clangd/Protocol.cpp +++ clang-tools-extra/clangd/Protocol.cpp @@ -1326,6 +1326,14 @@ 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) { Index: clang-tools-extra/clangd/InlayHints.cpp =================================================================== --- clang-tools-extra/clangd/InlayHints.cpp +++ clang-tools-extra/clangd/InlayHints.cpp @@ -347,6 +347,12 @@ 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; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits