diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp --- a/clang-tools-extra/clangd/Hover.cpp +++ b/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(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()) addLayoutInfo(*Decls.front(), *HI); diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/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