37 lines
1.1 KiB
Rust
37 lines
1.1 KiB
Rust
use super::Chain;
|
|
use crate::{
|
|
ast::CallArg,
|
|
expr::UntypedExpr,
|
|
parser::{token::Token, ParseError},
|
|
};
|
|
use chumsky::prelude::*;
|
|
|
|
pub(crate) fn parser(
|
|
expression: Recursive<'_, Token, UntypedExpr, ParseError>,
|
|
) -> impl Parser<Token, Chain, Error = ParseError> + '_ {
|
|
choice((
|
|
select! { Token::Name { name } => name }
|
|
.then_ignore(just(Token::Colon))
|
|
.or_not()
|
|
.then(expression)
|
|
.map_with_span(|(label, value), location| CallArg {
|
|
label,
|
|
location,
|
|
value: Some(value),
|
|
}),
|
|
select! { Token::Name { name } => name }
|
|
.then_ignore(just(Token::Colon))
|
|
.or_not()
|
|
.then(select! {Token::DiscardName {name} => name })
|
|
.map_with_span(|(label, name), location| CallArg {
|
|
location,
|
|
label,
|
|
value: Some(UntypedExpr::Var { location, name }),
|
|
}),
|
|
))
|
|
.separated_by(just(Token::Comma))
|
|
.allow_trailing()
|
|
.delimited_by(just(Token::LeftParen), just(Token::RightParen))
|
|
.map_with_span(Chain::Call)
|
|
}
|