(&mut self, node: pl::Expr)
| 58 | } |
| 59 | |
| 60 | fn fold_expr(&mut self, node: pl::Expr) -> Result<pl::Expr> { |
| 61 | if node.id.is_some() && !matches!(node.kind, pl::ExprKind::Func(_)) { |
| 62 | return Ok(node); |
| 63 | } |
| 64 | |
| 65 | let id = self.id.gen(); |
| 66 | let alias = Box::new(node.alias.clone()); |
| 67 | let span = Box::new(node.span); |
| 68 | |
| 69 | if let Some(span) = *span { |
| 70 | self.root_mod.span_map.insert(id, span); |
| 71 | } |
| 72 | |
| 73 | log::trace!("folding expr [{id:?}] {node:?}"); |
| 74 | |
| 75 | let r = match node.kind { |
| 76 | pl::ExprKind::Ident(ident) => { |
| 77 | log::debug!("resolving ident {ident}..."); |
| 78 | let fq_ident = self |
| 79 | .resolve_ident(&ident) |
| 80 | .map_err(|e| e.with_span(node.span))?; |
| 81 | log::debug!("... resolved to {fq_ident}"); |
| 82 | let entry = self.root_mod.module.get(&fq_ident).unwrap(); |
| 83 | log::debug!("... which is {entry}"); |
| 84 | |
| 85 | match &entry.kind { |
| 86 | DeclKind::Infer(_) => pl::Expr { |
| 87 | kind: pl::ExprKind::Ident(fq_ident), |
| 88 | target_id: entry.declared_at, |
| 89 | ..node |
| 90 | }, |
| 91 | DeclKind::Column(target_id) => pl::Expr { |
| 92 | kind: pl::ExprKind::Ident(fq_ident), |
| 93 | target_id: Some(*target_id), |
| 94 | ..node |
| 95 | }, |
| 96 | |
| 97 | DeclKind::TableDecl(_) => { |
| 98 | let input_name = ident.name.clone(); |
| 99 | |
| 100 | let lineage = self.lineage_of_table_decl(&fq_ident, input_name, id); |
| 101 | |
| 102 | pl::Expr { |
| 103 | kind: pl::ExprKind::Ident(fq_ident), |
| 104 | ty: Some(ty_of_lineage(&lineage)), |
| 105 | lineage: Some(lineage), |
| 106 | alias: None, |
| 107 | ..node |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | DeclKind::Expr(expr) => match &expr.kind { |
| 112 | pl::ExprKind::Func(closure) => { |
| 113 | let closure = self.fold_function_types(closure.clone())?; |
| 114 | |
| 115 | let expr = pl::Expr::new(pl::ExprKind::Func(closure)); |
| 116 | |
| 117 | if self.in_func_call_name { |
no test coverage detected