From 947855c23bffd6c8e5bc575695f90aca490d03bd Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 3 Mar 2023 12:53:08 +0000 Subject: [PATCH] LibCpp: Add folding regions to syntax highlighters This just looks at {} blocks. Unfortunately the two highlighters work differently enough that the code has to be duplicated. --- .../LibCpp/SemanticSyntaxHighlighter.cpp | 18 ++++++++++++++++++ .../Libraries/LibCpp/SyntaxHighlighter.cpp | 15 +++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Userland/Libraries/LibCpp/SemanticSyntaxHighlighter.cpp b/Userland/Libraries/LibCpp/SemanticSyntaxHighlighter.cpp index 00c46c8307..017f91c60e 100644 --- a/Userland/Libraries/LibCpp/SemanticSyntaxHighlighter.cpp +++ b/Userland/Libraries/LibCpp/SemanticSyntaxHighlighter.cpp @@ -23,6 +23,24 @@ void SemanticSyntaxHighlighter::rehighlight(Palette const& palette) lexer.set_ignore_whitespace(true); auto current_tokens = lexer.lex(); + // Identify folding regions + Vector folding_region_start_tokens; + Vector folding_regions; + for (auto& token : current_tokens) { + if (token.type() == Token::Type::LeftCurly) { + folding_region_start_tokens.append(token); + } else if (token.type() == Token::Type::RightCurly) { + if (!folding_region_start_tokens.is_empty()) { + auto start_token = folding_region_start_tokens.take_last(); + GUI::TextDocumentFoldingRegion folding_region; + folding_region.range.set_start({ start_token.end().line, start_token.end().column }); + folding_region.range.set_end({ token.start().line, token.start().column }); + folding_regions.append(move(folding_region)); + } + } + } + m_client->do_set_folding_regions(move(folding_regions)); + StringBuilder current_tokens_as_lines; StringBuilder previous_tokens_as_lines; diff --git a/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp b/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp index 9e56602987..f0e2b389dc 100644 --- a/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp +++ b/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp @@ -60,6 +60,8 @@ void SyntaxHighlighter::rehighlight(Palette const& palette) auto text = m_client->get_text(); Cpp::Lexer lexer(text); + Vector folding_region_start_tokens; + Vector folding_regions; Vector spans; lexer.lex_iterable([&](auto token) { // FIXME: The +1 for the token end column is a quick hack due to not wanting to modify the lexer (which is also used by the parser). Maybe there's a better way to do this. @@ -73,8 +75,21 @@ void SyntaxHighlighter::rehighlight(Palette const& palette) span.is_skippable = token.type() == Cpp::Token::Type::Whitespace; span.data = static_cast(token.type()); spans.append(span); + + if (token.type() == Token::Type::LeftCurly) { + folding_region_start_tokens.append(token); + } else if (token.type() == Token::Type::RightCurly) { + if (!folding_region_start_tokens.is_empty()) { + auto start_token = folding_region_start_tokens.take_last(); + GUI::TextDocumentFoldingRegion folding_region; + folding_region.range.set_start({ start_token.end().line, start_token.end().column }); + folding_region.range.set_end({ token.start().line, token.start().column }); + folding_regions.append(move(folding_region)); + } + } }); m_client->do_set_spans(move(spans)); + m_client->do_set_folding_regions(move(folding_regions)); m_has_brace_buddies = false; highlight_matching_token_pair();