https://github.com/MythreyaK created https://github.com/llvm/llvm-project/pull/136106
Previous iteration of this PR was [here](https://github.com/llvm/llvm-project/pull/72345). I retained their first commit as-is, rebased it, and added my changes based on the comments in the thread [here](https://github.com/llvm/llvm-project/pull/72345#issuecomment-1826997798). [Related issue](https://github.com/clangd/clangd/issues/1807). I am working on adding tests, but wanted to get an initial review to make sure I am on the right track. >From a0e3a33eda624bbebd436d6ac97a18348be39e7c Mon Sep 17 00:00:00 2001 From: daiyousei-qz <qyzhe...@outlook.com> Date: Tue, 14 Nov 2023 20:42:10 -0800 Subject: [PATCH 1/2] Improve BlockEnd presentation including: 1. Explicitly state a function call 2. Print literal nullptr 3. Escape for abbreviated string 4. Adjust min line limit to 10 --- clang-tools-extra/clangd/InlayHints.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index 1b1bcf78c9855..b1e3bd97d4fd9 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -112,7 +112,9 @@ std::string summarizeExpr(const Expr *E) { return getSimpleName(*E->getFoundDecl()).str(); } std::string VisitCallExpr(const CallExpr *E) { - return Visit(E->getCallee()); + std::string Result = Visit(E->getCallee()); + Result += E->getNumArgs() == 0 ? "()" : "(...)"; + return Result; } std::string VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) { @@ -147,6 +149,9 @@ std::string summarizeExpr(const Expr *E) { } // Literals are just printed + std::string VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) { + return "nullptr"; + } std::string VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { return E->getValue() ? "true" : "false"; } @@ -165,12 +170,14 @@ std::string summarizeExpr(const Expr *E) { std::string Result = "\""; if (E->containsNonAscii()) { Result += "..."; - } else if (E->getLength() > 10) { - Result += E->getString().take_front(7); - Result += "..."; } else { llvm::raw_string_ostream OS(Result); - llvm::printEscapedString(E->getString(), OS); + if (E->getLength() > 10) { + llvm::printEscapedString(E->getString().take_front(7), OS); + Result += "..."; + } else { + llvm::printEscapedString(E->getString(), OS); + } } Result.push_back('"'); return Result; @@ -1120,7 +1127,7 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { // Otherwise, the hint shouldn't be shown. std::optional<Range> computeBlockEndHintRange(SourceRange BraceRange, StringRef OptionalPunctuation) { - constexpr unsigned HintMinLineLimit = 2; + constexpr unsigned HintMinLineLimit = 10; auto &SM = AST.getSourceManager(); auto [BlockBeginFileId, BlockBeginOffset] = >From 755e6a3876a752df0c2ee1532351a6cd1f50c4a0 Mon Sep 17 00:00:00 2001 From: Mythreya <g...@mythreya.dev> Date: Thu, 17 Apr 2025 01:28:53 -0700 Subject: [PATCH 2/2] Add `InlayHintOptions` --- clang-tools-extra/clangd/InlayHints.cpp | 16 ++++++++++------ clang-tools-extra/clangd/InlayHints.h | 8 +++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index b1e3bd97d4fd9..298e19d7fe41d 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -415,12 +415,14 @@ struct Callee { class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { public: InlayHintVisitor(std::vector<InlayHint> &Results, ParsedAST &AST, - const Config &Cfg, std::optional<Range> RestrictRange) + const Config &Cfg, std::optional<Range> RestrictRange, + InlayHintOptions HintOptions) : Results(Results), AST(AST.getASTContext()), Tokens(AST.getTokens()), Cfg(Cfg), RestrictRange(std::move(RestrictRange)), MainFileID(AST.getSourceManager().getMainFileID()), Resolver(AST.getHeuristicResolver()), - TypeHintPolicy(this->AST.getPrintingPolicy()) { + TypeHintPolicy(this->AST.getPrintingPolicy()), + HintOptions(HintOptions) { bool Invalid = false; llvm::StringRef Buf = AST.getSourceManager().getBufferData(MainFileID, &Invalid); @@ -1127,7 +1129,6 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { // Otherwise, the hint shouldn't be shown. std::optional<Range> computeBlockEndHintRange(SourceRange BraceRange, StringRef OptionalPunctuation) { - constexpr unsigned HintMinLineLimit = 10; auto &SM = AST.getSourceManager(); auto [BlockBeginFileId, BlockBeginOffset] = @@ -1155,7 +1156,7 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { auto RBraceLine = SM.getLineNumber(RBraceFileId, RBraceOffset); // Don't show hint on trivial blocks like `class X {};` - if (BlockBeginLine + HintMinLineLimit - 1 > RBraceLine) + if (BlockBeginLine + HintOptions.HintMinLineLimit - 1 > RBraceLine) return std::nullopt; // This is what we attach the hint to, usually "}" or "};". @@ -1185,17 +1186,20 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { StringRef MainFileBuf; const HeuristicResolver *Resolver; PrintingPolicy TypeHintPolicy; + InlayHintOptions HintOptions; }; } // namespace std::vector<InlayHint> inlayHints(ParsedAST &AST, - std::optional<Range> RestrictRange) { + std::optional<Range> RestrictRange, + InlayHintOptions HintOptions) { std::vector<InlayHint> Results; const auto &Cfg = Config::current(); if (!Cfg.InlayHints.Enabled) return Results; - InlayHintVisitor Visitor(Results, AST, Cfg, std::move(RestrictRange)); + InlayHintVisitor Visitor(Results, AST, Cfg, std::move(RestrictRange), + HintOptions); Visitor.TraverseAST(AST.getASTContext()); // De-duplicate hints. Duplicates can sometimes occur due to e.g. explicit diff --git a/clang-tools-extra/clangd/InlayHints.h b/clang-tools-extra/clangd/InlayHints.h index 6a0236a0ab08a..544f3c8c2d03a 100644 --- a/clang-tools-extra/clangd/InlayHints.h +++ b/clang-tools-extra/clangd/InlayHints.h @@ -22,10 +22,16 @@ namespace clang { namespace clangd { class ParsedAST; +struct InlayHintOptions { + // Minimum lines for BlockEnd inlay-hints to be shown + int HintMinLineLimit{2}; +}; + /// Compute and return inlay hints for a file. /// If RestrictRange is set, return only hints whose location is in that range. std::vector<InlayHint> inlayHints(ParsedAST &AST, - std::optional<Range> RestrictRange); + std::optional<Range> RestrictRange, + InlayHintOptions HintOptions = {}); } // namespace clangd } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits