(
&mut self,
s: S,
d: D,
this_id: NodeID,
name: &SmolStr,
span: &Span,
args: &[Expr],
)
| 311 | } |
| 312 | |
| 313 | pub fn func_call( |
| 314 | &mut self, |
| 315 | s: S, |
| 316 | d: D, |
| 317 | this_id: NodeID, |
| 318 | name: &SmolStr, |
| 319 | span: &Span, |
| 320 | args: &[Expr], |
| 321 | ) -> io::Result<()> { |
| 322 | let Some(func) = s.sprite.funcs.get(name) else { |
| 323 | d.report(DiagnosticKind::UnrecognizedFunction(name.clone()), span); |
| 324 | return Ok(()); |
| 325 | }; |
| 326 | if func.args.len() != args.len() { |
| 327 | d.report( |
| 328 | DiagnosticKind::FuncArgsCountMismatch { |
| 329 | func: name.clone(), |
| 330 | given: args.len(), |
| 331 | }, |
| 332 | span, |
| 333 | ) |
| 334 | } |
| 335 | let mut qualified_args: Vec<(SmolStr, NodeID)> = vec![]; |
| 336 | let mut qualified_arg_values: Vec<Expr> = vec![]; |
| 337 | self.begin_inputs()?; |
| 338 | for (arg, arg_value) in func.args.iter().zip(args) { |
| 339 | match &arg.type_ { |
| 340 | Type::Value => { |
| 341 | let arg_id = self.id.new_id(); |
| 342 | self.input(s, d, &arg.name, arg_value, arg_id)?; |
| 343 | qualified_args.push((arg.name.clone(), arg_id)); |
| 344 | qualified_arg_values.push(arg_value.clone()); |
| 345 | } |
| 346 | Type::Struct { |
| 347 | name: type_name, |
| 348 | span: type_span, |
| 349 | } => { |
| 350 | let Some(struct_) = s.get_struct(type_name) else { |
| 351 | continue; |
| 352 | }; |
| 353 | let arg_value = arg_value; |
| 354 | let struct_literal_fields = match arg_value { |
| 355 | Expr::StructLiteral { |
| 356 | name: struct_literal_name, |
| 357 | span: struct_literal_span, |
| 358 | fields: struct_literal_fields, |
| 359 | } => { |
| 360 | if struct_literal_name != &struct_.name { |
| 361 | d.report( |
| 362 | DiagnosticKind::TypeMismatch { |
| 363 | expected: arg.type_.clone(), |
| 364 | given: Type::Struct { |
| 365 | name: struct_literal_name.clone(), |
| 366 | span: struct_literal_span.clone(), |
| 367 | }, |
| 368 | }, |
| 369 | type_span, |
| 370 | ); |
no test coverage detected