(
&mut self,
proc: &Proc,
s: S,
d: D,
this_id: NodeID,
name: &SmolStr,
span: &Span,
args: &[Expr],
compact: bool,
)
| 473 | } |
| 474 | |
| 475 | fn proc_call_impl( |
| 476 | &mut self, |
| 477 | proc: &Proc, |
| 478 | s: S, |
| 479 | d: D, |
| 480 | this_id: NodeID, |
| 481 | name: &SmolStr, |
| 482 | span: &Span, |
| 483 | args: &[Expr], |
| 484 | compact: bool, |
| 485 | ) -> io::Result<()> { |
| 486 | if proc.args.len() != args.len() { |
| 487 | d.report( |
| 488 | DiagnosticKind::ProcArgsCountMismatch { |
| 489 | proc: name.clone(), |
| 490 | given: args.len(), |
| 491 | }, |
| 492 | span, |
| 493 | ) |
| 494 | } |
| 495 | let mut qualified_args: Vec<(SmolStr, NodeID)> = Vec::new(); |
| 496 | let mut qualified_arg_values: Vec<&Expr> = Vec::new(); |
| 497 | self.begin_inputs()?; |
| 498 | for (arg, arg_value) in proc.args.iter().zip(args) { |
| 499 | match &arg.type_ { |
| 500 | Type::Value => { |
| 501 | let arg_id = self.id.new_id(); |
| 502 | self.input(s, d, &arg.name, arg_value, arg_id)?; |
| 503 | qualified_args.push((arg.name.clone(), arg_id)); |
| 504 | qualified_arg_values.push(arg_value); |
| 505 | } |
| 506 | Type::Struct { |
| 507 | name: type_name, |
| 508 | span: type_span, |
| 509 | } => { |
| 510 | let Some(struct_) = s.get_struct(type_name) else { |
| 511 | continue; |
| 512 | }; |
| 513 | let struct_literal_fields = match arg_value { |
| 514 | Expr::StructLiteral { |
| 515 | name: struct_literal_name, |
| 516 | span: struct_literal_span, |
| 517 | fields: struct_literal_fields, |
| 518 | } => { |
| 519 | if struct_literal_name != &struct_.name { |
| 520 | d.report( |
| 521 | DiagnosticKind::TypeMismatch { |
| 522 | expected: arg.type_.clone(), |
| 523 | given: Type::Struct { |
| 524 | name: struct_literal_name.clone(), |
| 525 | span: struct_literal_span.clone(), |
| 526 | }, |
| 527 | }, |
| 528 | type_span, |
| 529 | ); |
| 530 | continue; |
| 531 | } |
| 532 | if struct_literal_fields.len() != struct_.fields.len() { |
no test coverage detected