Skip to content

Commit e458a03

Browse files
committed
fix special case of layout empty expr; tag 0.1.25
1 parent f7906d6 commit e458a03

File tree

12 files changed

+92
-20
lines changed

12 files changed

+92
-20
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "cirru_parser"
3-
version = "0.1.24"
3+
version = "0.1.25"
44
authors = ["jiyinyiyong <[email protected]>"]
55
edition = "2021"
66
license = "MIT"

examples/demo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defn fib (n)
1717
"#,
1818
);
1919

20-
let large_demo = "/Users/chen/repo/calcit-lang/editor/compact.cirru";
20+
let large_demo = "/Users/chenyong/repo/calcit-lang/editor/compact.cirru";
2121
// let large_demo = "/Users/chen/repo/calcit-lang/respo-calcit-workflow/js-out/program-ir.cirru";
2222
// let large_demo = "/Users/chen/repo/calcit-lang/calcit_runner.rs/js-out/program-ir.cirru";
2323
let content = fs::read_to_string(large_demo).unwrap();

examples/list_match.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#[cfg(feature = "use-serde")]
2+
use std::{fs, io};
3+
4+
#[cfg(feature = "use-serde")]
5+
fn main() -> Result<(), io::Error> {
6+
use cirru_parser::{format, Cirru, CirruWriterOptions};
7+
// use std::collections::hash_map::DefaultHasher;
8+
use cirru_parser::from_json_str;
9+
10+
let files = vec!["list-match"];
11+
12+
for file in files {
13+
println!("testing file: {}", file);
14+
let json_str = fs::read_to_string(format!("./tests/writer_data/{}.json", file))?;
15+
let cirru_str = fs::read_to_string(format!("./tests/writer_cirru/{}.cirru", file))?;
16+
17+
let writer_options = CirruWriterOptions { use_inline: false };
18+
match from_json_str(&json_str) {
19+
Ok(tree) => {
20+
if let Cirru::List(xs) = tree {
21+
assert_eq!(cirru_str, format(&xs, writer_options).unwrap());
22+
} else {
23+
panic!("unexpected leaf here")
24+
}
25+
}
26+
Err(e) => {
27+
println!("{:?}", e);
28+
panic!("failed to load edn data from json");
29+
}
30+
}
31+
}
32+
Ok(())
33+
}
34+
35+
#[cfg(not(feature = "use-serde"))]
36+
fn main() {
37+
println!("this example requires feature `use-serde`");
38+
}

src/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ fn build_exprs(tokens: &[CirruLexItem]) -> Result<Vec<Cirru>, String> {
5757
loop {
5858
let chunk = pull_token();
5959

60-
if chunk == None {
60+
if chunk.is_none() {
6161
return Ok(acc);
6262
}
6363
match chunk.unwrap() {
@@ -67,7 +67,7 @@ fn build_exprs(tokens: &[CirruLexItem]) -> Result<Vec<Cirru>, String> {
6767
let mut pointer_stack: Vec<Vec<Cirru>> = Vec::with_capacity(16);
6868
loop {
6969
let cursor = pull_token();
70-
if cursor == None {
70+
if cursor.is_none() {
7171
return Err(String::from("unexpected end of file"));
7272
}
7373
match cursor.unwrap() {

src/writer.rs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ fn generate_tree(
168168
let at_tail = idx != 0 && !in_tail && prev_kind == WriterNode::Leaf && idx == xs.len() - 1;
169169

170170
// println!("\nloop {:?} {:?}", prev_kind, kind);
171-
// println!("cursor {:?}", cursor);
171+
// println!("cursor {:?} {} {}", cursor, idx, insist_head);
172172
// println!("{:?}", result);
173173

174174
let child: String = match cursor {
@@ -185,7 +185,13 @@ fn generate_tree(
185185
} else if idx == 0 && insist_head {
186186
generate_inline_expr(ys)
187187
} else if kind == WriterNode::Leaf {
188-
generate_empty_expr() // special since empty expr is treated as leaf
188+
if idx == 0 {
189+
let mut ret = render_newline(level);
190+
ret.push_str(&generate_empty_expr());
191+
ret
192+
} else {
193+
generate_empty_expr() // special since empty expr is treated as leaf
194+
}
189195
} else if kind == WriterNode::SimpleExpr {
190196
if prev_kind == WriterNode::Leaf {
191197
generate_inline_expr(ys)
@@ -195,13 +201,7 @@ fn generate_tree(
195201
ret
196202
} else {
197203
let mut ret = render_newline(next_level);
198-
ret.push_str(&generate_tree(
199-
ys,
200-
child_insist_head,
201-
options,
202-
next_level,
203-
false,
204-
)?);
204+
ret.push_str(&generate_tree(ys, child_insist_head, options, next_level, false)?);
205205
ret
206206
}
207207
} else if kind == WriterNode::Expr {
@@ -215,10 +215,7 @@ fn generate_tree(
215215
}
216216
} else if kind == WriterNode::BoxedExpr {
217217
let content = generate_tree(ys, child_insist_head, options, next_level, false)?;
218-
if prev_kind == WriterNode::Nil
219-
|| prev_kind == WriterNode::Leaf
220-
|| prev_kind == WriterNode::SimpleExpr
221-
{
218+
if prev_kind == WriterNode::Nil || prev_kind == WriterNode::Leaf || prev_kind == WriterNode::SimpleExpr {
222219
content
223220
} else {
224221
let mut ret = render_newline(next_level);
@@ -231,8 +228,7 @@ fn generate_tree(
231228
}
232229
};
233230

234-
let bended = kind == WriterNode::Leaf
235-
&& (prev_kind == WriterNode::BoxedExpr || prev_kind == WriterNode::Expr);
231+
let bended = kind == WriterNode::Leaf && (prev_kind == WriterNode::BoxedExpr || prev_kind == WriterNode::Expr);
236232

237233
let chunk = if at_tail
238234
|| (prev_kind == WriterNode::Leaf && kind == WriterNode::Leaf)

tests/cirru/list-match.cirru

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
list-match (a b)
3+
() $ c d
4+
(e f)
5+
g h
6+
i j k

tests/data/list-match.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
[
3+
"list-match",
4+
["a", "b"],
5+
[[], ["c", "d"]],
6+
[
7+
["e", "f"],
8+
["g", "h"],
9+
["i", "j", "k"]
10+
]
11+
]
12+
]

tests/parser_test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ mod json_test {
5656
"quote",
5757
"spaces",
5858
"unfolding",
59+
"list-match",
5960
];
6061
for file in files {
6162
println!("testing file: {}", file);

tests/writer_cirru/list-match.cirru

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
list-match (a b)
3+
() $ c d
4+
(e f)
5+
g h
6+
i j k

tests/writer_data/list-match.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
[
3+
"list-match",
4+
["a", "b"],
5+
[[], ["c", "d"]],
6+
[
7+
["e", "f"],
8+
["g", "h"],
9+
["i", "j", "k"]
10+
]
11+
]
12+
]

tests/writer_test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ mod json_write_test {
6060
"quote",
6161
"spaces",
6262
"unfolding",
63+
"list-match",
6364
];
6465
for file in files {
6566
println!("testing file: {}", file);

0 commit comments

Comments
 (0)