#![doc = include_str!("readme.md")]
use core::range::Range;
#[derive(Debug, Clone)]
pub struct ScssRoot {
pub span: Range<usize>,
pub children: Vec<ScssNode>,
}
impl ScssRoot {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
for child in &self.children {
child.traverse(visitor);
}
visitor.visit_root(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
for child in &mut self.children {
child.traverse_mut(visitor);
}
visitor.visit_root_mut(self);
}
}
#[derive(Debug, Clone)]
pub enum ScssNode {
RuleSet(ScssRuleSet),
MixinDeclaration(ScssMixinDeclaration),
FunctionDeclaration(ScssFunctionDeclaration),
IncludeStatement(ScssIncludeStatement),
ImportStatement(ScssImportStatement),
VariableDeclaration(ScssVariableDeclaration),
IfStatement(ScssIfStatement),
ForStatement(ScssForStatement),
EachStatement(ScssEachStatement),
WhileStatement(ScssWhileStatement),
ReturnStatement(ScssReturnStatement),
Comment(ScssComment),
Error(ScssError),
}
impl ScssNode {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
match self {
ScssNode::RuleSet(node) => node.traverse(visitor),
ScssNode::MixinDeclaration(node) => node.traverse(visitor),
ScssNode::FunctionDeclaration(node) => node.traverse(visitor),
ScssNode::IncludeStatement(node) => node.traverse(visitor),
ScssNode::ImportStatement(node) => node.traverse(visitor),
ScssNode::VariableDeclaration(node) => node.traverse(visitor),
ScssNode::IfStatement(node) => node.traverse(visitor),
ScssNode::ForStatement(node) => node.traverse(visitor),
ScssNode::EachStatement(node) => node.traverse(visitor),
ScssNode::WhileStatement(node) => node.traverse(visitor),
ScssNode::ReturnStatement(node) => node.traverse(visitor),
ScssNode::Comment(node) => node.traverse(visitor),
ScssNode::Error(node) => node.traverse(visitor),
}
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
match self {
ScssNode::RuleSet(node) => node.traverse_mut(visitor),
ScssNode::MixinDeclaration(node) => node.traverse_mut(visitor),
ScssNode::FunctionDeclaration(node) => node.traverse_mut(visitor),
ScssNode::IncludeStatement(node) => node.traverse_mut(visitor),
ScssNode::ImportStatement(node) => node.traverse_mut(visitor),
ScssNode::VariableDeclaration(node) => node.traverse_mut(visitor),
ScssNode::IfStatement(node) => node.traverse_mut(visitor),
ScssNode::ForStatement(node) => node.traverse_mut(visitor),
ScssNode::EachStatement(node) => node.traverse_mut(visitor),
ScssNode::WhileStatement(node) => node.traverse_mut(visitor),
ScssNode::ReturnStatement(node) => node.traverse_mut(visitor),
ScssNode::Comment(node) => node.traverse_mut(visitor),
ScssNode::Error(node) => node.traverse_mut(visitor),
}
}
}
#[derive(Debug, Clone)]
pub struct ScssRuleSet {
pub span: Range<usize>,
pub selector: ScssSelector,
pub block: ScssBlock,
}
impl ScssRuleSet {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.selector.traverse(visitor);
self.block.traverse(visitor);
visitor.visit_rule_set(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.selector.traverse_mut(visitor);
self.block.traverse_mut(visitor);
visitor.visit_rule_set_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssSelector {
pub span: Range<usize>,
pub text: String,
}
impl ScssSelector {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
visitor.visit_selector(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
visitor.visit_selector_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssBlock {
pub span: Range<usize>,
pub children: Vec<ScssNode>,
}
impl ScssBlock {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
for child in &self.children {
child.traverse(visitor);
}
visitor.visit_block(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
for child in &mut self.children {
child.traverse_mut(visitor);
}
visitor.visit_block_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssDeclaration {
pub span: Range<usize>,
pub property: ScssProperty,
pub value: ScssValue,
}
impl ScssDeclaration {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.property.traverse(visitor);
self.value.traverse(visitor);
visitor.visit_declaration(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.property.traverse_mut(visitor);
self.value.traverse_mut(visitor);
visitor.visit_declaration_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssProperty {
pub span: Range<usize>,
pub name: String,
}
impl ScssProperty {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
visitor.visit_property(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
visitor.visit_property_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssValue {
pub span: Range<usize>,
pub text: String,
}
impl ScssValue {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
visitor.visit_value(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
visitor.visit_value_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssMixinDeclaration {
pub span: Range<usize>,
pub name: String,
pub parameters: Vec<ScssParameter>,
pub block: ScssBlock,
}
impl ScssMixinDeclaration {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
for param in &self.parameters {
param.traverse(visitor);
}
self.block.traverse(visitor);
visitor.visit_mixin_declaration(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
for param in &mut self.parameters {
param.traverse_mut(visitor);
}
self.block.traverse_mut(visitor);
visitor.visit_mixin_declaration_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssFunctionDeclaration {
pub span: Range<usize>,
pub name: String,
pub parameters: Vec<ScssParameter>,
pub block: ScssBlock,
}
impl ScssFunctionDeclaration {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
for param in &self.parameters {
param.traverse(visitor);
}
self.block.traverse(visitor);
visitor.visit_function_declaration(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
for param in &mut self.parameters {
param.traverse_mut(visitor);
}
self.block.traverse_mut(visitor);
visitor.visit_function_declaration_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssParameter {
pub span: Range<usize>,
pub name: String,
pub default_value: Option<ScssValue>,
}
impl ScssParameter {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
if let Some(value) = &self.default_value {
value.traverse(visitor);
}
visitor.visit_parameter(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
if let Some(value) = &mut self.default_value {
value.traverse_mut(visitor);
}
visitor.visit_parameter_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssIncludeStatement {
pub span: Range<usize>,
pub name: String,
pub arguments: Vec<ScssArgument>,
pub block: Option<ScssBlock>,
}
impl ScssIncludeStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
for arg in &self.arguments {
arg.traverse(visitor);
}
if let Some(block) = &self.block {
block.traverse(visitor);
}
visitor.visit_include_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
for arg in &mut self.arguments {
arg.traverse_mut(visitor);
}
if let Some(block) = &mut self.block {
block.traverse_mut(visitor);
}
visitor.visit_include_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssArgument {
pub span: Range<usize>,
pub value: ScssValue,
}
impl ScssArgument {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.value.traverse(visitor);
visitor.visit_argument(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.value.traverse_mut(visitor);
visitor.visit_argument_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssImportStatement {
pub span: Range<usize>,
pub path: String,
}
impl ScssImportStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
visitor.visit_import_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
visitor.visit_import_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssVariableDeclaration {
pub span: Range<usize>,
pub name: String,
pub value: ScssValue,
}
impl ScssVariableDeclaration {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.value.traverse(visitor);
visitor.visit_variable_declaration(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.value.traverse_mut(visitor);
visitor.visit_variable_declaration_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssIfStatement {
pub span: Range<usize>,
pub condition: String,
pub then_block: ScssBlock,
pub else_block: Option<ScssBlock>,
}
impl ScssIfStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.then_block.traverse(visitor);
if let Some(block) = &self.else_block {
block.traverse(visitor);
}
visitor.visit_if_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.then_block.traverse_mut(visitor);
if let Some(block) = &mut self.else_block {
block.traverse_mut(visitor);
}
visitor.visit_if_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssForStatement {
pub span: Range<usize>,
pub variable: String,
pub start: String,
pub end: String,
pub inclusive: bool,
pub block: ScssBlock,
}
impl ScssForStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.block.traverse(visitor);
visitor.visit_for_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.block.traverse_mut(visitor);
visitor.visit_for_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssEachStatement {
pub span: Range<usize>,
pub variables: Vec<String>,
pub list: String,
pub block: ScssBlock,
}
impl ScssEachStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.block.traverse(visitor);
visitor.visit_each_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.block.traverse_mut(visitor);
visitor.visit_each_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssWhileStatement {
pub span: Range<usize>,
pub condition: String,
pub block: ScssBlock,
}
impl ScssWhileStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
self.block.traverse(visitor);
visitor.visit_while_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
self.block.traverse_mut(visitor);
visitor.visit_while_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssReturnStatement {
pub span: Range<usize>,
pub value: Option<ScssValue>,
}
impl ScssReturnStatement {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
if let Some(value) = &self.value {
value.traverse(visitor);
}
visitor.visit_return_statement(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
if let Some(value) = &mut self.value {
value.traverse_mut(visitor);
}
visitor.visit_return_statement_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssComment {
pub span: Range<usize>,
pub text: String,
}
impl ScssComment {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
visitor.visit_comment(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
visitor.visit_comment_mut(self);
}
}
#[derive(Debug, Clone)]
pub struct ScssError {
pub span: Range<usize>,
pub message: String,
}
impl ScssError {
pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
visitor.visit_error(self);
}
pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
visitor.visit_error_mut(self);
}
}
pub trait ScssVisitor {
fn visit_root(&mut self, _node: &ScssRoot) {}
fn visit_rule_set(&mut self, _node: &ScssRuleSet) {}
fn visit_selector(&mut self, _node: &ScssSelector) {}
fn visit_block(&mut self, _node: &ScssBlock) {}
fn visit_declaration(&mut self, _node: &ScssDeclaration) {}
fn visit_property(&mut self, _node: &ScssProperty) {}
fn visit_value(&mut self, _node: &ScssValue) {}
fn visit_mixin_declaration(&mut self, _node: &ScssMixinDeclaration) {}
fn visit_function_declaration(&mut self, _node: &ScssFunctionDeclaration) {}
fn visit_parameter(&mut self, _node: &ScssParameter) {}
fn visit_include_statement(&mut self, _node: &ScssIncludeStatement) {}
fn visit_argument(&mut self, _node: &ScssArgument) {}
fn visit_import_statement(&mut self, _node: &ScssImportStatement) {}
fn visit_variable_declaration(&mut self, _node: &ScssVariableDeclaration) {}
fn visit_if_statement(&mut self, _node: &ScssIfStatement) {}
fn visit_for_statement(&mut self, _node: &ScssForStatement) {}
fn visit_each_statement(&mut self, _node: &ScssEachStatement) {}
fn visit_while_statement(&mut self, _node: &ScssWhileStatement) {}
fn visit_return_statement(&mut self, _node: &ScssReturnStatement) {}
fn visit_comment(&mut self, _node: &ScssComment) {}
fn visit_error(&mut self, _node: &ScssError) {}
}
pub trait ScssVisitorMut {
fn visit_root_mut(&mut self, _node: &mut ScssRoot) {}
fn visit_rule_set_mut(&mut self, _node: &mut ScssRuleSet) {}
fn visit_selector_mut(&mut self, _node: &mut ScssSelector) {}
fn visit_block_mut(&mut self, _node: &mut ScssBlock) {}
fn visit_declaration_mut(&mut self, _node: &mut ScssDeclaration) {}
fn visit_property_mut(&mut self, _node: &mut ScssProperty) {}
fn visit_value_mut(&mut self, _node: &mut ScssValue) {}
fn visit_mixin_declaration_mut(&mut self, _node: &mut ScssMixinDeclaration) {}
fn visit_function_declaration_mut(&mut self, _node: &mut ScssFunctionDeclaration) {}
fn visit_parameter_mut(&mut self, _node: &mut ScssParameter) {}
fn visit_include_statement_mut(&mut self, _node: &mut ScssIncludeStatement) {}
fn visit_argument_mut(&mut self, _node: &mut ScssArgument) {}
fn visit_import_statement_mut(&mut self, _node: &mut ScssImportStatement) {}
fn visit_variable_declaration_mut(&mut self, _node: &mut ScssVariableDeclaration) {}
fn visit_if_statement_mut(&mut self, _node: &mut ScssIfStatement) {}
fn visit_for_statement_mut(&mut self, _node: &mut ScssForStatement) {}
fn visit_each_statement_mut(&mut self, _node: &mut ScssEachStatement) {}
fn visit_while_statement_mut(&mut self, _node: &mut ScssWhileStatement) {}
fn visit_return_statement_mut(&mut self, _node: &mut ScssReturnStatement) {}
fn visit_comment_mut(&mut self, _node: &mut ScssComment) {}
fn visit_error_mut(&mut self, _node: &mut ScssError) {}
}