Skip to content

Commit 91fb76b

Browse files
Tweak ast print (#88)
* feat: 🎸 ast print * feat: 🎸 temp * feat: 🎸 assets * feat: 🎸 simple css ast passed * feat: 🎸 update cargo lock * chore: 🤖 remove pretty_assertions * style: 💄 fmt * feat: 🎸 pass more testcase * style: 💄 fmt
1 parent 40f5954 commit 91fb76b

18 files changed

+65466
-122
lines changed

Cargo.lock

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/simple.css

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/test.css

Lines changed: 0 additions & 4 deletions
This file was deleted.

crates/recursive-parser/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ edition = "2021"
1010
# cssparser = "0.29.0"
1111
tokenizer = { path = "../tokenizer" }
1212
mimalloc-rust = "0.1"
13+
anyhow = "1.0.47"
1314

1415
[profile.release]
1516
lto = true
@@ -18,7 +19,8 @@ panic = "abort"
1819

1920
[dev-dependencies]
2021
criterion = "0.3.5"
22+
similar-asserts = "1.1.0"
2123

2224
[[bench]]
2325
name = "parse"
24-
harness = false
26+
harness = false
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
use anyhow::Result;
2+
use std::io::Write;
3+
4+
use crate::{parser, visitor::Visit};
5+
#[derive(Default)]
6+
pub struct AstPrinter<W: Write> {
7+
level: usize,
8+
writer: W,
9+
}
10+
11+
impl<W: Write> AstPrinter<W> {
12+
pub fn new(level: usize, writer: W) -> Self {
13+
Self { level, writer }
14+
}
15+
16+
pub fn print<'a>(&mut self, root: &'a parser::Root<'a>) -> Result<()> {
17+
self.visit_root(root)?;
18+
Ok(())
19+
}
20+
21+
pub fn result(self) -> W {
22+
self.writer
23+
}
24+
}
25+
26+
impl<'a, W: Write> Visit<'a, Result<()>> for AstPrinter<W> {
27+
fn visit_root(&mut self, root: &parser::Root) -> Result<()> {
28+
writeln!(
29+
self.writer,
30+
"{}Root@{:?}",
31+
" ".repeat(self.level * 2),
32+
root.start..root.end
33+
)?;
34+
self.level += 1;
35+
for child in &root.children {
36+
match child {
37+
parser::RuleOrAtRuleOrDecl::Rule(rule) => {
38+
self.visit_rule(rule)?;
39+
}
40+
parser::RuleOrAtRuleOrDecl::AtRule(at_rule) => {
41+
self.visit_at_rule(at_rule)?;
42+
}
43+
parser::RuleOrAtRuleOrDecl::Declaration(decl) => {
44+
self.visit_declaration(decl)?;
45+
}
46+
}
47+
}
48+
self.level -= 1;
49+
Ok(())
50+
}
51+
52+
fn visit_rule(&mut self, rule: &parser::Rule) -> Result<()> {
53+
writeln!(
54+
self.writer,
55+
"{}Rule@{:?}",
56+
" ".repeat(self.level * 2),
57+
rule.start..rule.end
58+
)?;
59+
self.level += 1;
60+
writeln!(
61+
self.writer,
62+
"{}selector: `{}`",
63+
" ".repeat(self.level * 2),
64+
rule.selector.content,
65+
)?;
66+
for child in &rule.children {
67+
match child {
68+
parser::RuleOrAtRuleOrDecl::Rule(rule) => {
69+
self.visit_rule(rule)?;
70+
}
71+
parser::RuleOrAtRuleOrDecl::AtRule(at_rule) => {
72+
self.visit_at_rule(at_rule)?;
73+
}
74+
parser::RuleOrAtRuleOrDecl::Declaration(decl) => {
75+
self.visit_declaration(decl)?;
76+
}
77+
}
78+
}
79+
self.level -= 1;
80+
Ok(())
81+
}
82+
83+
fn visit_at_rule(&mut self, at_rule: &parser::AtRule) -> Result<()> {
84+
writeln!(
85+
self.writer,
86+
"{}AtRule@{:?}",
87+
" ".repeat(self.level * 2),
88+
at_rule.start..at_rule.end
89+
)?;
90+
self.level += 1;
91+
writeln!(
92+
self.writer,
93+
"{}name: `{}`",
94+
" ".repeat(self.level * 2),
95+
at_rule.name,
96+
)?;
97+
writeln!(
98+
self.writer,
99+
"{}params: `{}`",
100+
" ".repeat(self.level * 2),
101+
at_rule.params,
102+
)?;
103+
for child in &at_rule.children {
104+
match child {
105+
parser::RuleOrAtRuleOrDecl::Rule(rule) => {
106+
self.visit_rule(rule)?;
107+
}
108+
parser::RuleOrAtRuleOrDecl::AtRule(at_rule) => {
109+
self.visit_at_rule(at_rule)?;
110+
}
111+
parser::RuleOrAtRuleOrDecl::Declaration(decl) => {
112+
self.visit_declaration(decl)?;
113+
}
114+
}
115+
}
116+
self.level -= 1;
117+
Ok(())
118+
}
119+
120+
fn visit_declaration(&mut self, decl: &parser::Declaration) -> Result<()> {
121+
writeln!(
122+
self.writer,
123+
"{}Declaration@{:?}",
124+
" ".repeat(self.level * 2),
125+
decl.start..decl.end
126+
)?;
127+
self.level += 1;
128+
writeln!(
129+
self.writer,
130+
"{}prop: `{}`",
131+
" ".repeat(self.level * 2),
132+
decl.prop.content,
133+
)?;
134+
writeln!(
135+
self.writer,
136+
"{}value: `{}`",
137+
" ".repeat(self.level * 2),
138+
decl.value.content,
139+
)?;
140+
self.level -= 1;
141+
Ok(())
142+
}
143+
}
144+
145+
#[derive(Debug, Default)]
146+
pub struct WrapString(pub String);
147+
impl WrapString {
148+
pub fn inner_string(mut self) -> String {
149+
self.0
150+
}
151+
}
152+
153+
impl From<String> for WrapString {
154+
fn from(string: String) -> Self {
155+
Self(string)
156+
}
157+
}
158+
159+
impl Write for WrapString {
160+
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
161+
self.0 += std::str::from_utf8(buf).unwrap();
162+
Ok(buf.len())
163+
}
164+
165+
fn flush(&mut self) -> std::io::Result<()> {
166+
Ok(())
167+
}
168+
}

0 commit comments

Comments
 (0)