(&mut self, closure: Box<Func>, span: Option<Span>)
| 14 | |
| 15 | impl Resolver<'_> { |
| 16 | pub fn fold_function(&mut self, closure: Box<Func>, span: Option<Span>) -> Result<Expr> { |
| 17 | let closure = self.fold_function_types(closure)?; |
| 18 | |
| 19 | log::debug!( |
| 20 | "func {} {}/{} params", |
| 21 | closure.as_debug_name(), |
| 22 | closure.args.len(), |
| 23 | closure.params.len() |
| 24 | ); |
| 25 | |
| 26 | if closure.args.len() > closure.params.len() { |
| 27 | return Err(Error::new_simple(format!( |
| 28 | "Too many arguments to function `{}`", |
| 29 | closure.as_debug_name() |
| 30 | )) |
| 31 | .with_span(span)); |
| 32 | } |
| 33 | |
| 34 | let enough_args = closure.args.len() == closure.params.len(); |
| 35 | if !enough_args { |
| 36 | return Ok(*expr_of_func(closure, span)); |
| 37 | } |
| 38 | |
| 39 | // make sure named args are pushed into params |
| 40 | let closure = if !closure.named_params.is_empty() { |
| 41 | self.apply_args_to_closure(closure, [].into(), [].into())? |
| 42 | } else { |
| 43 | closure |
| 44 | }; |
| 45 | |
| 46 | // push the env |
| 47 | let closure_env = Module::from_exprs(closure.env); |
| 48 | self.root_mod.module.stack_push(NS_PARAM, closure_env); |
| 49 | let closure = Box::new(Func { |
| 50 | env: HashMap::new(), |
| 51 | ..*closure |
| 52 | }); |
| 53 | |
| 54 | if log::log_enabled!(log::Level::Debug) { |
| 55 | let name = closure |
| 56 | .name_hint |
| 57 | .clone() |
| 58 | .unwrap_or_else(|| Ident::from_name("<unnamed>")); |
| 59 | log::debug!("resolving args of function {name}"); |
| 60 | } |
| 61 | let res = self.resolve_function_args(closure)?; |
| 62 | |
| 63 | let closure = match res { |
| 64 | Ok(func) => func, |
| 65 | Err(func) => { |
| 66 | return Ok(*expr_of_func(func, span)); |
| 67 | } |
| 68 | }; |
| 69 | |
| 70 | let needs_window = (closure.params.last()) |
| 71 | .and_then(|p| p.ty.as_ref()) |
| 72 | .map(types::is_sub_type_of_array) |
| 73 | .unwrap_or_default(); |
no test coverage detected