1use{
2 std::cell::Cell,
3 crate::{
4 makepad_live_compiler::*,
5 shader_ast::*,
6 shader_registry::ShaderRegistry
7 }
8};
9
10pub struct LhsChecker<'a> {
11 pub scopes: &'a Scopes,
12 pub shader_registry: &'a ShaderRegistry,
13}
14
15impl<'a> LhsChecker<'a> {
16 pub fn lhs_check_expr(&mut self, expr: &Expr) -> Result<(), LiveError> {
17 match expr.kind {
18 ExprKind::Cond {
19 span,
20 ref expr,
21 ref expr_if_true,
22 ref expr_if_false,
23 ..
24 } => self.lhs_check_cond_expr(span, expr, expr_if_true, expr_if_false),
25 ExprKind::Bin {
26 span,
27 op,
28 ref left_expr,
29 ref right_expr,
30 ..
31 } => self.lhs_check_bin_expr(span, op, left_expr, right_expr),
32 ExprKind::Un {span, op, ref expr} => self.lhs_check_un_expr(span, op, expr),
33 ExprKind::Field {
34 span,
35 ref expr,
36 field_ident,
37 } => self.lhs_check_field_expr(span, expr, field_ident),
38 ExprKind::Index {
39 span,
40 ref expr,
41 ref index_expr,
42 } => self.lhs_check_index_expr(span, expr, index_expr),
43 ExprKind::MethodCall {
44 span,
45 ..
46 } => self.lhs_check_all_call_expr(span),
47 ExprKind::PlainCall {
48 span,
49 ..
50 } => self.lhs_check_all_call_expr(span),
51 ExprKind::ClosureDef(_) => self.lhs_check_closure(expr.span),
56 ExprKind::BuiltinCall {
57 span,
58 ..
59 } => self.lhs_check_all_call_expr(span),
60 ExprKind::ConsCall {
61 span,
62 ..
63 } => self.lhs_check_all_call_expr(span),
64 ExprKind::StructCons {
65 span,
66 ..
67 } => self.lhs_check_all_call_expr(span),
68 ExprKind::Var {
69 span,
70 ref kind,
71 ..
72 } => self.lhs_check_var_expr(span, kind),
73 ExprKind::Lit {span, lit} => self.lhs_check_lit_expr(span, lit),
74 }
75 }
76
77 fn lhs_check_closure(
78 &mut self,
79 span: TokenSpan,
80 ) -> Result<(), LiveError> {
81 return Err(LiveError {
82 origin: live_error_origin!(),
83 span:span.into(),
84 message: String::from("expression is not a valid left hand side"),
85 });
86 }
87
88 fn lhs_check_cond_expr(
89 &mut self,
90 span: TokenSpan,
91 _expr: &Expr,
92 _expr_if_true: &Expr,
93 _expr_if_false: &Expr,
94 ) -> Result<(), LiveError> {
95 return Err(LiveError {
96 origin: live_error_origin!(),
97 span:span.into(),
98 message: String::from("expression is not a valid left hand side"),
99 });
100 }
101
102 fn lhs_check_bin_expr(
103 &mut self,
104 span: TokenSpan,
105 _op: BinOp,
106 _left_expr: &Expr,
107 _right_expr: &Expr,
108 ) -> Result<(), LiveError> {
109 return Err(LiveError {
110 origin:live_error_origin!(),
111 span:span.into(),
112 message: String::from("expression is not a valid left hand side"),
113 });
114 }
115
116 fn lhs_check_un_expr(&mut self, span: TokenSpan, _op: UnOp, _expr: &Expr) -> Result<(), LiveError> {
117 return Err(LiveError {
118 origin:live_error_origin!(),
119 span:span.into(),
120 message: String::from("expression is not a valid left hand side"),
121 });
122 }
123
124 fn lhs_check_all_call_expr(
125 &mut self,
126 span: TokenSpan,
127 ) -> Result<(), LiveError> {
128 return Err(LiveError {
129 origin:live_error_origin!(),
130 span:span.into(),
131 message: String::from("expression is not a valid left hand side"),
132 });
133 }
134
135 fn lhs_check_field_expr(
136 &mut self,
137 span: TokenSpan,
138 expr: &Expr,
139 field_ident: Ident,
140 ) -> Result<(), LiveError> {
141 match expr.ty.borrow().as_ref().unwrap(){
143 Ty::DrawShader(shader_ptr)=>{
144 let field_decl = self.shader_registry.draw_shader_defs.get(shader_ptr).unwrap().find_field(field_ident) .unwrap();
145 match &field_decl.kind{
146 DrawShaderFieldKind::Varying{..}=>{
147 Ok(())
148 }
149 _=>{
150 Err(LiveError {
151 origin:live_error_origin!(),
152 span:span.into(),
153 message: String::from("Can only assign to varying values for shader self"),
154 })
155 }
156 }
157 }
158 _=>{
159 self.lhs_check_expr(expr)
160 }
161 }
162 }
163
164 fn lhs_check_index_expr(
165 &mut self,
166 _span: TokenSpan,
167 expr: &Expr,
168 _index_expr: &Expr,
169 ) -> Result<(), LiveError> {
170 self.lhs_check_expr(expr)
171 }
172
173 fn lhs_check_call_expr(
174 &mut self,
175 span: TokenSpan,
176 _ident_path: IdentPath,
177 _arg_exprs: &[Expr],
178 ) -> Result<(), LiveError> {
179 return Err(LiveError {
180 origin:live_error_origin!(),
181 span:span.into(),
182 message: String::from("expression is not a valid left hand side"),
183 });
184 }
185
186 fn lhs_check_var_expr(
187 &mut self,
188 span: TokenSpan,
189 kind: &Cell<Option<VarKind >>,
190 ) -> Result<(), LiveError> {
191 if let VarKind::MutLocal{..} = kind.get().unwrap(){
192 Ok(())
193 }
194 else{
195 Err(LiveError {
196 origin:live_error_origin!(),
197 span:span.into(),
198 message: String::from("expression is not a valid left hand side"),
199 })
200 }
201 }
202 fn lhs_check_lit_expr(&mut self, _span: TokenSpan, _lit: Lit) -> Result<(), LiveError> {
217 Ok(())
218 }
219}