1use{
2 std::cell::Cell,
3 crate::{
4 makepad_live_compiler::{
5 TokenSpan
6 },
7 shader_ast::*,
8 shader_registry::ShaderRegistry
9 }
10};
11
12
13#[derive(Clone)]
14pub struct DepAnalyser<'a> {
15 pub fn_def: &'a FnDef,
16 pub shader_registry: &'a ShaderRegistry,
17 pub scopes: &'a Scopes,
18}
19
20impl<'a> DepAnalyser<'a> {
21 pub fn dep_analyse_expr(&mut self, expr: &Expr) {
22 match expr.kind {
23 ExprKind::Cond {
24 span,
25 ref expr,
26 ref expr_if_true,
27 ref expr_if_false,
28 } => self.dep_analyse_cond_expr(span, expr, expr_if_true, expr_if_false),
29 ExprKind::Bin {
30 span,
31 op,
32 ref left_expr,
33 ref right_expr,
34 } => self.dep_analyse_bin_expr(span, op, left_expr, right_expr),
35 ExprKind::Un {span, op, ref expr} => self.dep_analyse_un_expr(span, op, expr),
36 ExprKind::Field {
37 span,
38 ref expr,
39 field_ident,
40 } => self.dep_analyse_field_expr(span, expr, field_ident),
41 ExprKind::Index {
42 span,
43 ref expr,
44 ref index_expr,
45 } => self.dep_analyse_index_expr(span, expr, index_expr),
46 ExprKind::MethodCall {
47 span,
48 ident,
49 ref arg_exprs,
50 ..
51 } => self.dep_analyse_method_call_expr(span, ident, arg_exprs),
52 ExprKind::PlainCall {
53 span,
54 ref arg_exprs,
56 ref param_index,
57 fn_ptr,
58 ..
59 } => if param_index.get().is_none() {
60 self.dep_analyse_plain_call_expr(span, arg_exprs, fn_ptr.unwrap())
61 },
62 ExprKind::BuiltinCall {
63 span,
64 ident,
65 ref arg_exprs,
66 } => self.dep_analyse_builtin_call_expr(span, ident, arg_exprs),
67 ExprKind::ClosureDef(_) => (),
68 ExprKind::ConsCall {
69 span,
70 ty_lit,
71 ref arg_exprs,
72 } => self.dep_analyse_cons_call_expr(span, ty_lit, arg_exprs),
73 ExprKind::StructCons{
74 struct_ptr,
75 span,
76 ref args
77 } => self.dep_analyse_struct_cons(struct_ptr, span, args),
78 ExprKind::Var {
79 span,
80 ref kind,
81 ..
82 } => self.dep_analyse_var_expr(span, expr.ty.borrow().as_ref(), kind),
83 ExprKind::Lit {span, lit} => self.dep_analyse_lit_expr(span, lit),
84 }
85 }
86
87 fn dep_analyse_cond_expr(
88 &mut self,
89 _span: TokenSpan,
90 expr: &Expr,
91 expr_if_true: &Expr,
92 expr_if_false: &Expr,
93 ) {
94 self.dep_analyse_expr(expr);
95 self.dep_analyse_expr(expr_if_true);
96 self.dep_analyse_expr(expr_if_false);
97 }
98
99 fn dep_analyse_bin_expr(
100 &mut self,
101 _span: TokenSpan,
102 _op: BinOp,
103 left_expr: &Expr,
104 right_expr: &Expr,
105 ) {
106 self.dep_analyse_expr(left_expr);
107 self.dep_analyse_expr(right_expr);
108 }
109
110 fn dep_analyse_un_expr(&mut self, _span: TokenSpan, _op: UnOp, expr: &Expr) {
111 self.dep_analyse_expr(expr);
112 }
113
114 fn dep_analyse_method_call_expr(
115 &mut self,
116 _span: TokenSpan,
117 method_ident: Ident,
118 arg_exprs: &[Expr],
119 ) {
120 match arg_exprs[0].ty.borrow().as_ref().unwrap() {
121 Ty::Struct(struct_ptr) => {
122 for arg_expr in arg_exprs {
124 self.dep_analyse_expr(arg_expr);
125 }
126 let mut set = self.fn_def.callees.borrow_mut();
127 let struct_decl = self.shader_registry.structs.get(struct_ptr).unwrap();
129 if let Some(fn_node_ptr) = self.shader_registry.struct_method_ptr_from_ident(struct_decl, method_ident){
130 set.as_mut().unwrap().insert(fn_node_ptr);
131 }
132 }
134 Ty::DrawShader(shader_ptr)=>{
135 for arg_expr in arg_exprs {
137 self.dep_analyse_expr(arg_expr);
138 }
139 let mut set = self.fn_def.callees.borrow_mut();
140 let draw_shader_decl = self.shader_registry.draw_shader_defs.get(shader_ptr).unwrap();
141 if let Some(fn_node_ptr) = self.shader_registry.draw_shader_method_ptr_from_ident(draw_shader_decl, method_ident){
142 set.as_mut().unwrap().insert(fn_node_ptr);
143 }
144 }
145 _ => panic!(),
146 }
147 }
148
149 fn dep_analyse_builtin_call_expr(
150 &mut self,
151 _span: TokenSpan,
152 ident: Ident,
153 arg_exprs: &[Expr],
154 ) {
155 for arg_expr in arg_exprs {
156 self.dep_analyse_expr(arg_expr);
157 }
158 self.fn_def
159 .builtin_deps
160 .borrow_mut()
161 .as_mut()
162 .unwrap()
163 .insert(ident);
164 }
165
166
167 fn dep_analyse_plain_call_expr(
168 &mut self,
169 _span: TokenSpan,
170 arg_exprs: &[Expr],
172 fn_ptr: FnPtr,
173
174 ) {
175 for arg_expr in arg_exprs {
177 self.dep_analyse_expr(arg_expr);
178 }
179 let mut set = self.fn_def.callees.borrow_mut();
180 set.as_mut().unwrap().insert(fn_ptr);
181 }
182
183 fn dep_analyse_field_expr(&mut self, _span: TokenSpan, expr: &Expr, field_ident: Ident) {
184 match expr.ty.borrow().as_ref().unwrap(){
186 Ty::DrawShader(_)=>{
187 self.fn_def.draw_shader_refs.borrow_mut().as_mut().unwrap().insert(field_ident);
188 }
189 _=>{
190 self.dep_analyse_expr(expr)
191 }
192 }
193
194 }
195
196 fn dep_analyse_index_expr(&mut self, _span: TokenSpan, expr: &Expr, index_expr: &Expr) {
197 self.dep_analyse_expr(expr);
198 self.dep_analyse_expr(index_expr);
199 }
200
201 fn dep_analyse_cons_call_expr(&mut self, _span: TokenSpan, ty_lit: TyLit, arg_exprs: &[Expr]) {
202 for arg_expr in arg_exprs {
203 self.dep_analyse_expr(arg_expr);
204 }
205 self.fn_def
206 .constructor_fn_deps
207 .borrow_mut()
208 .as_mut()
209 .unwrap()
210 .insert((
211 ty_lit,
212 arg_exprs
213 .iter()
214 .map( | arg_expr | arg_expr.ty.borrow().as_ref().unwrap().clone())
215 .collect::<Vec<_ >> (),
216 ));
217 }
218
219 fn dep_analyse_struct_cons(
220 &mut self,
221 struct_ptr: StructPtr,
222 _span: TokenSpan,
223 args: &Vec<(Ident,Expr)>,
224 ) {
225 self.fn_def.struct_refs.borrow_mut().as_mut().unwrap().insert(struct_ptr);
227 for arg in args{
228 self.dep_analyse_expr(&arg.1);
229 }
230 }
231
232 fn dep_analyse_var_expr(&mut self, _span: TokenSpan, ty:Option<&Ty>, kind: &Cell<Option<VarKind >>) {
233 match kind.get().unwrap() {
235 VarKind::LiveValue(value_ptr)=>{
236 self.fn_def.live_refs.borrow_mut().as_mut().unwrap().insert(value_ptr, ty.unwrap().clone());
237 }
238 VarKind::Local{..} | VarKind::MutLocal{..}=>{ match ty{
240 Some(Ty::Struct(struct_ptr))=>{
241 self.fn_def.struct_refs.borrow_mut().as_mut().unwrap().insert(*struct_ptr);
242 }
243 Some(Ty::Array{..})=>{
244 todo!();
245 }
246 _=>()
247 }
248 },
249 };
250
251 }
252
253 fn dep_analyse_lit_expr(&mut self, _span: TokenSpan, _lit: Lit) {}
254}