fix: trace expr

This commit is contained in:
rvcas 2023-07-15 19:51:42 -04:00 committed by Lucas
parent 2edfd33594
commit 69fdee9f7e
17 changed files with 272 additions and 108 deletions

View File

@ -34,13 +34,12 @@ pub fn parser<'a>(
.map_with_span(UntypedExpr::fail), .map_with_span(UntypedExpr::fail),
))), ))),
just(Token::Trace) just(Token::Trace)
.ignore_then(clause(expression.clone()).or_not().ignored().rewind())
.ignore_then(choice((string::hybrid(), expression.clone()))) .ignore_then(choice((string::hybrid(), expression.clone())))
.then(sequence.clone()) .then(sequence.clone().or_not())
.map_with_span(|(text, then_), span| UntypedExpr::Trace { .map_with_span(|(text, then_), span| UntypedExpr::Trace {
kind: TraceKind::Trace, kind: TraceKind::Trace,
location: span, location: span,
then: Box::new(then_), then: Box::new(then_.unwrap_or_else(|| UntypedExpr::todo(None, span))),
text: Box::new(text), text: Box::new(text),
}), }),
)) ))
@ -86,6 +85,24 @@ mod tests {
); );
} }
#[test]
fn todo_empty() {
assert_expr!(
r#"
todo
"#
);
}
#[test]
fn todo_expr() {
assert_expr!(
r#"
todo string.join(["foo", "bar"])
"#
);
}
#[test] #[test]
fn fail_expr() { fn fail_expr() {
assert_expr!( assert_expr!(
@ -106,6 +123,16 @@ mod tests {
#[test] #[test]
fn trace_expr() { fn trace_expr() {
assert_expr!(
r#"
trace string.join(["foo", "bar"])
a
"#
);
}
#[test]
fn trace_expr_todo() {
assert_expr!( assert_expr!(
r#" r#"
trace some_var trace some_var

View File

@ -7,7 +7,7 @@ pub mod assignment;
mod block; mod block;
pub(crate) mod bytearray; pub(crate) mod bytearray;
mod chained; mod chained;
mod fail_todo; mod fail_todo_trace;
mod if_else; mod if_else;
mod int; mod int;
mod list; mod list;
@ -23,7 +23,7 @@ pub use anonymous_function::parser as anonymous_function;
pub use block::parser as block; pub use block::parser as block;
pub use bytearray::parser as bytearray; pub use bytearray::parser as bytearray;
pub use chained::parser as chained; pub use chained::parser as chained;
pub use fail_todo::parser as fail_todo; pub use fail_todo_trace::parser as fail_todo_trace;
pub use if_else::parser as if_else; pub use if_else::parser as if_else;
pub use int::parser as int; pub use int::parser as int;
pub use list::parser as list; pub use list::parser as list;
@ -43,7 +43,7 @@ pub fn parser(
) -> impl Parser<Token, UntypedExpr, Error = ParseError> + '_ { ) -> impl Parser<Token, UntypedExpr, Error = ParseError> + '_ {
recursive(|expression| { recursive(|expression| {
choice(( choice((
fail_todo(expression.clone(), sequence.clone()), fail_todo_trace(expression.clone(), sequence.clone()),
pure_expression(sequence, expression), pure_expression(sequence, expression),
)) ))
}) })

View File

@ -1,34 +1,14 @@
use chumsky::prelude::*; use chumsky::prelude::*;
use crate::{ use crate::{
ast::TraceKind,
expr::UntypedExpr, expr::UntypedExpr,
parser::{ parser::{error::ParseError, token::Token},
error::ParseError,
expr::{block::parser as block, string},
token::Token,
},
}; };
pub fn parser() -> impl Parser<Token, UntypedExpr, Error = ParseError> { pub fn parser() -> impl Parser<Token, UntypedExpr, Error = ParseError> {
recursive(|sequence| { recursive(|sequence| {
choice(( super::parser(sequence.clone())
// just(Token::Trace) .then(sequence.repeated())
// .ignore_then(choice(( .foldl(|current, next| current.append_in_sequence(next))
// string::hybrid(),
// block(sequence.clone()),
// sequence.clone(),
// )))
// .then(sequence.clone())
// .map_with_span(|(text, then_), span| UntypedExpr::Trace {
// kind: TraceKind::Trace,
// location: span,
// then: Box::new(then_),
// text: Box::new(text),
// }),
super::parser(sequence.clone())
.then(sequence.repeated())
.foldl(|current, next| current.append_in_sequence(next)),
))
}) })
} }

View File

@ -1,12 +1,12 @@
--- ---
source: crates/aiken-lang/src/parser/expr/fail_todo.rs source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\nfail @\"foo\"\n" description: "Code:\n\nfail @\"foo\"\n"
--- ---
Trace { Trace {
kind: Error, kind: Error,
location: 0..11, location: 5..11,
then: ErrorTerm { then: ErrorTerm {
location: 0..11, location: 5..11,
}, },
text: String { text: String {
location: 5..11, location: 5..11,

View File

@ -1,12 +1,12 @@
--- ---
source: crates/aiken-lang/src/parser/expr/fail_todo.rs source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\nfail \"foo\"\n" description: "Code:\n\nfail \"foo\"\n"
--- ---
Trace { Trace {
kind: Error, kind: Error,
location: 0..10, location: 5..10,
then: ErrorTerm { then: ErrorTerm {
location: 0..10, location: 5..10,
}, },
text: String { text: String {
location: 5..10, location: 5..10,

View File

@ -0,0 +1,15 @@
---
source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\nfail\n"
---
Trace {
kind: Error,
location: 1..2,
then: ErrorTerm {
location: 1..2,
},
text: String {
location: 1..2,
value: "aiken::error",
},
}

View File

@ -1,63 +1,54 @@
--- ---
source: crates/aiken-lang/src/parser/expr/fail_todo.rs source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\nfail str.join([@\"Some string \", some_params, @\" some string\"], @\"\")\n" description: "Code:\n\nfail str.join([@\"Some string \", some_params, @\" some string\"], @\"\")\n"
--- ---
Sequence { Trace {
location: 0..67, kind: Error,
expressions: [ location: 5..67,
Trace { then: ErrorTerm {
kind: Error, location: 5..67,
location: 0..4, },
then: ErrorTerm { text: Call {
location: 0..4, arguments: [
}, CallArg {
text: String { label: None,
location: 0..4, location: 14..61,
value: "aiken::error", value: List {
},
},
Call {
arguments: [
CallArg {
label: None,
location: 14..61, location: 14..61,
value: List { elements: [
location: 14..61, String {
elements: [ location: 15..30,
String { value: "Some string ",
location: 15..30, },
value: "Some string ", Var {
}, location: 32..43,
Var { name: "some_params",
location: 32..43, },
name: "some_params", String {
}, location: 45..60,
String { value: " some string",
location: 45..60, },
value: " some string", ],
}, tail: None,
],
tail: None,
},
},
CallArg {
label: None,
location: 63..66,
value: String {
location: 63..66,
value: "",
},
},
],
fun: FieldAccess {
location: 5..13,
label: "join",
container: Var {
location: 5..8,
name: "str",
}, },
}, },
location: 5..67, CallArg {
label: None,
location: 63..66,
value: String {
location: 63..66,
value: "",
},
},
],
fun: FieldAccess {
location: 5..13,
label: "join",
container: Var {
location: 5..8,
name: "str",
},
}, },
], location: 5..67,
},
} }

View File

@ -1,12 +1,12 @@
--- ---
source: crates/aiken-lang/src/parser/expr/error_todo.rs source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\ntodo @\"foo\"\n" description: "Code:\n\ntodo @\"foo\"\n"
--- ---
Trace { Trace {
kind: Todo, kind: Todo,
location: 0..11, location: 5..11,
then: ErrorTerm { then: ErrorTerm {
location: 0..11, location: 5..11,
}, },
text: String { text: String {
location: 5..11, location: 5..11,

View File

@ -0,0 +1,15 @@
---
source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\ntodo\n"
---
Trace {
kind: Todo,
location: 1..2,
then: ErrorTerm {
location: 1..2,
},
text: String {
location: 1..2,
value: "aiken::todo",
},
}

View File

@ -0,0 +1,52 @@
---
source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\ntodo string.join([\"foo\", \"bar\"])\n"
---
Trace {
kind: Todo,
location: 5..32,
then: ErrorTerm {
location: 5..32,
},
text: Call {
arguments: [
CallArg {
label: None,
location: 17..31,
value: List {
location: 17..31,
elements: [
ByteArray {
location: 18..23,
bytes: [
102,
111,
111,
],
preferred_format: Utf8String,
},
ByteArray {
location: 25..30,
bytes: [
98,
97,
114,
],
preferred_format: Utf8String,
},
],
tail: None,
},
},
],
fun: FieldAccess {
location: 5..16,
label: "join",
container: Var {
location: 5..11,
name: "string",
},
},
location: 5..32,
},
}

View File

@ -1,12 +1,12 @@
--- ---
source: crates/aiken-lang/src/parser/expr/error_todo.rs source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\ntodo \"foo\"\n" description: "Code:\n\ntodo \"foo\"\n"
--- ---
Trace { Trace {
kind: Todo, kind: Todo,
location: 0..10, location: 5..10,
then: ErrorTerm { then: ErrorTerm {
location: 0..10, location: 5..10,
}, },
text: String { text: String {
location: 5..10, location: 5..10,

View File

@ -0,0 +1,53 @@
---
source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\ntrace string.join([\"foo\", \"bar\"])\na\n"
---
Trace {
kind: Trace,
location: 0..35,
then: Var {
location: 34..35,
name: "a",
},
text: Call {
arguments: [
CallArg {
label: None,
location: 18..32,
value: List {
location: 18..32,
elements: [
ByteArray {
location: 19..24,
bytes: [
102,
111,
111,
],
preferred_format: Utf8String,
},
ByteArray {
location: 26..31,
bytes: [
98,
97,
114,
],
preferred_format: Utf8String,
},
],
tail: None,
},
},
],
fun: FieldAccess {
location: 6..17,
label: "join",
container: Var {
location: 6..12,
name: "string",
},
},
location: 6..33,
},
}

View File

@ -0,0 +1,23 @@
---
source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs
description: "Code:\n\ntrace some_var \n"
---
Trace {
kind: Trace,
location: 0..14,
then: Trace {
kind: Todo,
location: 0..14,
then: ErrorTerm {
location: 0..14,
},
text: String {
location: 0..14,
value: "aiken::todo",
},
},
text: Var {
location: 6..14,
name: "some_var",
},
}

View File

@ -26,12 +26,12 @@ When {
guard: None, guard: None,
then: Trace { then: Trace {
kind: Todo, kind: Todo,
location: 28..32, location: 35..39,
then: ErrorTerm { then: ErrorTerm {
location: 28..32, location: 35..39,
}, },
text: String { text: String {
location: 28..32, location: 35..39,
value: "aiken::todo", value: "aiken::todo",
}, },
}, },
@ -53,12 +53,12 @@ When {
guard: None, guard: None,
then: Trace { then: Trace {
kind: Todo, kind: Todo,
location: 47..51, location: 52..53,
then: ErrorTerm { then: ErrorTerm {
location: 47..51, location: 52..53,
}, },
text: String { text: String {
location: 47..51, location: 52..53,
value: "aiken::todo", value: "aiken::todo",
}, },
}, },

View File

@ -26,12 +26,12 @@ When {
guard: None, guard: None,
then: Trace { then: Trace {
kind: Error, kind: Error,
location: 28..32, location: 33..34,
then: ErrorTerm { then: ErrorTerm {
location: 28..32, location: 33..34,
}, },
text: String { text: String {
location: 28..32, location: 33..34,
value: "aiken::error", value: "aiken::error",
}, },
}, },

View File

@ -46,9 +46,9 @@ When {
guard: None, guard: None,
then: Trace { then: Trace {
kind: Todo, kind: Todo,
location: 47..68, location: 52..68,
then: ErrorTerm { then: ErrorTerm {
location: 47..68, location: 52..68,
}, },
text: String { text: String {
location: 52..68, location: 52..68,

View File

@ -0,0 +1,8 @@
---
source: crates/aiken-lang/src/tests/format.rs
description: "Code:\n\nfn foo() {\n fail some_var\n}\n"
---
fn foo() {
fail some_var
}