[PATCH] D118260: [clangd][Hover] Suppress initializers with many tokens
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 26 08:59:21 PST 2022
kadircet created this revision.
kadircet added a reviewer: sammccall.
Herald added subscribers: usaxena95, arphaman.
kadircet requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.
This results in excessive memory usage and eats a lot of screen estate.
Especially in the cases with lots of nested macro calls.
This patch tries to remedy it before the release cut by suppressing the
initializers. For better UX we should probably update the expression printer to
truncate those (behind some policy).
Related: https://github.com/clangd/clangd/issues/917
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D118260
Files:
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -3172,6 +3172,20 @@
EXPECT_EQ(H->Type, HoverInfo::PrintedType("m_int"));
}
+TEST(Hover, HideBigInitializers) {
+ Annotations T(R"cpp(
+ #define A(x) x, x, x, x
+ #define B(x) A(A(A(A(x))))
+ int a^rr[] = {B(0)};
+ )cpp");
+
+ TestTU TU = TestTU::withCode(T.code());
+ auto AST = TU.build();
+ auto H = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+
+ ASSERT_TRUE(H);
+ EXPECT_EQ(H->Definition, "int arr[]");
+}
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -126,7 +126,14 @@
return "";
}
-std::string printDefinition(const Decl *D, const PrintingPolicy &PP) {
+std::string printDefinition(const Decl *D, PrintingPolicy PP,
+ const syntax::TokenBuffer &TB) {
+ if (auto *VD = llvm::dyn_cast<VarDecl>(D)) {
+ if (auto *IE = VD->getInit()) {
+ if (200 < TB.expandedTokens(IE->getSourceRange()).size())
+ PP.SuppressInitializers = true;
+ }
+ }
std::string Definition;
llvm::raw_string_ostream OS(Definition);
D->print(OS, PP);
@@ -568,7 +575,8 @@
/// Generate a \p Hover object given the declaration \p D.
HoverInfo getHoverContents(const NamedDecl *D, const PrintingPolicy &PP,
- const SymbolIndex *Index) {
+ const SymbolIndex *Index,
+ const syntax::TokenBuffer &TB) {
HoverInfo HI;
const ASTContext &Ctx = D->getASTContext();
@@ -630,7 +638,7 @@
HI.Value = toString(ECD->getInitVal(), 10);
}
- HI.Definition = printDefinition(D, PP);
+ HI.Definition = printDefinition(D, PP, TB);
return HI;
}
@@ -1029,7 +1037,7 @@
auto Decls = explicitReferenceTargets(N->ASTNode, DeclRelation::Alias,
AST.getHeuristicResolver());
if (!Decls.empty()) {
- HI = getHoverContents(Decls.front(), PP, Index);
+ HI = getHoverContents(Decls.front(), PP, Index, TB);
// Layout info only shown when hovering on the field/class itself.
if (Decls.front() == N->ASTNode.get<Decl>())
addLayoutInfo(*Decls.front(), *HI);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118260.403299.patch
Type: text/x-patch
Size: 2538 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220126/2f5ab63e/attachment.bin>
More information about the cfe-commits
mailing list