This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGc4e68953f644: [clangd][Hover] Suppress initializers with many tokens (authored by kadircet).
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);
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);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits