Skip to content

Commit

Permalink
support default parameters in closures
Browse files Browse the repository at this point in the history
fixes #89
  • Loading branch information
y21 committed May 12, 2024
1 parent 0319de4 commit d463327
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
24 changes: 21 additions & 3 deletions crates/dash_parser/src/expr.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use dash_middle::interner::{sym, Symbol};
use dash_middle::lexer::token::{Token, TokenType, ASSIGNMENT_TYPES};
use dash_middle::parser::error::Error;
use dash_middle::parser::expr::{ArrayMemberKind, CallArgumentKind, Expr, ExprKind, ObjectMemberKind};
use dash_middle::parser::expr::{
ArrayMemberKind, AssignmentExpr, AssignmentTarget, CallArgumentKind, Expr, ExprKind, LiteralExpr, ObjectMemberKind,
};
use dash_middle::parser::statement::{
Asyncness, BlockStatement, FunctionDeclaration, FunctionKind, Parameter, ReturnStatement, Statement, StatementKind,
};
Expand Down Expand Up @@ -867,8 +869,24 @@ impl<'a, 'interner> Parser<'a, 'interner> {
// e.g. (a: number) => {}
// we need to properly convert types here too

// TODO2: handle parameter default values
list.push((Parameter::Identifier(expr.kind.as_identifier()?), None, None));
let (ident, value) = match expr.kind {
ExprKind::Literal(LiteralExpr::Identifier(ident)) => (ident, None),
ExprKind::Assignment(AssignmentExpr {
left: AssignmentTarget::Expr(left),
right,
..
}) => (left.kind.as_identifier()?, Some(*right)),
_ => {
self.create_error(Error::Unimplemented(
expr.span,
"only assignment and identifier expressions are supported as in closure parameter recovery"
.into(),
));
return None;
}
};

list.push((Parameter::Identifier(ident), value, None));
}

if let Some(rest_binding) = rest_binding {
Expand Down
5 changes: 5 additions & 0 deletions crates/dash_vm/src/test/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -550,3 +550,8 @@ simple_test!(
"#,
Value::undefined()
);

// Issue #89
simple_test!(closure_default_param1, "((v = 1) => v)()", Value::number(1.));

simple_test!(closure_default_param2, "((v = 1) => v)(2)", Value::number(2.));

0 comments on commit d463327

Please sign in to comment.