Introduce 'fail once' and alter behavior of 'fail' keyword for properties.

This commit is contained in:
KtorZ
2024-05-30 17:18:50 +02:00
parent 28515e70ec
commit 5694d9f9cb
26 changed files with 141 additions and 94 deletions

View File

@@ -1,10 +1,9 @@
use chumsky::prelude::*;
use crate::{
ast,
expr::UntypedExpr,
parser::{annotation, error::ParseError, expr, token::Token, utils},
};
use chumsky::prelude::*;
pub fn parser() -> impl Parser<Token, ast::UntypedDefinition, Error = ParseError> {
utils::optional_flag(Token::Pub)
@@ -41,7 +40,7 @@ pub fn parser() -> impl Parser<Token, ast::UntypedDefinition, Error = ParseError
public,
return_annotation,
return_type: (),
can_error: true,
on_test_failure: ast::OnTestFailure::FailImmediately,
})
},
)

View File

@@ -54,6 +54,6 @@ Test(
),
return_type: (),
end_position: 38,
can_error: false,
on_test_failure: FailImmediately,
},
)

View File

@@ -43,6 +43,6 @@ Test(
),
return_type: (),
end_position: 40,
can_error: false,
on_test_failure: FailImmediately,
},
)

View File

@@ -50,6 +50,6 @@ Test(
),
return_type: (),
end_position: 38,
can_error: false,
on_test_failure: FailImmediately,
},
)

View File

@@ -23,6 +23,6 @@ Test(
),
return_type: (),
end_position: 22,
can_error: false,
on_test_failure: FailImmediately,
},
)

View File

@@ -54,6 +54,6 @@ Test(
),
return_type: (),
end_position: 60,
can_error: true,
on_test_failure: SucceedEventually,
},
)

View File

@@ -56,7 +56,7 @@ Validator(
return_annotation: None,
return_type: (),
end_position: 52,
can_error: true,
on_test_failure: FailImmediately,
},
other_fun: Some(
Function {
@@ -97,7 +97,7 @@ Validator(
return_annotation: None,
return_type: (),
end_position: 88,
can_error: true,
on_test_failure: FailImmediately,
},
),
location: 0..9,

View File

@@ -46,6 +46,6 @@ Fn(
return_annotation: None,
return_type: (),
end_position: 27,
can_error: true,
on_test_failure: FailImmediately,
},
)

View File

@@ -23,6 +23,6 @@ Fn(
return_annotation: None,
return_type: (),
end_position: 14,
can_error: true,
on_test_failure: FailImmediately,
},
)

View File

@@ -23,6 +23,6 @@ Fn(
return_annotation: None,
return_type: (),
end_position: 10,
can_error: true,
on_test_failure: FailImmediately,
},
)

View File

@@ -56,7 +56,7 @@ Validator(
return_annotation: None,
return_type: (),
end_position: 52,
can_error: true,
on_test_failure: FailImmediately,
},
other_fun: None,
location: 0..9,

View File

@@ -1,5 +1,6 @@
use crate::{
ast,
ast::OnTestFailure,
expr::UntypedExpr,
parser::{
annotation,
@@ -12,41 +13,42 @@ use crate::{
use chumsky::prelude::*;
pub fn parser() -> impl Parser<Token, ast::UntypedDefinition, Error = ParseError> {
// TODO: can remove Token::Bang after a few releases (curr v1.0.11)
just(Token::Bang)
.ignored()
.or_not()
.then_ignore(just(Token::Test))
.then(select! {Token::Name {name} => name})
just(Token::Test)
.ignore_then(select! {Token::Name {name} => name})
.then(
via()
.separated_by(just(Token::Comma))
.allow_trailing()
.delimited_by(just(Token::LeftParen), just(Token::RightParen)),
)
.then(just(Token::Fail).ignored().or_not())
.then(
just(Token::Fail)
.ignore_then(just(Token::Once).ignored().or_not().map(|once| {
once.map(|_| OnTestFailure::SucceedImmediately)
.unwrap_or(OnTestFailure::SucceedEventually)
}))
.or_not(),
)
.map_with_span(|name, span| (name, span))
.then(
expr::sequence()
.or_not()
.delimited_by(just(Token::LeftBrace), just(Token::RightBrace)),
)
.map_with_span(
|(((((old_fail, name), arguments), fail), span_end), body), span| {
ast::UntypedDefinition::Test(ast::Function {
arguments,
body: body.unwrap_or_else(|| UntypedExpr::todo(None, span)),
doc: None,
location: span_end,
end_position: span.end - 1,
name,
public: false,
return_annotation: Some(ast::Annotation::boolean(span)),
return_type: (),
can_error: fail.is_some() || old_fail.is_some(),
})
},
)
.map_with_span(|((((name, arguments), fail), span_end), body), span| {
ast::UntypedDefinition::Test(ast::Function {
arguments,
body: body.unwrap_or_else(|| UntypedExpr::todo(None, span)),
doc: None,
location: span_end,
end_position: span.end - 1,
name,
public: false,
return_annotation: Some(ast::Annotation::boolean(span)),
return_type: (),
on_test_failure: fail.unwrap_or(OnTestFailure::FailImmediately),
})
})
}
pub fn via() -> impl Parser<Token, ast::UntypedArgVia, Error = ParseError> {

View File

@@ -223,6 +223,7 @@ pub fn lexer() -> impl Parser<char, Vec<(Token, Span)>, Error = ParseError> {
// TODO: remove this in a future release
"error" => Token::Fail,
"fail" => Token::Fail,
"once" => Token::Once,
"as" => Token::As,
"and" => Token::And,
"or" => Token::Or,

View File

@@ -78,6 +78,7 @@ pub enum Token {
If,
Else,
Fail,
Once,
Expect,
Is,
Let,
@@ -178,6 +179,7 @@ impl fmt::Display for Token {
Token::Type => "type",
Token::Test => "test",
Token::Fail => "fail",
Token::Once => "once",
Token::Validator => "validator",
Token::Via => "via",
};