1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:07:34 +00:00

LibSyntax+Userland: Make LibSyntax not depend on LibGUI

This moves some stuff around to make LibGUI depend on LibSyntax instead
of the other way around, as not every application that wishes to do
syntax highlighting is necessarily a LibGUI (or even a GUI) application.
This commit is contained in:
Ali Mohammad Pur 2023-08-29 12:43:41 +03:30 committed by Tim Flynn
parent 2495302991
commit ba4db899d4
26 changed files with 773 additions and 683 deletions

View file

@ -7,9 +7,9 @@
#include <AK/QuickSort.h>
#include <AK/ScopedValueRollback.h>
#include <AK/TemporaryChange.h>
#include <LibGUI/TextEditor.h>
#include <LibGfx/Font/Font.h>
#include <LibGfx/Palette.h>
#include <LibSyntax/Document.h>
#include <Shell/NodeVisitor.h>
#include <Shell/Parser.h>
#include <Shell/SyntaxHighlighter.h>
@ -24,7 +24,7 @@ enum class AugmentedTokenKind : u32 {
class HighlightVisitor : public AST::NodeVisitor {
public:
HighlightVisitor(Vector<GUI::TextDocumentSpan>& spans, Gfx::Palette const& palette, const GUI::TextDocument& document)
HighlightVisitor(Vector<Syntax::TextDocumentSpan>& spans, Gfx::Palette const& palette, Syntax::Document const& document)
: m_spans(spans)
, m_palette(palette)
, m_document(document)
@ -32,7 +32,7 @@ public:
}
private:
AST::Position::Line offset_line(const AST::Position::Line& line, size_t offset)
AST::Position::Line offset_line(AST::Position::Line const& line, size_t offset)
{
// We need to look at the line(s) above.
AST::Position::Line new_line { line };
@ -52,20 +52,20 @@ private:
return new_line;
}
void set_offset_range_end(GUI::TextRange& range, const AST::Position::Line& line, size_t offset = 0)
void set_offset_range_end(Syntax::TextRange& range, AST::Position::Line const& line, size_t offset = 0)
{
auto new_line = offset_line(line, offset);
range.set_end({ new_line.line_number, new_line.line_column });
}
void set_offset_range_start(GUI::TextRange& range, const AST::Position::Line& line, size_t offset = 0)
void set_offset_range_start(Syntax::TextRange& range, AST::Position::Line const& line, size_t offset = 0)
{
auto new_line = offset_line(line, offset);
range.set_start({ new_line.line_number, new_line.line_column });
}
GUI::TextDocumentSpan& span_for_node(const AST::Node* node)
Syntax::TextDocumentSpan& span_for_node(AST::Node const* node)
{
GUI::TextDocumentSpan span;
Syntax::TextDocumentSpan span;
set_offset_range_start(span.range, node->position().start_line);
set_offset_range_end(span.range, node->position().end_line);
span.data = static_cast<u64>(node->kind());
@ -75,7 +75,7 @@ private:
return m_spans.last();
}
virtual void visit(const AST::PathRedirectionNode* node) override
virtual void visit(AST::PathRedirectionNode const* node) override
{
if (node->path()->is_bareword()) {
auto& span = span_for_node(node->path());
@ -85,7 +85,7 @@ private:
NodeVisitor::visit(node);
}
}
virtual void visit(const AST::And* node) override
virtual void visit(AST::And const* node) override
{
{
ScopedValueRollback first_in_command { m_is_first_in_command };
@ -102,11 +102,11 @@ private:
span.attributes.color = m_palette.syntax_punctuation();
span.attributes.bold = true;
}
virtual void visit(const AST::ListConcatenate* node) override
virtual void visit(AST::ListConcatenate const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::Background* node) override
virtual void visit(AST::Background const* node) override
{
NodeVisitor::visit(node);
@ -115,11 +115,11 @@ private:
span.attributes.color = m_palette.syntax_punctuation();
span.attributes.bold = true;
}
virtual void visit(const AST::BraceExpansion* node) override
virtual void visit(AST::BraceExpansion const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::BarewordLiteral* node) override
virtual void visit(AST::BarewordLiteral const* node) override
{
NodeVisitor::visit(node);
@ -134,11 +134,11 @@ private:
span.attributes.color = m_palette.base_text();
}
}
virtual void visit(const AST::CastToCommand* node) override
virtual void visit(AST::CastToCommand const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::CastToList* node) override
virtual void visit(AST::CastToList const* node) override
{
NodeVisitor::visit(node);
@ -152,29 +152,29 @@ private:
set_offset_range_start(end_span.range, node->position().end_line, 1);
end_span.data = static_cast<u64>(AugmentedTokenKind::CloseParen);
}
virtual void visit(const AST::CloseFdRedirection* node) override
virtual void visit(AST::CloseFdRedirection const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::CommandLiteral* node) override
virtual void visit(AST::CommandLiteral const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::Comment* node) override
virtual void visit(AST::Comment const* node) override
{
NodeVisitor::visit(node);
auto& span = span_for_node(node);
span.attributes.color = m_palette.syntax_comment();
}
virtual void visit(const AST::ContinuationControl* node) override
virtual void visit(AST::ContinuationControl const* node) override
{
NodeVisitor::visit(node);
auto& span = span_for_node(node);
span.attributes.color = m_palette.syntax_control_keyword();
}
virtual void visit(const AST::DynamicEvaluate* node) override
virtual void visit(AST::DynamicEvaluate const* node) override
{
NodeVisitor::visit(node);
@ -182,7 +182,7 @@ private:
start_span.attributes.color = m_palette.syntax_punctuation();
start_span.range.set_end({ node->position().start_line.line_number, node->position().start_line.line_column + 1 });
}
virtual void visit(const AST::DoubleQuotedString* node) override
virtual void visit(AST::DoubleQuotedString const* node) override
{
NodeVisitor::visit(node);
@ -202,11 +202,11 @@ private:
}
m_is_first_in_command = false;
}
virtual void visit(const AST::Fd2FdRedirection* node) override
virtual void visit(AST::Fd2FdRedirection const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::FunctionDeclaration* node) override
virtual void visit(AST::FunctionDeclaration const* node) override
{
NodeVisitor::visit(node);
@ -224,7 +224,7 @@ private:
name_span.attributes.color = m_palette.syntax_identifier();
}
}
virtual void visit(const AST::ForLoop* node) override
virtual void visit(AST::ForLoop const* node) override
{
// The iterated expression is an expression, not a command.
m_is_first_in_command = false;
@ -275,14 +275,14 @@ private:
variable_span.attributes.color = m_palette.syntax_identifier();
}
}
virtual void visit(const AST::Glob* node) override
virtual void visit(AST::Glob const* node) override
{
NodeVisitor::visit(node);
auto& span = span_for_node(node);
span.attributes.color = m_palette.syntax_preprocessor_value();
}
virtual void visit(const AST::Execute* node) override
virtual void visit(AST::Execute const* node) override
{
TemporaryChange first { m_is_first_in_command, true };
NodeVisitor::visit(node);
@ -299,7 +299,7 @@ private:
end_span.data = static_cast<u64>(AugmentedTokenKind::CloseParen);
}
}
virtual void visit(const AST::IfCond* node) override
virtual void visit(AST::IfCond const* node) override
{
m_is_first_in_command = false;
NodeVisitor::visit(node);
@ -321,7 +321,7 @@ private:
}
}
virtual void visit(const AST::ImmediateExpression* node) override
virtual void visit(AST::ImmediateExpression const* node) override
{
TemporaryChange first { m_is_first_in_command, false };
NodeVisitor::visit(node);
@ -345,11 +345,11 @@ private:
end_span.data = static_cast<u64>(AugmentedTokenKind::CloseParen);
}
virtual void visit(const AST::Join* node) override
virtual void visit(AST::Join const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::MatchExpr* node) override
virtual void visit(AST::MatchExpr const* node) override
{
// The matched expression is an expression, not a command.
m_is_first_in_command = false;
@ -371,7 +371,7 @@ private:
as_span.attributes.color = m_palette.syntax_keyword();
}
}
virtual void visit(const AST::Or* node) override
virtual void visit(AST::Or const* node) override
{
{
ScopedValueRollback first_in_command { m_is_first_in_command };
@ -388,11 +388,11 @@ private:
span.attributes.color = m_palette.syntax_punctuation();
span.attributes.bold = true;
}
virtual void visit(const AST::Pipe* node) override
virtual void visit(AST::Pipe const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::Range* node) override
virtual void visit(AST::Range const* node) override
{
NodeVisitor::visit(node);
@ -409,15 +409,15 @@ private:
end_span.attributes.color = m_palette.syntax_punctuation();
}
virtual void visit(const AST::ReadRedirection* node) override
virtual void visit(AST::ReadRedirection const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::ReadWriteRedirection* node) override
virtual void visit(AST::ReadWriteRedirection const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::Sequence* node) override
virtual void visit(AST::Sequence const* node) override
{
for (auto& entry : node->entries()) {
ScopedValueRollback first_in_command { m_is_first_in_command };
@ -435,29 +435,29 @@ private:
span.is_skippable = true;
}
}
virtual void visit(const AST::Subshell* node) override
virtual void visit(AST::Subshell const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::SimpleVariable* node) override
virtual void visit(AST::SimpleVariable const* node) override
{
NodeVisitor::visit(node);
auto& span = span_for_node(node);
span.attributes.color = m_palette.syntax_identifier();
}
virtual void visit(const AST::SpecialVariable* node) override
virtual void visit(AST::SpecialVariable const* node) override
{
NodeVisitor::visit(node);
auto& span = span_for_node(node);
span.attributes.color = m_palette.syntax_identifier();
}
virtual void visit(const AST::Juxtaposition* node) override
virtual void visit(AST::Juxtaposition const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::StringLiteral* node) override
virtual void visit(AST::StringLiteral const* node) override
{
NodeVisitor::visit(node);
@ -470,11 +470,11 @@ private:
span.attributes.bold = true;
m_is_first_in_command = false;
}
virtual void visit(const AST::StringPartCompose* node) override
virtual void visit(AST::StringPartCompose const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::SyntaxError* node) override
virtual void visit(AST::SyntaxError const* node) override
{
NodeVisitor::visit(node);
@ -483,14 +483,14 @@ private:
span.attributes.background_color = Color(Color::NamedColor::MidRed).lightened(1.3f).with_alpha(128);
span.attributes.color = m_palette.base_text();
}
virtual void visit(const AST::Tilde* node) override
virtual void visit(AST::Tilde const* node) override
{
NodeVisitor::visit(node);
auto& span = span_for_node(node);
span.attributes.color = m_palette.link();
}
virtual void visit(const AST::VariableDeclarations* node) override
virtual void visit(AST::VariableDeclarations const* node) override
{
TemporaryChange first_in_command { m_is_first_in_command, false };
for (auto& decl : node->variables()) {
@ -506,18 +506,18 @@ private:
start_span.data = static_cast<u64>(AugmentedTokenKind::OpenParen);
}
}
virtual void visit(const AST::WriteAppendRedirection* node) override
virtual void visit(AST::WriteAppendRedirection const* node) override
{
NodeVisitor::visit(node);
}
virtual void visit(const AST::WriteRedirection* node) override
virtual void visit(AST::WriteRedirection const* node) override
{
NodeVisitor::visit(node);
}
Vector<GUI::TextDocumentSpan>& m_spans;
Vector<Syntax::TextDocumentSpan>& m_spans;
Gfx::Palette const& m_palette;
const GUI::TextDocument& m_document;
Syntax::Document const& m_document;
bool m_is_first_in_command { false };
};
@ -544,7 +544,7 @@ void SyntaxHighlighter::rehighlight(Palette const& palette)
Parser parser(text);
auto ast = parser.parse();
Vector<GUI::TextDocumentSpan> spans;
Vector<Syntax::TextDocumentSpan> spans;
HighlightVisitor visitor { spans, palette, m_client->get_document() };
if (ast)