Introduce 'fail once' and alter behavior of 'fail' keyword for properties.
This commit is contained in:
@@ -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,
|
||||
})
|
||||
},
|
||||
)
|
||||
|
||||
@@ -54,6 +54,6 @@ Test(
|
||||
),
|
||||
return_type: (),
|
||||
end_position: 38,
|
||||
can_error: false,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -43,6 +43,6 @@ Test(
|
||||
),
|
||||
return_type: (),
|
||||
end_position: 40,
|
||||
can_error: false,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -50,6 +50,6 @@ Test(
|
||||
),
|
||||
return_type: (),
|
||||
end_position: 38,
|
||||
can_error: false,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -23,6 +23,6 @@ Test(
|
||||
),
|
||||
return_type: (),
|
||||
end_position: 22,
|
||||
can_error: false,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -54,6 +54,6 @@ Test(
|
||||
),
|
||||
return_type: (),
|
||||
end_position: 60,
|
||||
can_error: true,
|
||||
on_test_failure: SucceedEventually,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -46,6 +46,6 @@ Fn(
|
||||
return_annotation: None,
|
||||
return_type: (),
|
||||
end_position: 27,
|
||||
can_error: true,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -23,6 +23,6 @@ Fn(
|
||||
return_annotation: None,
|
||||
return_type: (),
|
||||
end_position: 14,
|
||||
can_error: true,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -23,6 +23,6 @@ Fn(
|
||||
return_annotation: None,
|
||||
return_type: (),
|
||||
end_position: 10,
|
||||
can_error: true,
|
||||
on_test_failure: FailImmediately,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user