MCPcopy Create free account
hub / github.com/PRQL/prql / fold_function

Method fold_function

prqlc/prqlc/src/semantic/resolver/functions.rs:16–101  ·  view source on GitHub ↗
(&mut self, closure: Box<Func>, span: Option<Span>)

Source from the content-addressed store, hash-verified

14
15impl 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();

Callers 1

fold_exprMethod · 0.80

Calls 14

expr_of_funcFunction · 0.85
fold_function_typesMethod · 0.80
lenMethod · 0.80
with_spanMethod · 0.80
is_emptyMethod · 0.80
apply_args_to_closureMethod · 0.80
stack_pushMethod · 0.80
resolve_function_argsMethod · 0.80
mapMethod · 0.80
starts_withMethod · 0.80
resolve_special_funcMethod · 0.80
materialize_functionMethod · 0.80

Tested by

no test coverage detected