diff --git a/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.h b/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.h index f02f7e2bbb..a83df6422b 100644 --- a/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.h +++ b/Userland/Applications/Spreadsheet/CellSyntaxHighlighter.h @@ -28,7 +28,6 @@ #include "Cell.h" #include -#include namespace Spreadsheet { diff --git a/Userland/Applications/Spreadsheet/SpreadsheetWidget.cpp b/Userland/Applications/Spreadsheet/SpreadsheetWidget.cpp index 65e48e3f12..6aa8718a99 100644 --- a/Userland/Applications/Spreadsheet/SpreadsheetWidget.cpp +++ b/Userland/Applications/Spreadsheet/SpreadsheetWidget.cpp @@ -174,7 +174,7 @@ void SpreadsheetWidget::setup_tabs(NonnullRefPtrVector new_sheets) update(); }; m_cell_value_editor->set_enabled(true); - static_cast(const_cast(m_cell_value_editor->syntax_highlighter()))->set_cell(&cell); + static_cast(const_cast(m_cell_value_editor->syntax_highlighter()))->set_cell(&cell); return; } @@ -207,11 +207,11 @@ void SpreadsheetWidget::setup_tabs(NonnullRefPtrVector new_sheets) } }; m_cell_value_editor->set_enabled(true); - static_cast(const_cast(m_cell_value_editor->syntax_highlighter()))->set_cell(first_cell); + static_cast(const_cast(m_cell_value_editor->syntax_highlighter()))->set_cell(first_cell); }; m_selected_view->on_selection_dropped = [&]() { m_cell_value_editor->set_enabled(false); - static_cast(const_cast(m_cell_value_editor->syntax_highlighter()))->set_cell(nullptr); + static_cast(const_cast(m_cell_value_editor->syntax_highlighter()))->set_cell(nullptr); m_cell_value_editor->set_text(""); m_current_cell_label->set_enabled(false); m_current_cell_label->set_text(""); diff --git a/Userland/DevTools/HackStudio/Editor.cpp b/Userland/DevTools/HackStudio/Editor.cpp index df4b30c515..eb78cf2267 100644 --- a/Userland/DevTools/HackStudio/Editor.cpp +++ b/Userland/DevTools/HackStudio/Editor.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include diff --git a/Userland/Libraries/CMakeLists.txt b/Userland/Libraries/CMakeLists.txt index ed30460a48..54e35f3191 100644 --- a/Userland/Libraries/CMakeLists.txt +++ b/Userland/Libraries/CMakeLists.txt @@ -27,6 +27,7 @@ add_subdirectory(LibProtocol) add_subdirectory(LibPthread) add_subdirectory(LibRegex) add_subdirectory(LibSymbolClient) +add_subdirectory(LibSyntax) add_subdirectory(LibSystem) add_subdirectory(LibTar) add_subdirectory(LibTextCodec) diff --git a/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp b/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp index 71e0597135..c3fda4b9e6 100644 --- a/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp +++ b/Userland/Libraries/LibCpp/SyntaxHighlighter.cpp @@ -33,7 +33,7 @@ namespace Cpp { -static GUI::TextStyle style_for_token_type(const Gfx::Palette& palette, Cpp::Token::Type type) +static Syntax::TextStyle style_for_token_type(const Gfx::Palette& palette, Cpp::Token::Type type) { switch (type) { case Cpp::Token::Type::Keyword: diff --git a/Userland/Libraries/LibCpp/SyntaxHighlighter.h b/Userland/Libraries/LibCpp/SyntaxHighlighter.h index 7a6351ffd2..c55ab56b5d 100644 --- a/Userland/Libraries/LibCpp/SyntaxHighlighter.h +++ b/Userland/Libraries/LibCpp/SyntaxHighlighter.h @@ -26,11 +26,11 @@ #pragma once -#include +#include namespace Cpp { -class SyntaxHighlighter final : public GUI::SyntaxHighlighter { +class SyntaxHighlighter final : public Syntax::Highlighter { public: SyntaxHighlighter() { } virtual ~SyntaxHighlighter() override; @@ -38,7 +38,7 @@ public: virtual bool is_identifier(void*) const override; virtual bool is_navigatable(void*) const override; - virtual GUI::SyntaxLanguage language() const override { return GUI::SyntaxLanguage::Cpp; } + virtual Syntax::Language language() const override { return Syntax::Language::Cpp; } virtual void rehighlight(Gfx::Palette) override; protected: diff --git a/Userland/Libraries/LibGUI/CMakeLists.txt b/Userland/Libraries/LibGUI/CMakeLists.txt index 9d1e57d5b8..056718804d 100644 --- a/Userland/Libraries/LibGUI/CMakeLists.txt +++ b/Userland/Libraries/LibGUI/CMakeLists.txt @@ -83,7 +83,6 @@ set(SOURCES Splitter.cpp StackWidget.cpp StatusBar.cpp - SyntaxHighlighter.cpp TabWidget.cpp TableView.cpp TextBox.cpp @@ -110,4 +109,4 @@ set(GENERATED_SOURCES ) serenity_lib(LibGUI gui) -target_link_libraries(LibGUI LibCore LibGfx LibIPC LibThread LibShell LibRegex LibJS) +target_link_libraries(LibGUI LibCore LibGfx LibIPC LibThread LibShell LibRegex LibJS LibSyntax) diff --git a/Userland/Libraries/LibGUI/Forward.h b/Userland/Libraries/LibGUI/Forward.h index 3f7d19c408..9932662f33 100644 --- a/Userland/Libraries/LibGUI/Forward.h +++ b/Userland/Libraries/LibGUI/Forward.h @@ -77,7 +77,6 @@ class SpinBox; class Splitter; class StackWidget; class StatusBar; -class SyntaxHighlighter; class TabWidget; class TableView; class TextBox; diff --git a/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.cpp b/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.cpp index 01c4f96c36..2f1db4b3e4 100644 --- a/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.cpp +++ b/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2021, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,7 @@ namespace GUI { -static TextStyle style_for_token_type(Gfx::Palette palette, GMLToken::Type type) +static Syntax::TextStyle style_for_token_type(Gfx::Palette palette, GMLToken::Type type) { switch (type) { case GMLToken::Type::LeftCurly: @@ -88,7 +88,7 @@ void GMLSyntaxHighlighter::rehighlight(Gfx::Palette palette) Vector GMLSyntaxHighlighter::matching_token_pairs() const { - static Vector pairs; + static Vector pairs; if (pairs.is_empty()) { pairs.append({ reinterpret_cast(GMLToken::Type::LeftCurly), reinterpret_cast(GMLToken::Type::RightCurly) }); } diff --git a/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.h b/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.h index dc1d73498e..4891cce703 100644 --- a/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.h +++ b/Userland/Libraries/LibGUI/GMLSyntaxHighlighter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2021, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,18 +26,18 @@ #pragma once -#include +#include namespace GUI { -class GMLSyntaxHighlighter final : public SyntaxHighlighter { +class GMLSyntaxHighlighter final : public Syntax::Highlighter { public: GMLSyntaxHighlighter() { } virtual ~GMLSyntaxHighlighter() override; virtual bool is_identifier(void*) const override; - virtual SyntaxLanguage language() const override { return SyntaxLanguage::INI; } + virtual Syntax::Language language() const override { return Syntax::Language::GML; } virtual void rehighlight(Gfx::Palette) override; protected: diff --git a/Userland/Libraries/LibGUI/INISyntaxHighlighter.cpp b/Userland/Libraries/LibGUI/INISyntaxHighlighter.cpp index 3b798ea1dd..084bb829ea 100644 --- a/Userland/Libraries/LibGUI/INISyntaxHighlighter.cpp +++ b/Userland/Libraries/LibGUI/INISyntaxHighlighter.cpp @@ -32,7 +32,7 @@ namespace GUI { -static TextStyle style_for_token_type(Gfx::Palette palette, IniToken::Type type) +static Syntax::TextStyle style_for_token_type(const Gfx::Palette& palette, IniToken::Type type) { switch (type) { case IniToken::Type::LeftBracket: @@ -87,7 +87,7 @@ void IniSyntaxHighlighter::rehighlight(Gfx::Palette palette) Vector IniSyntaxHighlighter::matching_token_pairs() const { - static Vector pairs; + static Vector pairs; if (pairs.is_empty()) { pairs.append({ reinterpret_cast(IniToken::Type::LeftBracket), reinterpret_cast(IniToken::Type::RightBracket) }); } diff --git a/Userland/Libraries/LibGUI/INISyntaxHighlighter.h b/Userland/Libraries/LibGUI/INISyntaxHighlighter.h index 14f80d89c9..e6285c6f54 100644 --- a/Userland/Libraries/LibGUI/INISyntaxHighlighter.h +++ b/Userland/Libraries/LibGUI/INISyntaxHighlighter.h @@ -26,18 +26,18 @@ #pragma once -#include +#include namespace GUI { -class IniSyntaxHighlighter final : public SyntaxHighlighter { +class IniSyntaxHighlighter final : public Syntax::Highlighter { public: IniSyntaxHighlighter() { } virtual ~IniSyntaxHighlighter() override; virtual bool is_identifier(void*) const override; - virtual SyntaxLanguage language() const override { return SyntaxLanguage::INI; } + virtual Syntax::Language language() const override { return Syntax::Language::INI; } virtual void rehighlight(Gfx::Palette) override; protected: diff --git a/Userland/Libraries/LibGUI/JSSyntaxHighlighter.cpp b/Userland/Libraries/LibGUI/JSSyntaxHighlighter.cpp index 267b572cd6..cc45bb687f 100644 --- a/Userland/Libraries/LibGUI/JSSyntaxHighlighter.cpp +++ b/Userland/Libraries/LibGUI/JSSyntaxHighlighter.cpp @@ -34,7 +34,7 @@ namespace GUI { -static TextStyle style_for_token_type(Gfx::Palette palette, JS::TokenType type) +static Syntax::TextStyle style_for_token_type(Gfx::Palette palette, JS::TokenType type) { switch (JS::Token::category(type)) { case JS::TokenCategory::Invalid: @@ -133,9 +133,9 @@ void JSSyntaxHighlighter::rehighlight(Gfx::Palette palette) m_editor->update(); } -Vector JSSyntaxHighlighter::matching_token_pairs() const +Vector JSSyntaxHighlighter::matching_token_pairs() const { - static Vector pairs; + static Vector pairs; if (pairs.is_empty()) { pairs.append({ reinterpret_cast(JS::TokenType::CurlyOpen), reinterpret_cast(JS::TokenType::CurlyClose) }); pairs.append({ reinterpret_cast(JS::TokenType::ParenOpen), reinterpret_cast(JS::TokenType::ParenClose) }); diff --git a/Userland/Libraries/LibGUI/JSSyntaxHighlighter.h b/Userland/Libraries/LibGUI/JSSyntaxHighlighter.h index 96b200f697..0f4c1b53c4 100644 --- a/Userland/Libraries/LibGUI/JSSyntaxHighlighter.h +++ b/Userland/Libraries/LibGUI/JSSyntaxHighlighter.h @@ -26,11 +26,11 @@ #pragma once -#include +#include namespace GUI { -class JSSyntaxHighlighter : public SyntaxHighlighter { +class JSSyntaxHighlighter : public Syntax::Highlighter { public: JSSyntaxHighlighter() { } virtual ~JSSyntaxHighlighter() override; @@ -38,7 +38,7 @@ public: virtual bool is_identifier(void*) const override; virtual bool is_navigatable(void*) const override; - virtual SyntaxLanguage language() const override { return SyntaxLanguage::JavaScript; } + virtual Syntax::Language language() const override { return Syntax::Language::JavaScript; } virtual void rehighlight(Gfx::Palette) override; protected: diff --git a/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.cpp b/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.cpp index a552764c09..aa24dca1e1 100644 --- a/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.cpp +++ b/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.cpp @@ -523,9 +523,9 @@ void ShellSyntaxHighlighter::rehighlight(Gfx::Palette palette) m_editor->update(); } -Vector ShellSyntaxHighlighter::matching_token_pairs() const +Vector ShellSyntaxHighlighter::matching_token_pairs() const { - static Vector pairs; + static Vector pairs; if (pairs.is_empty()) { pairs.append({ (void*)static_cast(AugmentedTokenKind::OpenParen), diff --git a/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.h b/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.h index 7a1cf520d0..6abe63814e 100644 --- a/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.h +++ b/Userland/Libraries/LibGUI/ShellSyntaxHighlighter.h @@ -26,11 +26,11 @@ #pragma once -#include +#include namespace GUI { -class ShellSyntaxHighlighter : public SyntaxHighlighter { +class ShellSyntaxHighlighter : public Syntax::Highlighter { public: ShellSyntaxHighlighter() { } virtual ~ShellSyntaxHighlighter() override; @@ -38,7 +38,7 @@ public: virtual bool is_identifier(void*) const override; virtual bool is_navigatable(void*) const override; - virtual SyntaxLanguage language() const override { return SyntaxLanguage::Shell; } + virtual Syntax::Language language() const override { return Syntax::Language::Shell; } virtual void rehighlight(Gfx::Palette) override; protected: diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp index c5d9197c33..8ae442af26 100644 --- a/Userland/Libraries/LibGUI/TextEditor.cpp +++ b/Userland/Libraries/LibGUI/TextEditor.cpp @@ -38,13 +38,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include #include @@ -1586,12 +1586,12 @@ void TextEditor::flush_pending_change_notification_if_needed() m_has_pending_change_notification = false; } -const SyntaxHighlighter* TextEditor::syntax_highlighter() const +const Syntax::Highlighter* TextEditor::syntax_highlighter() const { return m_highlighter.ptr(); } -void TextEditor::set_syntax_highlighter(OwnPtr highlighter) +void TextEditor::set_syntax_highlighter(OwnPtr highlighter) { if (m_highlighter) m_highlighter->detach(); diff --git a/Userland/Libraries/LibGUI/TextEditor.h b/Userland/Libraries/LibGUI/TextEditor.h index 771c3b7a5e..b9ba05b900 100644 --- a/Userland/Libraries/LibGUI/TextEditor.h +++ b/Userland/Libraries/LibGUI/TextEditor.h @@ -36,6 +36,7 @@ #include #include #include +#include namespace GUI { @@ -173,8 +174,8 @@ public: void set_cursor(size_t line, size_t column); void set_cursor(const TextPosition&); - const SyntaxHighlighter* syntax_highlighter() const; - void set_syntax_highlighter(OwnPtr); + const Syntax::Highlighter* syntax_highlighter() const; + void set_syntax_highlighter(OwnPtr); const AutocompleteProvider* autocomplete_provider() const; void set_autocomplete_provider(OwnPtr&&); @@ -344,7 +345,7 @@ private: NonnullOwnPtrVector m_line_visual_data; - OwnPtr m_highlighter; + OwnPtr m_highlighter; OwnPtr m_autocomplete_provider; OwnPtr m_autocomplete_box; bool m_should_keep_autocomplete_box { false }; diff --git a/Userland/Libraries/LibSyntax/CMakeLists.txt b/Userland/Libraries/LibSyntax/CMakeLists.txt new file mode 100644 index 0000000000..0da883f497 --- /dev/null +++ b/Userland/Libraries/LibSyntax/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SOURCES + Highlighter.cpp +) + +serenity_lib(LibSyntax syntax) +target_link_libraries(LibSyntax LibC) diff --git a/Userland/Libraries/LibSyntax/Forward.h b/Userland/Libraries/LibSyntax/Forward.h new file mode 100644 index 0000000000..55c62aa3cb --- /dev/null +++ b/Userland/Libraries/LibSyntax/Forward.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Andreas Kling + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +namespace Syntax { + +class Highlighter; + +} diff --git a/Userland/Libraries/LibGUI/SyntaxHighlighter.cpp b/Userland/Libraries/LibSyntax/Highlighter.cpp similarity index 93% rename from Userland/Libraries/LibGUI/SyntaxHighlighter.cpp rename to Userland/Libraries/LibSyntax/Highlighter.cpp index 032adc65d7..53c13909a2 100644 --- a/Userland/Libraries/LibGUI/SyntaxHighlighter.cpp +++ b/Userland/Libraries/LibSyntax/Highlighter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, the SerenityOS developers. + * Copyright (c) 2020-2021, the SerenityOS developers. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,16 +24,16 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include #include +#include -namespace GUI { +namespace Syntax { -SyntaxHighlighter::~SyntaxHighlighter() +Highlighter::~Highlighter() { } -void SyntaxHighlighter::highlight_matching_token_pair() +void Highlighter::highlight_matching_token_pair() { ASSERT(m_editor); auto& document = m_editor->document(); @@ -125,19 +125,19 @@ void SyntaxHighlighter::highlight_matching_token_pair() } } -void SyntaxHighlighter::attach(TextEditor& editor) +void Highlighter::attach(GUI::TextEditor& editor) { ASSERT(!m_editor); m_editor = editor; } -void SyntaxHighlighter::detach() +void Highlighter::detach() { ASSERT(m_editor); m_editor = nullptr; } -void SyntaxHighlighter::cursor_did_change() +void Highlighter::cursor_did_change() { ASSERT(m_editor); auto& document = m_editor->document(); diff --git a/Userland/Libraries/LibGUI/SyntaxHighlighter.h b/Userland/Libraries/LibSyntax/Highlighter.h similarity index 84% rename from Userland/Libraries/LibGUI/SyntaxHighlighter.h rename to Userland/Libraries/LibSyntax/Highlighter.h index 1ab1f51c42..8ac7b2691c 100644 --- a/Userland/Libraries/LibGUI/SyntaxHighlighter.h +++ b/Userland/Libraries/LibSyntax/Highlighter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, the SerenityOS developers. + * Copyright (c) 2020-2021, the SerenityOS developers. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,43 +31,44 @@ #include #include -namespace GUI { +namespace Syntax { -enum class SyntaxLanguage { +enum class Language { PlainText, Cpp, JavaScript, INI, + GML, Shell, }; struct TextStyle { - const Color color; + const Gfx::Color color; const bool bold { false }; }; -class SyntaxHighlighter { - AK_MAKE_NONCOPYABLE(SyntaxHighlighter); - AK_MAKE_NONMOVABLE(SyntaxHighlighter); +class Highlighter { + AK_MAKE_NONCOPYABLE(Highlighter); + AK_MAKE_NONMOVABLE(Highlighter); public: - virtual ~SyntaxHighlighter(); + virtual ~Highlighter(); - virtual SyntaxLanguage language() const = 0; + virtual Language language() const = 0; virtual void rehighlight(Gfx::Palette) = 0; virtual void highlight_matching_token_pair(); virtual bool is_identifier(void*) const { return false; }; virtual bool is_navigatable(void*) const { return false; }; - void attach(TextEditor& editor); + void attach(GUI::TextEditor& editor); void detach(); void cursor_did_change(); protected: - SyntaxHighlighter() { } + Highlighter() { } - WeakPtr m_editor; + WeakPtr m_editor; struct MatchingTokenPair { void* open;