[PATCH] D118260: [clangd][Hover] Suppress initializers with many tokens
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 27 03:56:10 PST 2022
kadircet updated this revision to Diff 403583.
kadircet added a comment.
- Add comments about why we suppress initializer printing
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D118260/new/
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,17 @@
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()) {
+ // Initializers might be huge and result in lots of memory allocations in
+ // some catostrophic cases. Such long lists are not useful in hover cards
+ // anyway.
+ 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 +578,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 +641,7 @@
HI.Value = toString(ECD->getInitVal(), 10);
}
- HI.Definition = printDefinition(D, PP);
+ HI.Definition = printDefinition(D, PP, TB);
return HI;
}
@@ -1029,7 +1040,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.403583.patch
Type: text/x-patch
Size: 2718 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220127/39232191/attachment.bin>
More information about the cfe-commits
mailing list