diff --git a/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.cpp b/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.cpp index 7c36019567..1126dcd51f 100644 --- a/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.cpp +++ b/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2022, the SerenityOS developers. + * Copyright (c) 2023, Matteo benetti * * SPDX-License-Identifier: BSD-2-Clause */ @@ -13,44 +14,46 @@ namespace Spreadsheet { void CellSyntaxHighlighter::rehighlight(Palette const& palette) { - auto text = m_client->get_text(); - m_client->spans().clear(); - if (!text.starts_with('=')) { - m_client->do_update(); - return; - } + m_client->clear_spans(); - JS::SyntaxHighlighter::rehighlight(palette); + if (m_client->get_text().starts_with('=')) { - // Highlight the '=' - m_client->spans().empend( - GUI::TextRange { { 0, 0 }, { 0, 1 } }, - Gfx::TextAttributes { - palette.syntax_keyword(), - Optional {}, - false, - }, - (u64)-1, - false); + JS::SyntaxHighlighter::rehighlight(palette); - if (m_cell && m_cell->thrown_value().has_value()) { - if (auto value = m_cell->thrown_value().value(); value.is_object() && is(value.as_object())) { - auto& error = static_cast(value.as_object()); - auto& traceback = error.traceback(); - auto& range = traceback.first().source_range; - GUI::TextRange text_range { { range.start.line - 1, range.start.column }, { range.end.line - 1, range.end.column } }; - m_client->spans().prepend( - GUI::TextDocumentSpan { - text_range, + auto spans = m_client->spans(); + + // Highlight the '=' + spans.empend( + GUI::TextRange { { 0, 0 }, { 0, 1 } }, + Gfx::TextAttributes { + palette.syntax_keyword(), + Optional {}, + false, + }, + (u64)-1, + false); + + if (m_cell && m_cell->thrown_value().has_value()) { + if (auto value = m_cell->thrown_value().value(); value.is_object() && is(value.as_object())) { + auto& error = static_cast(value.as_object()); + auto& range = error.traceback().first().source_range; + + spans.prepend({ + GUI::TextRange { { range.start.line - 1, range.start.column }, { range.end.line - 1, range.end.column } }, Gfx::TextAttributes { Color::Black, Color::Red, false, }, (u64)-1, - false }); + false, + }); + } } + + m_client->do_set_spans(move(spans)); } + m_client->do_update(); } } diff --git a/Userland/Libraries/LibGUI/TextEditor.h b/Userland/Libraries/LibGUI/TextEditor.h index dfabda73cb..55ddc8946a 100644 --- a/Userland/Libraries/LibGUI/TextEditor.h +++ b/Userland/Libraries/LibGUI/TextEditor.h @@ -306,7 +306,6 @@ private: virtual void document_did_update_undo_stack() override; // ^Syntax::HighlighterClient - virtual Vector& spans() final { return document().spans(); } virtual Vector const& spans() const final { return document().spans(); } virtual void set_span_at_index(size_t index, TextDocumentSpan span) final { document().set_span_at_index(index, move(span)); } virtual Vector& folding_regions() final { return document().folding_regions(); }; diff --git a/Userland/Libraries/LibSyntax/Highlighter.h b/Userland/Libraries/LibSyntax/Highlighter.h index c67777c1b8..8ba81ea77b 100644 --- a/Userland/Libraries/LibSyntax/Highlighter.h +++ b/Userland/Libraries/LibSyntax/Highlighter.h @@ -125,7 +125,6 @@ public: } private: - virtual Vector& spans() override { return m_spans; } virtual Vector const& spans() const override { return m_spans; } virtual void set_span_at_index(size_t index, GUI::TextDocumentSpan span) override { m_spans.at(index) = move(span); } diff --git a/Userland/Libraries/LibSyntax/HighlighterClient.h b/Userland/Libraries/LibSyntax/HighlighterClient.h index 3491ca8995..a535a60e85 100644 --- a/Userland/Libraries/LibSyntax/HighlighterClient.h +++ b/Userland/Libraries/LibSyntax/HighlighterClient.h @@ -17,9 +17,9 @@ class HighlighterClient { public: virtual ~HighlighterClient() = default; - virtual Vector& spans() = 0; virtual Vector const& spans() const = 0; virtual void set_span_at_index(size_t index, GUI::TextDocumentSpan span) = 0; + virtual void clear_spans() { do_set_spans({}); }; virtual Vector& folding_regions() = 0; virtual Vector const& folding_regions() const = 0;