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

Method fold_expr

prqlc/prqlc/src/semantic/resolver/expr.rs:60–207  ·  view source on GitHub ↗
(&mut self, node: pl::Expr)

Source from the content-addressed store, hash-verified

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 {

Callers 2

fold_var_defMethod · 0.45

Calls 15

IdentClass · 0.85
genMethod · 0.80
resolve_identMethod · 0.80
with_spanMethod · 0.80
lineage_of_table_declMethod · 0.80
fold_function_typesMethod · 0.80
into_iterMethod · 0.80
try_castMethod · 0.80
apply_args_to_closureMethod · 0.80
fold_functionMethod · 0.80

Tested by

no test coverage detected