(
&mut self,
s: S,
d: D,
this_id: NodeID,
block: &Block,
span: &Span,
args: &[Expr],
)
| 315 | } |
| 316 | |
| 317 | pub fn block( |
| 318 | &mut self, |
| 319 | s: S, |
| 320 | d: D, |
| 321 | this_id: NodeID, |
| 322 | block: &Block, |
| 323 | span: &Span, |
| 324 | args: &[Expr], |
| 325 | ) -> io::Result<()> { |
| 326 | if block.args().len() != args.len() { |
| 327 | d.report( |
| 328 | DiagnosticKind::BlockArgsCountMismatch { |
| 329 | block: *block, |
| 330 | given: args.len(), |
| 331 | }, |
| 332 | span, |
| 333 | ) |
| 334 | } |
| 335 | self.begin_inputs()?; |
| 336 | let arg_ids: Vec<NodeID> = (&mut self.id).take(args.len()).collect(); |
| 337 | let menu_id = block.menu().map(|_| self.id.new_id()); |
| 338 | let mut menu_value = None; |
| 339 | let mut menu_is_default = menu_id.is_some(); |
| 340 | for ((&arg_name, arg_value), &arg_id) in block.args().iter().zip(args).zip(&arg_ids) { |
| 341 | if block.menu().is_some_and(|menu| menu.input == arg_name) { |
| 342 | if let Expr::Value { value, span: _ } = &arg_value { |
| 343 | menu_value = Some(value.clone()); |
| 344 | continue; |
| 345 | } else { |
| 346 | menu_is_default = false; |
| 347 | self.input_with_shadow(s, d, arg_name, arg_value, arg_id, menu_id.unwrap())?; |
| 348 | } |
| 349 | } else { |
| 350 | self.input(s, d, arg_name, arg_value, arg_id)?; |
| 351 | } |
| 352 | } |
| 353 | if menu_is_default { |
| 354 | write_comma_io(&mut self.zip, &mut self.inputs_comma)?; |
| 355 | write!( |
| 356 | self, |
| 357 | r#""{}":[1,{}]"#, |
| 358 | block.menu().unwrap().input, |
| 359 | menu_id.unwrap() |
| 360 | )?; |
| 361 | } |
| 362 | self.end_obj()?; // inputs |
| 363 | if let Some(fields) = block.fields() { |
| 364 | write!(self, r#","fields":{fields}"#)?; |
| 365 | } |
| 366 | if let Block::StopOtherScripts = block { |
| 367 | self.write_all( |
| 368 | b",\"mutation\":{\"tagName\":\"mutation\",\"children\": [],\"hasnext\": \"true\"}", |
| 369 | )?; |
| 370 | } |
| 371 | self.end_obj()?; // node |
| 372 | for (arg, arg_id) in args.iter().zip(arg_ids) { |
| 373 | self.expr(s, d, arg, arg_id, this_id)?; |
| 374 | } |
no test coverage detected