summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2023-03-07 20:51:15 +0000
committerLinus Groh <mail@linusgroh.de>2023-03-08 14:21:37 +0000
commit676d75603b726660e5ce058c95d67d89c79ec317 (patch)
tree2c9461058a4a1751a9fd907de4b0fa62f1a2fd43 /Userland/Libraries
parentbb07d678ac1286d9632efb21a182b53d7ca14607 (diff)
downloadserenity-676d75603b726660e5ce058c95d67d89c79ec317.zip
LibCMake+LibSyntax: Add a CMakeCache.txt syntax highlighter
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.cpp89
-rw-r--r--Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.h30
-rw-r--r--Userland/Libraries/LibCMake/CMakeLists.txt1
-rw-r--r--Userland/Libraries/LibSyntax/Highlighter.cpp4
-rw-r--r--Userland/Libraries/LibSyntax/Highlighter.h1
5 files changed, 125 insertions, 0 deletions
diff --git a/Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.cpp b/Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.cpp
new file mode 100644
index 0000000000..2cb7db81a3
--- /dev/null
+++ b/Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "SyntaxHighlighter.h"
+#include <LibCMake/CMakeCache/Lexer.h>
+
+namespace CMake::Cache {
+
+static Syntax::TextStyle style_for_token_type(Gfx::Palette const& palette, Token::Type type)
+{
+ switch (type) {
+ case Token::Type::Comment:
+ case Token::Type::HelpText:
+ return { palette.syntax_comment() };
+ case Token::Type::Key:
+ return { palette.syntax_identifier() };
+ case Token::Type::Type:
+ return { palette.syntax_type() };
+ case Token::Type::Colon:
+ case Token::Type::Equals:
+ return { palette.syntax_punctuation() };
+ case Token::Type::Value:
+ return { palette.syntax_string() };
+ case Token::Type::Garbage:
+ return { palette.red() };
+ default:
+ return { palette.base_text() };
+ }
+}
+
+bool SyntaxHighlighter::is_identifier(u64 token_type) const
+{
+ auto cmake_token = static_cast<Token::Type>(token_type);
+ return cmake_token == Token::Type::Key;
+}
+
+void SyntaxHighlighter::rehighlight(Gfx::Palette const& palette)
+{
+ auto text = m_client->get_text();
+ auto tokens = Lexer::lex(text).release_value_but_fixme_should_propagate_errors();
+
+ Vector<GUI::TextDocumentSpan> spans;
+ auto highlight_span = [&](Token::Type type, Position const& start, Position const& end) {
+ GUI::TextDocumentSpan span;
+ span.range.set_start({ start.line, start.column });
+ span.range.set_end({ end.line, end.column });
+ if (!span.range.is_valid())
+ return;
+
+ auto style = style_for_token_type(palette, type);
+ span.attributes.color = style.color;
+ span.attributes.bold = style.bold;
+ if (type == Token::Type::Garbage) {
+ span.attributes.underline = true;
+ span.attributes.underline_color = palette.red();
+ span.attributes.underline_style = Gfx::TextAttributes::UnderlineStyle::Wavy;
+ }
+ span.is_skippable = false;
+ span.data = static_cast<u64>(type);
+ spans.append(move(span));
+ };
+
+ for (auto const& token : tokens) {
+ highlight_span(token.type, token.start, token.end);
+ }
+
+ m_client->do_set_spans(move(spans));
+
+ m_has_brace_buddies = false;
+ highlight_matching_token_pair();
+
+ m_client->do_update();
+}
+
+Vector<SyntaxHighlighter::MatchingTokenPair> SyntaxHighlighter::matching_token_pairs_impl() const
+{
+ static Vector<MatchingTokenPair> empty;
+ return empty;
+}
+
+bool SyntaxHighlighter::token_types_equal(u64 token1, u64 token2) const
+{
+ return static_cast<Token::Type>(token1) == static_cast<Token::Type>(token2);
+}
+
+}
diff --git a/Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.h b/Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.h
new file mode 100644
index 0000000000..62c7d54610
--- /dev/null
+++ b/Userland/Libraries/LibCMake/CMakeCache/SyntaxHighlighter.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibSyntax/Highlighter.h>
+
+namespace CMake::Cache {
+
+class SyntaxHighlighter final : public Syntax::Highlighter {
+public:
+ SyntaxHighlighter() = default;
+ virtual ~SyntaxHighlighter() override = default;
+
+ virtual bool is_identifier(u64) const override;
+
+ virtual Syntax::Language language() const override { return Syntax::Language::CMakeCache; }
+ virtual Optional<StringView> comment_prefix() const override { return "#"sv; }
+ virtual Optional<StringView> comment_suffix() const override { return {}; }
+ virtual void rehighlight(Palette const&) override;
+
+protected:
+ virtual Vector<MatchingTokenPair> matching_token_pairs_impl() const override;
+ virtual bool token_types_equal(u64, u64) const override;
+};
+
+}
diff --git a/Userland/Libraries/LibCMake/CMakeLists.txt b/Userland/Libraries/LibCMake/CMakeLists.txt
index 36af8b8e7e..6f07e1a3dd 100644
--- a/Userland/Libraries/LibCMake/CMakeLists.txt
+++ b/Userland/Libraries/LibCMake/CMakeLists.txt
@@ -1,5 +1,6 @@
set(SOURCES
CMakeCache/Lexer.cpp
+ CMakeCache/SyntaxHighlighter.cpp
Lexer.cpp
SyntaxHighlighter.cpp
Token.cpp
diff --git a/Userland/Libraries/LibSyntax/Highlighter.cpp b/Userland/Libraries/LibSyntax/Highlighter.cpp
index 93ee9b6aab..48631e8275 100644
--- a/Userland/Libraries/LibSyntax/Highlighter.cpp
+++ b/Userland/Libraries/LibSyntax/Highlighter.cpp
@@ -143,6 +143,8 @@ StringView language_to_string(Language language)
switch (language) {
case Language::CMake:
return "CMake"sv;
+ case Language::CMakeCache:
+ return "CMakeCache"sv;
case Language::Cpp:
return "C++"sv;
case Language::CSS:
@@ -172,6 +174,8 @@ StringView common_language_extension(Language language)
switch (language) {
case Language::CMake:
return "cmake"sv;
+ case Language::CMakeCache:
+ return {};
case Language::Cpp:
return "cpp"sv;
case Language::CSS:
diff --git a/Userland/Libraries/LibSyntax/Highlighter.h b/Userland/Libraries/LibSyntax/Highlighter.h
index 778bf129e7..3ad5af74ac 100644
--- a/Userland/Libraries/LibSyntax/Highlighter.h
+++ b/Userland/Libraries/LibSyntax/Highlighter.h
@@ -16,6 +16,7 @@ namespace Syntax {
enum class Language {
CMake,
+ CMakeCache,
Cpp,
CSS,
GitCommit,