diff options
author | Itamar <itamar8910@gmail.com> | 2022-02-07 08:08:34 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-02-09 00:51:31 +0100 |
commit | aba2e03b711363f6ab85be1041d7e5f77dc4804f (patch) | |
tree | 654ac3f1b1e34a48f2cae7723eca41ee4082956e | |
parent | 10d75d7f2199d7d06b2c7a0d8fa8f7dc357ad49b (diff) | |
download | serenity-aba2e03b711363f6ab85be1041d7e5f77dc4804f.zip |
HackStudio: Use the C++ semantic syntax highlighter
HackStudio::Editor will now send a request to get semantic token
information to the language server whenever there's a short pause in
editing.
The result is used by the semantic c++ syntax highlighter to provide
better highlighting information.
-rw-r--r-- | Userland/DevTools/HackStudio/Editor.cpp | 45 | ||||
-rw-r--r-- | Userland/DevTools/HackStudio/Editor.h | 5 |
2 files changed, 49 insertions, 1 deletions
diff --git a/Userland/DevTools/HackStudio/Editor.cpp b/Userland/DevTools/HackStudio/Editor.cpp index 59655b974e..4dcaa76050 100644 --- a/Userland/DevTools/HackStudio/Editor.cpp +++ b/Userland/DevTools/HackStudio/Editor.cpp @@ -16,6 +16,8 @@ #include <AK/LexicalPath.h> #include <LibCore/DirIterator.h> #include <LibCore/File.h> +#include <LibCore/Timer.h> +#include <LibCpp/SemanticSyntaxHighlighter.h> #include <LibCpp/SyntaxHighlighter.h> #include <LibGUI/Action.h> #include <LibGUI/Application.h> @@ -51,6 +53,8 @@ ErrorOr<NonnullRefPtr<Editor>> Editor::try_create() Editor::Editor() { + create_tokens_info_timer(); + set_document(CodeDocument::create()); m_evaluate_expression_action = GUI::Action::create("Evaluate expression", { Mod_Ctrl, Key_E }, [this](auto&) { VERIFY(is_program_running()); @@ -496,6 +500,9 @@ void Editor::set_document(GUI::TextDocument& doc) } else { set_autocomplete_provider_for(code_document); } + + on_token_info_timer_tick(); + m_tokens_info_timer->restart(); } Optional<Editor::AutoCompleteRequestData> Editor::get_autocomplete_request_data() @@ -602,7 +609,7 @@ void Editor::set_syntax_highlighter_for(const CodeDocument& document) { switch (document.language()) { case Language::Cpp: - set_syntax_highlighter(make<Cpp::SyntaxHighlighter>()); + set_syntax_highlighter(make<Cpp::SemanticSyntaxHighlighter>()); break; case Language::CSS: set_syntax_highlighter(make<Web::CSS::SyntaxHighlighter>()); @@ -654,6 +661,12 @@ void Editor::set_language_client_for(const CodeDocument& document) if (document.language() == Language::Shell) m_language_client = get_language_client<LanguageClients::Shell::ServerConnection>(project().root_path()); + + if (m_language_client) { + m_language_client->on_tokens_info_result = [this](Vector<GUI::AutocompleteProvider::TokenInfo> const& tokens_info) { + on_tokens_info_result(tokens_info); + }; + } } void Editor::keydown_event(GUI::KeyEvent& event) @@ -665,6 +678,8 @@ void Editor::keydown_event(GUI::KeyEvent& event) if (!event.shift() && !event.alt() && event.ctrl() && event.key() == KeyCode::Key_P) { handle_function_parameters_hint_request(); } + + m_tokens_info_timer->restart(); } void Editor::handle_function_parameters_hint_request() @@ -711,4 +726,32 @@ void Editor::set_debug_mode(bool enabled) m_move_execution_to_line_action->set_enabled(enabled); } +void Editor::on_token_info_timer_tick() +{ + if (!m_language_client || !m_language_client->is_active_client()) + return; + + m_language_client->get_tokens_info(code_document().file_path()); +} + +void Editor::on_tokens_info_result(Vector<GUI::AutocompleteProvider::TokenInfo> const& tokens_info) +{ + auto highlighter = syntax_highlighter(); + if (highlighter && highlighter->is_cpp_semantic_highlighter()) { + auto& semantic_cpp_highlighter = verify_cast<Cpp::SemanticSyntaxHighlighter>(*highlighter); + semantic_cpp_highlighter.update_tokens_info(tokens_info); + force_rehighlight(); + } +} + +void Editor::create_tokens_info_timer() +{ + static constexpr size_t token_info_timer_interval_ms = 1000; + m_tokens_info_timer = Core::Timer::create_repeating((int)token_info_timer_interval_ms, [this] { + on_token_info_timer_tick(); + m_tokens_info_timer->stop(); + }); + m_tokens_info_timer->start(); +} + } diff --git a/Userland/DevTools/HackStudio/Editor.h b/Userland/DevTools/HackStudio/Editor.h index b0b2d1b65c..1076b15615 100644 --- a/Userland/DevTools/HackStudio/Editor.h +++ b/Userland/DevTools/HackStudio/Editor.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2020-2022, Itamar S. <itamar8910@gmail.com> * Copyright (c) 2018-2021, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause @@ -101,6 +102,9 @@ private: void set_language_client_for(const CodeDocument&); void set_autocomplete_provider_for(CodeDocument const&); void handle_function_parameters_hint_request(); + void on_token_info_timer_tick(); + void on_tokens_info_result(Vector<GUI::AutocompleteProvider::TokenInfo> const& tokens_info); + void create_tokens_info_timer(); explicit Editor(); @@ -115,6 +119,7 @@ private: bool m_autocomplete_in_focus { false }; RefPtr<GUI::Action> m_evaluate_expression_action; RefPtr<GUI::Action> m_move_execution_to_line_action; + RefPtr<Core::Timer> m_tokens_info_timer; // Used for querying language server for syntax highlighting info OwnPtr<LanguageClient> m_language_client; ErrorOr<void> initialize_documentation_tooltip(); |