Skip to content

Commit 795b7e1

Browse files
authored
Merge pull request #1413 from harehare/feat/support-def-without-params-in-parser
✨feat(lang): support def without params in parser
2 parents 0b2d021 + 08a91db commit 795b7e1

File tree

3 files changed

+229
-50
lines changed

3 files changed

+229
-50
lines changed

Cargo.lock

Lines changed: 61 additions & 47 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/mq-lang/src/ast/parser.rs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,11 @@ impl<'a, 'alloc> Parser<'a, 'alloc> {
11601160
None => Err(SyntaxError::UnexpectedEOFDetected(self.module_id)),
11611161
}?;
11621162
let def_token_id = self.token_arena.alloc(Shared::clone(def_token));
1163-
let params = self.parse_params()?;
1163+
let params = if self.is_next_token(|token| matches!(token, TokenKind::Colon | TokenKind::Do)) {
1164+
SmallVec::new()
1165+
} else {
1166+
self.parse_params()?
1167+
};
11641168

11651169
self.consume_colon_or_do();
11661170

@@ -6768,6 +6772,48 @@ mod tests {
67686772
token(TokenKind::RParen),
67696773
],
67706774
Err(SyntaxError::MultipleVariadicParameters(Token{range: Range::default(), kind: TokenKind::Asterisk, module_id: 1.into()})))]
6775+
#[case::def_without_params(
6776+
vec![
6777+
token(TokenKind::Def),
6778+
token(TokenKind::Ident(SmolStr::new("f"))),
6779+
token(TokenKind::Colon),
6780+
token(TokenKind::Ident(SmolStr::new("args"))),
6781+
token(TokenKind::SemiColon)
6782+
],
6783+
Ok(vec![
6784+
Shared::new(Node {
6785+
token_id: 0.into(),
6786+
expr: Shared::new(Expr::Def(
6787+
IdentWithToken::new_with_token("f", Some(Shared::new(token(TokenKind::Ident(SmolStr::new("f")))))),
6788+
smallvec![],
6789+
vec![Shared::new(Node {
6790+
token_id: 2.into(),
6791+
expr: Shared::new(Expr::Ident(IdentWithToken::new_with_token("args", Some(Shared::new(token(TokenKind::Ident(SmolStr::new("args")))))))),
6792+
})],
6793+
)),
6794+
}),
6795+
]))]
6796+
#[case::def_without_params_with_do(
6797+
vec![
6798+
token(TokenKind::Def),
6799+
token(TokenKind::Ident(SmolStr::new("f"))),
6800+
token(TokenKind::Do),
6801+
token(TokenKind::Ident(SmolStr::new("args"))),
6802+
token(TokenKind::SemiColon)
6803+
],
6804+
Ok(vec![
6805+
Shared::new(Node {
6806+
token_id: 0.into(),
6807+
expr: Shared::new(Expr::Def(
6808+
IdentWithToken::new_with_token("f", Some(Shared::new(token(TokenKind::Ident(SmolStr::new("f")))))),
6809+
smallvec![],
6810+
vec![Shared::new(Node {
6811+
token_id: 2.into(),
6812+
expr: Shared::new(Expr::Ident(IdentWithToken::new_with_token("args", Some(Shared::new(token(TokenKind::Ident(SmolStr::new("args")))))))),
6813+
})],
6814+
)),
6815+
}),
6816+
]))]
67716817
#[case::macro_variadic_param(
67726818
vec![
67736819
token(TokenKind::Macro),

0 commit comments

Comments
 (0)