1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[derive(Debug, Clone)]
6pub struct ScssRoot {
7 pub span: Range<usize>,
9 pub children: Vec<ScssNode>,
11}
12
13impl ScssRoot {
14 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
16 for child in &self.children {
17 child.traverse(visitor);
18 }
19 visitor.visit_root(self);
20 }
21
22 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
24 for child in &mut self.children {
25 child.traverse_mut(visitor);
26 }
27 visitor.visit_root_mut(self);
28 }
29}
30
31#[derive(Debug, Clone)]
33pub enum ScssNode {
34 RuleSet(ScssRuleSet),
36 MixinDeclaration(ScssMixinDeclaration),
38 FunctionDeclaration(ScssFunctionDeclaration),
40 IncludeStatement(ScssIncludeStatement),
42 ImportStatement(ScssImportStatement),
44 VariableDeclaration(ScssVariableDeclaration),
46 IfStatement(ScssIfStatement),
48 ForStatement(ScssForStatement),
50 EachStatement(ScssEachStatement),
52 WhileStatement(ScssWhileStatement),
54 ReturnStatement(ScssReturnStatement),
56 Comment(ScssComment),
58 Error(ScssError),
60}
61
62impl ScssNode {
63 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
65 match self {
66 ScssNode::RuleSet(node) => node.traverse(visitor),
67 ScssNode::MixinDeclaration(node) => node.traverse(visitor),
68 ScssNode::FunctionDeclaration(node) => node.traverse(visitor),
69 ScssNode::IncludeStatement(node) => node.traverse(visitor),
70 ScssNode::ImportStatement(node) => node.traverse(visitor),
71 ScssNode::VariableDeclaration(node) => node.traverse(visitor),
72 ScssNode::IfStatement(node) => node.traverse(visitor),
73 ScssNode::ForStatement(node) => node.traverse(visitor),
74 ScssNode::EachStatement(node) => node.traverse(visitor),
75 ScssNode::WhileStatement(node) => node.traverse(visitor),
76 ScssNode::ReturnStatement(node) => node.traverse(visitor),
77 ScssNode::Comment(node) => node.traverse(visitor),
78 ScssNode::Error(node) => node.traverse(visitor),
79 }
80 }
81
82 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
84 match self {
85 ScssNode::RuleSet(node) => node.traverse_mut(visitor),
86 ScssNode::MixinDeclaration(node) => node.traverse_mut(visitor),
87 ScssNode::FunctionDeclaration(node) => node.traverse_mut(visitor),
88 ScssNode::IncludeStatement(node) => node.traverse_mut(visitor),
89 ScssNode::ImportStatement(node) => node.traverse_mut(visitor),
90 ScssNode::VariableDeclaration(node) => node.traverse_mut(visitor),
91 ScssNode::IfStatement(node) => node.traverse_mut(visitor),
92 ScssNode::ForStatement(node) => node.traverse_mut(visitor),
93 ScssNode::EachStatement(node) => node.traverse_mut(visitor),
94 ScssNode::WhileStatement(node) => node.traverse_mut(visitor),
95 ScssNode::ReturnStatement(node) => node.traverse_mut(visitor),
96 ScssNode::Comment(node) => node.traverse_mut(visitor),
97 ScssNode::Error(node) => node.traverse_mut(visitor),
98 }
99 }
100}
101
102#[derive(Debug, Clone)]
104pub struct ScssRuleSet {
105 pub span: Range<usize>,
107 pub selector: ScssSelector,
109 pub block: ScssBlock,
111}
112
113impl ScssRuleSet {
114 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
116 self.selector.traverse(visitor);
117 self.block.traverse(visitor);
118 visitor.visit_rule_set(self);
119 }
120
121 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
123 self.selector.traverse_mut(visitor);
124 self.block.traverse_mut(visitor);
125 visitor.visit_rule_set_mut(self);
126 }
127}
128
129#[derive(Debug, Clone)]
131pub struct ScssSelector {
132 pub span: Range<usize>,
134 pub text: String,
136}
137
138impl ScssSelector {
139 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
141 visitor.visit_selector(self);
142 }
143
144 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
146 visitor.visit_selector_mut(self);
147 }
148}
149
150#[derive(Debug, Clone)]
152pub struct ScssBlock {
153 pub span: Range<usize>,
155 pub children: Vec<ScssNode>,
157}
158
159impl ScssBlock {
160 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
162 for child in &self.children {
163 child.traverse(visitor);
164 }
165 visitor.visit_block(self);
166 }
167
168 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
170 for child in &mut self.children {
171 child.traverse_mut(visitor);
172 }
173 visitor.visit_block_mut(self);
174 }
175}
176
177#[derive(Debug, Clone)]
179pub struct ScssDeclaration {
180 pub span: Range<usize>,
182 pub property: ScssProperty,
184 pub value: ScssValue,
186}
187
188impl ScssDeclaration {
189 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
191 self.property.traverse(visitor);
192 self.value.traverse(visitor);
193 visitor.visit_declaration(self);
194 }
195
196 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
198 self.property.traverse_mut(visitor);
199 self.value.traverse_mut(visitor);
200 visitor.visit_declaration_mut(self);
201 }
202}
203
204#[derive(Debug, Clone)]
206pub struct ScssProperty {
207 pub span: Range<usize>,
209 pub name: String,
211}
212
213impl ScssProperty {
214 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
216 visitor.visit_property(self);
217 }
218
219 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
221 visitor.visit_property_mut(self);
222 }
223}
224
225#[derive(Debug, Clone)]
227pub struct ScssValue {
228 pub span: Range<usize>,
230 pub text: String,
232}
233
234impl ScssValue {
235 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
237 visitor.visit_value(self);
238 }
239
240 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
242 visitor.visit_value_mut(self);
243 }
244}
245
246#[derive(Debug, Clone)]
248pub struct ScssMixinDeclaration {
249 pub span: Range<usize>,
251 pub name: String,
253 pub parameters: Vec<ScssParameter>,
255 pub block: ScssBlock,
257}
258
259impl ScssMixinDeclaration {
260 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
262 for param in &self.parameters {
263 param.traverse(visitor);
264 }
265 self.block.traverse(visitor);
266 visitor.visit_mixin_declaration(self);
267 }
268
269 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
271 for param in &mut self.parameters {
272 param.traverse_mut(visitor);
273 }
274 self.block.traverse_mut(visitor);
275 visitor.visit_mixin_declaration_mut(self);
276 }
277}
278
279#[derive(Debug, Clone)]
281pub struct ScssFunctionDeclaration {
282 pub span: Range<usize>,
284 pub name: String,
286 pub parameters: Vec<ScssParameter>,
288 pub block: ScssBlock,
290}
291
292impl ScssFunctionDeclaration {
293 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
295 for param in &self.parameters {
296 param.traverse(visitor);
297 }
298 self.block.traverse(visitor);
299 visitor.visit_function_declaration(self);
300 }
301
302 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
304 for param in &mut self.parameters {
305 param.traverse_mut(visitor);
306 }
307 self.block.traverse_mut(visitor);
308 visitor.visit_function_declaration_mut(self);
309 }
310}
311
312#[derive(Debug, Clone)]
314pub struct ScssParameter {
315 pub span: Range<usize>,
317 pub name: String,
319 pub default_value: Option<ScssValue>,
321}
322
323impl ScssParameter {
324 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
326 if let Some(value) = &self.default_value {
327 value.traverse(visitor);
328 }
329 visitor.visit_parameter(self);
330 }
331
332 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
334 if let Some(value) = &mut self.default_value {
335 value.traverse_mut(visitor);
336 }
337 visitor.visit_parameter_mut(self);
338 }
339}
340
341#[derive(Debug, Clone)]
343pub struct ScssIncludeStatement {
344 pub span: Range<usize>,
346 pub name: String,
348 pub arguments: Vec<ScssArgument>,
350 pub block: Option<ScssBlock>,
352}
353
354impl ScssIncludeStatement {
355 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
357 for arg in &self.arguments {
358 arg.traverse(visitor);
359 }
360 if let Some(block) = &self.block {
361 block.traverse(visitor);
362 }
363 visitor.visit_include_statement(self);
364 }
365
366 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
368 for arg in &mut self.arguments {
369 arg.traverse_mut(visitor);
370 }
371 if let Some(block) = &mut self.block {
372 block.traverse_mut(visitor);
373 }
374 visitor.visit_include_statement_mut(self);
375 }
376}
377
378#[derive(Debug, Clone)]
380pub struct ScssArgument {
381 pub span: Range<usize>,
383 pub value: ScssValue,
385}
386
387impl ScssArgument {
388 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
390 self.value.traverse(visitor);
391 visitor.visit_argument(self);
392 }
393
394 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
396 self.value.traverse_mut(visitor);
397 visitor.visit_argument_mut(self);
398 }
399}
400
401#[derive(Debug, Clone)]
403pub struct ScssImportStatement {
404 pub span: Range<usize>,
406 pub path: String,
408}
409
410impl ScssImportStatement {
411 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
413 visitor.visit_import_statement(self);
414 }
415
416 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
418 visitor.visit_import_statement_mut(self);
419 }
420}
421
422#[derive(Debug, Clone)]
424pub struct ScssVariableDeclaration {
425 pub span: Range<usize>,
427 pub name: String,
429 pub value: ScssValue,
431}
432
433impl ScssVariableDeclaration {
434 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
436 self.value.traverse(visitor);
437 visitor.visit_variable_declaration(self);
438 }
439
440 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
442 self.value.traverse_mut(visitor);
443 visitor.visit_variable_declaration_mut(self);
444 }
445}
446
447#[derive(Debug, Clone)]
449pub struct ScssIfStatement {
450 pub span: Range<usize>,
452 pub condition: String,
454 pub then_block: ScssBlock,
456 pub else_block: Option<ScssBlock>,
458}
459
460impl ScssIfStatement {
461 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
463 self.then_block.traverse(visitor);
464 if let Some(block) = &self.else_block {
465 block.traverse(visitor);
466 }
467 visitor.visit_if_statement(self);
468 }
469
470 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
472 self.then_block.traverse_mut(visitor);
473 if let Some(block) = &mut self.else_block {
474 block.traverse_mut(visitor);
475 }
476 visitor.visit_if_statement_mut(self);
477 }
478}
479
480#[derive(Debug, Clone)]
482pub struct ScssForStatement {
483 pub span: Range<usize>,
485 pub variable: String,
487 pub start: String,
489 pub end: String,
491 pub inclusive: bool,
493 pub block: ScssBlock,
495}
496
497impl ScssForStatement {
498 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
500 self.block.traverse(visitor);
501 visitor.visit_for_statement(self);
502 }
503
504 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
506 self.block.traverse_mut(visitor);
507 visitor.visit_for_statement_mut(self);
508 }
509}
510
511#[derive(Debug, Clone)]
513pub struct ScssEachStatement {
514 pub span: Range<usize>,
516 pub variables: Vec<String>,
518 pub list: String,
520 pub block: ScssBlock,
522}
523
524impl ScssEachStatement {
525 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
527 self.block.traverse(visitor);
528 visitor.visit_each_statement(self);
529 }
530
531 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
533 self.block.traverse_mut(visitor);
534 visitor.visit_each_statement_mut(self);
535 }
536}
537
538#[derive(Debug, Clone)]
540pub struct ScssWhileStatement {
541 pub span: Range<usize>,
543 pub condition: String,
545 pub block: ScssBlock,
547}
548
549impl ScssWhileStatement {
550 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
552 self.block.traverse(visitor);
553 visitor.visit_while_statement(self);
554 }
555
556 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
558 self.block.traverse_mut(visitor);
559 visitor.visit_while_statement_mut(self);
560 }
561}
562
563#[derive(Debug, Clone)]
565pub struct ScssReturnStatement {
566 pub span: Range<usize>,
568 pub value: Option<ScssValue>,
570}
571
572impl ScssReturnStatement {
573 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
575 if let Some(value) = &self.value {
576 value.traverse(visitor);
577 }
578 visitor.visit_return_statement(self);
579 }
580
581 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
583 if let Some(value) = &mut self.value {
584 value.traverse_mut(visitor);
585 }
586 visitor.visit_return_statement_mut(self);
587 }
588}
589
590#[derive(Debug, Clone)]
592pub struct ScssComment {
593 pub span: Range<usize>,
595 pub text: String,
597}
598
599impl ScssComment {
600 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
602 visitor.visit_comment(self);
603 }
604
605 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
607 visitor.visit_comment_mut(self);
608 }
609}
610
611#[derive(Debug, Clone)]
613pub struct ScssError {
614 pub span: Range<usize>,
616 pub message: String,
618}
619
620impl ScssError {
621 pub fn traverse<V: ScssVisitor>(&self, visitor: &mut V) {
623 visitor.visit_error(self);
624 }
625
626 pub fn traverse_mut<V: ScssVisitorMut>(&mut self, visitor: &mut V) {
628 visitor.visit_error_mut(self);
629 }
630}
631
632pub trait ScssVisitor {
634 fn visit_root(&mut self, _node: &ScssRoot) {}
636 fn visit_rule_set(&mut self, _node: &ScssRuleSet) {}
638 fn visit_selector(&mut self, _node: &ScssSelector) {}
640 fn visit_block(&mut self, _node: &ScssBlock) {}
642 fn visit_declaration(&mut self, _node: &ScssDeclaration) {}
644 fn visit_property(&mut self, _node: &ScssProperty) {}
646 fn visit_value(&mut self, _node: &ScssValue) {}
648 fn visit_mixin_declaration(&mut self, _node: &ScssMixinDeclaration) {}
650 fn visit_function_declaration(&mut self, _node: &ScssFunctionDeclaration) {}
652 fn visit_parameter(&mut self, _node: &ScssParameter) {}
654 fn visit_include_statement(&mut self, _node: &ScssIncludeStatement) {}
656 fn visit_argument(&mut self, _node: &ScssArgument) {}
658 fn visit_import_statement(&mut self, _node: &ScssImportStatement) {}
660 fn visit_variable_declaration(&mut self, _node: &ScssVariableDeclaration) {}
662 fn visit_if_statement(&mut self, _node: &ScssIfStatement) {}
664 fn visit_for_statement(&mut self, _node: &ScssForStatement) {}
666 fn visit_each_statement(&mut self, _node: &ScssEachStatement) {}
668 fn visit_while_statement(&mut self, _node: &ScssWhileStatement) {}
670 fn visit_return_statement(&mut self, _node: &ScssReturnStatement) {}
672 fn visit_comment(&mut self, _node: &ScssComment) {}
674 fn visit_error(&mut self, _node: &ScssError) {}
676}
677
678pub trait ScssVisitorMut {
680 fn visit_root_mut(&mut self, _node: &mut ScssRoot) {}
682 fn visit_rule_set_mut(&mut self, _node: &mut ScssRuleSet) {}
684 fn visit_selector_mut(&mut self, _node: &mut ScssSelector) {}
686 fn visit_block_mut(&mut self, _node: &mut ScssBlock) {}
688 fn visit_declaration_mut(&mut self, _node: &mut ScssDeclaration) {}
690 fn visit_property_mut(&mut self, _node: &mut ScssProperty) {}
692 fn visit_value_mut(&mut self, _node: &mut ScssValue) {}
694 fn visit_mixin_declaration_mut(&mut self, _node: &mut ScssMixinDeclaration) {}
696 fn visit_function_declaration_mut(&mut self, _node: &mut ScssFunctionDeclaration) {}
698 fn visit_parameter_mut(&mut self, _node: &mut ScssParameter) {}
700 fn visit_include_statement_mut(&mut self, _node: &mut ScssIncludeStatement) {}
702 fn visit_argument_mut(&mut self, _node: &mut ScssArgument) {}
704 fn visit_import_statement_mut(&mut self, _node: &mut ScssImportStatement) {}
706 fn visit_variable_declaration_mut(&mut self, _node: &mut ScssVariableDeclaration) {}
708 fn visit_if_statement_mut(&mut self, _node: &mut ScssIfStatement) {}
710 fn visit_for_statement_mut(&mut self, _node: &mut ScssForStatement) {}
712 fn visit_each_statement_mut(&mut self, _node: &mut ScssEachStatement) {}
714 fn visit_while_statement_mut(&mut self, _node: &mut ScssWhileStatement) {}
716 fn visit_return_statement_mut(&mut self, _node: &mut ScssReturnStatement) {}
718 fn visit_comment_mut(&mut self, _node: &mut ScssComment) {}
720 fn visit_error_mut(&mut self, _node: &mut ScssError) {}
722}