/* * Copyright (c) 2025, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::CSS::Parser { class SyntaxNode { public: enum class NodeType : u8 { Universal, Ident, Type, Multiplier, CommaSeparatedMultiplier, Alternatives, }; NodeType type() const { return m_type; } virtual ~SyntaxNode() = default; virtual String to_string() const = 0; virtual void dump(StringBuilder&, int indent) const = 0; String dump() const; protected: SyntaxNode(NodeType type) : m_type(type) { } private: NodeType m_type; }; // '*' class UniversalSyntaxNode final : public SyntaxNode { public: static NonnullOwnPtr create() { return adopt_own(*new UniversalSyntaxNode()); } virtual ~UniversalSyntaxNode() override; virtual String to_string() const override; virtual void dump(StringBuilder&, int indent) const override; private: UniversalSyntaxNode(); }; // 'foo' class IdentSyntaxNode final : public SyntaxNode { public: static NonnullOwnPtr create(FlyString ident) { return adopt_own(*new IdentSyntaxNode(move(ident))); } virtual ~IdentSyntaxNode() override; FlyString const& ident() const { return m_ident; } virtual String to_string() const override; virtual void dump(StringBuilder&, int indent) const override; private: IdentSyntaxNode(FlyString); FlyString m_ident; }; // '' class TypeSyntaxNode final : public SyntaxNode { public: static NonnullOwnPtr create(FlyString type_name); virtual ~TypeSyntaxNode() override; FlyString const& type_name() const { return m_type_name; } Optional const& value_type() const { return m_value_type; } virtual String to_string() const override; virtual void dump(StringBuilder&, int indent) const override; private: TypeSyntaxNode(FlyString type_name, Optional value_type); FlyString m_type_name; Optional m_value_type; }; // '+' class MultiplierSyntaxNode final : public SyntaxNode { public: static NonnullOwnPtr create(NonnullOwnPtr child) { return adopt_own(*new MultiplierSyntaxNode(move(child))); } virtual ~MultiplierSyntaxNode() override; SyntaxNode const& child() const { return *m_child; } virtual String to_string() const override; virtual void dump(StringBuilder&, int indent) const override; private: MultiplierSyntaxNode(NonnullOwnPtr); NonnullOwnPtr m_child; }; // '#' class CommaSeparatedMultiplierSyntaxNode final : public SyntaxNode { public: static NonnullOwnPtr create(NonnullOwnPtr child) { return adopt_own(*new CommaSeparatedMultiplierSyntaxNode(move(child))); } virtual ~CommaSeparatedMultiplierSyntaxNode() override; SyntaxNode const& child() const { return *m_child; } virtual String to_string() const override; virtual void dump(StringBuilder&, int indent) const override; private: CommaSeparatedMultiplierSyntaxNode(NonnullOwnPtr); NonnullOwnPtr m_child; }; // Options separated by '|' class AlternativesSyntaxNode final : public SyntaxNode { public: static NonnullOwnPtr create(Vector> children) { return adopt_own(*new AlternativesSyntaxNode(move(children))); } virtual ~AlternativesSyntaxNode() override; ReadonlySpan> children() const { return m_children; } virtual String to_string() const override; virtual void dump(StringBuilder&, int indent) const override; private: AlternativesSyntaxNode(Vector>); Vector> m_children; }; }