summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOriko <oriko1010@protonmail.com>2020-03-12 17:23:54 +0200
committerAndreas Kling <kling@serenityos.org>2020-03-12 19:04:59 +0100
commit137d68a2aee129cdbf856dccd0a33b7591ee444a (patch)
tree603681b4957cf32148fb092b841952f8a23c7dc3
parentbacd3dd57ac54759b50b61ce80c727e86be9c054 (diff)
downloadserenity-137d68a2aee129cdbf856dccd0a33b7591ee444a.zip
HackStudio: Abstract over syntax highlighter
-rw-r--r--DevTools/HackStudio/Editor.cpp25
-rw-r--r--Libraries/LibGUI/CppSyntaxHighlighter.cpp12
-rw-r--r--Libraries/LibGUI/CppSyntaxHighlighter.h3
-rw-r--r--Libraries/LibGUI/SyntaxHighlighter.h3
-rw-r--r--Libraries/LibGUI/TextEditor.cpp5
5 files changed, 32 insertions, 16 deletions
diff --git a/DevTools/HackStudio/Editor.cpp b/DevTools/HackStudio/Editor.cpp
index abbf06a3a8..1a4b530ebe 100644
--- a/DevTools/HackStudio/Editor.cpp
+++ b/DevTools/HackStudio/Editor.cpp
@@ -31,7 +31,6 @@
#include <LibCore/DirIterator.h>
#include <LibCore/File.h>
#include <LibGUI/Application.h>
-#include <LibGUI/CppLexer.h>
#include <LibGUI/Painter.h>
#include <LibGUI/ScrollBar.h>
#include <LibGUI/SyntaxHighlighter.h>
@@ -184,13 +183,16 @@ void Editor::mousemove_event(GUI::MouseEvent& event)
return;
}
+ auto highlighter = wrapper().editor().syntax_highlighter();
+ if (!highlighter)
+ return;
+
bool hide_tooltip = true;
- bool is_over_header = false;
+ bool is_over_link = false;
for (auto& span : document().spans()) {
if (span.range.contains(m_previous_text_position) && !span.range.contains(text_position)) {
- auto token = static_cast<GUI::CppToken::Type>(reinterpret_cast<size_t>(span.data));
- if (token == GUI::CppToken::Type::IncludePath && span.is_underlined) {
+ if (highlighter->is_navigatable(span.data) && span.is_underlined) {
span.is_underlined = false;
wrapper().editor().update();
}
@@ -204,15 +206,15 @@ void Editor::mousemove_event(GUI::MouseEvent& event)
dbg() << "Hovering: " << adjusted_range << " \"" << hovered_span_text << "\"";
#endif
- auto token = static_cast<GUI::CppToken::Type>(reinterpret_cast<size_t>(span.data));
- if (token == GUI::CppToken::Type::IncludePath) {
- is_over_header = true;
+ if (highlighter->is_navigatable(span.data)) {
+ is_over_link = true;
bool was_underlined = span.is_underlined;
span.is_underlined = event.modifiers() & Mod_Ctrl;
if (span.is_underlined != was_underlined) {
wrapper().editor().update();
}
- } else if (token == GUI::CppToken::Type::Identifier) {
+ }
+ if (highlighter->is_identifier(span.data)) {
show_documentation_tooltip_if_available(hovered_span_text, event.position().translated(screen_relative_rect().location()));
hide_tooltip = false;
}
@@ -223,13 +225,13 @@ void Editor::mousemove_event(GUI::MouseEvent& event)
if (hide_tooltip)
m_documentation_tooltip_window->hide();
- m_hovering_link = is_over_header && (event.modifiers() & Mod_Ctrl);
+ m_hovering_link = is_over_link && (event.modifiers() & Mod_Ctrl);
}
void Editor::mousedown_event(GUI::MouseEvent& event)
{
auto highlighter = wrapper().editor().syntax_highlighter();
- if (!highlighter || highlighter->language() != GUI::SyntaxLanguage::Cpp) {
+ if (!highlighter) {
GUI::TextEditor::mousedown_event(event);
return;
}
@@ -247,8 +249,7 @@ void Editor::mousedown_event(GUI::MouseEvent& event)
for (auto& span : document().spans()) {
if (span.range.contains(text_position)) {
- auto token = static_cast<GUI::CppToken::Type>(reinterpret_cast<size_t>(span.data));
- if (token != GUI::CppToken::Type::IncludePath) {
+ if (!highlighter->is_navigatable(span.data)) {
GUI::TextEditor::mousedown_event(event);
return;
}
diff --git a/Libraries/LibGUI/CppSyntaxHighlighter.cpp b/Libraries/LibGUI/CppSyntaxHighlighter.cpp
index 76561339e0..aa68539ede 100644
--- a/Libraries/LibGUI/CppSyntaxHighlighter.cpp
+++ b/Libraries/LibGUI/CppSyntaxHighlighter.cpp
@@ -37,6 +37,18 @@ static TextStyle style_for_token_type(CppToken::Type type)
}
}
+bool CppSyntaxHighlighter::is_identifier(void* token) const
+{
+ auto cpp_token = static_cast<GUI::CppToken::Type>(reinterpret_cast<size_t>(token));
+ return cpp_token == GUI::CppToken::Type::Identifier;
+}
+
+bool CppSyntaxHighlighter::is_navigatable(void* token) const
+{
+ auto cpp_token = static_cast<GUI::CppToken::Type>(reinterpret_cast<size_t>(token));
+ return cpp_token == GUI::CppToken::Type::IncludePath;
+}
+
void CppSyntaxHighlighter::rehighlight()
{
ASSERT(m_editor);
diff --git a/Libraries/LibGUI/CppSyntaxHighlighter.h b/Libraries/LibGUI/CppSyntaxHighlighter.h
index 0f77c88cd7..a3f50deb0a 100644
--- a/Libraries/LibGUI/CppSyntaxHighlighter.h
+++ b/Libraries/LibGUI/CppSyntaxHighlighter.h
@@ -9,6 +9,9 @@ public:
CppSyntaxHighlighter() {}
virtual ~CppSyntaxHighlighter() override;
+ virtual bool is_identifier(void*) const override;
+ virtual bool is_navigatable(void*) const override;
+
virtual SyntaxLanguage language() const override { return SyntaxLanguage::Cpp; }
virtual void rehighlight() override;
virtual void highlight_matching_token_pair() override;
diff --git a/Libraries/LibGUI/SyntaxHighlighter.h b/Libraries/LibGUI/SyntaxHighlighter.h
index 568dd403d4..8a15114381 100644
--- a/Libraries/LibGUI/SyntaxHighlighter.h
+++ b/Libraries/LibGUI/SyntaxHighlighter.h
@@ -22,6 +22,9 @@ public:
virtual void rehighlight() = 0;
virtual void highlight_matching_token_pair() = 0;
+ virtual bool is_identifier(void*) const { return false; };
+ virtual bool is_navigatable(void*) const { return false; };
+
void attach(TextEditor& editor);
void detach();
void cursor_did_change();
diff --git a/Libraries/LibGUI/TextEditor.cpp b/Libraries/LibGUI/TextEditor.cpp
index 78bb871bce..babc705810 100644
--- a/Libraries/LibGUI/TextEditor.cpp
+++ b/Libraries/LibGUI/TextEditor.cpp
@@ -1497,10 +1497,7 @@ void TextEditor::flush_pending_change_notification_if_needed()
const SyntaxHighlighter* TextEditor::syntax_highlighter() const
{
- if (m_highlighter)
- return m_highlighter.ptr();
- else
- return nullptr;
+ return m_highlighter.ptr();
}
void TextEditor::set_syntax_highlighter(OwnPtr<SyntaxHighlighter> highlighter)