(
&mut self,
s: S,
d: D,
this_id: NodeID,
parent_id: NodeID,
repr: &Repr,
span: &Span,
args: &[Expr],
)
| 102 | } |
| 103 | |
| 104 | pub fn repr( |
| 105 | &mut self, |
| 106 | s: S, |
| 107 | d: D, |
| 108 | this_id: NodeID, |
| 109 | parent_id: NodeID, |
| 110 | repr: &Repr, |
| 111 | span: &Span, |
| 112 | args: &[Expr], |
| 113 | ) -> io::Result<()> { |
| 114 | if args.len() != repr.args().len() { |
| 115 | d.report( |
| 116 | DiagnosticKind::ReprArgsCountMismatch { |
| 117 | repr: *repr, |
| 118 | given: args.len(), |
| 119 | }, |
| 120 | span, |
| 121 | ); |
| 122 | return Ok(()); |
| 123 | } |
| 124 | self.begin_node(Node::new(repr.opcode(), this_id).parent_id(parent_id))?; |
| 125 | let arg_ids: Vec<NodeID> = (&mut self.id).take(args.len()).collect(); |
| 126 | let menu_id = repr.menu().map(|_| self.id.new_id()); |
| 127 | let mut menu_value = None; |
| 128 | let mut menu_is_default = menu_id.is_some(); |
| 129 | self.begin_inputs()?; |
| 130 | for ((&arg_name, arg_value), &arg_id) in repr.args().iter().zip(args).zip(&arg_ids) { |
| 131 | if repr.menu().is_some_and(|menu| menu.input == arg_name) { |
| 132 | if let Expr::Value { value, span: _ } = arg_value { |
| 133 | menu_value = Some(value.clone()); |
| 134 | continue; |
| 135 | } else { |
| 136 | menu_is_default = false; |
| 137 | self.input_with_shadow(s, d, arg_name, arg_value, arg_id, menu_id.unwrap())?; |
| 138 | } |
| 139 | } else { |
| 140 | self.input(s, d, arg_name, arg_value, arg_id)?; |
| 141 | } |
| 142 | } |
| 143 | if menu_is_default { |
| 144 | write_comma_io(&mut self.zip, &mut self.inputs_comma)?; |
| 145 | write!( |
| 146 | self, |
| 147 | r#""{}":[1,{}]"#, |
| 148 | repr.menu().unwrap().input, |
| 149 | menu_id.unwrap() |
| 150 | )?; |
| 151 | } |
| 152 | self.end_obj()?; // inputs |
| 153 | if let Some(fields) = repr.fields() { |
| 154 | write!(self, r#","fields":{fields}"#)?; |
| 155 | } |
| 156 | self.end_obj()?; // node |
| 157 | for (arg, arg_id) in args.iter().zip(arg_ids) { |
| 158 | self.expr(s, d, arg, arg_id, this_id)?; |
| 159 | } |
| 160 | if let Some(menu) = repr.menu() { |
| 161 | self.begin_node( |
no test coverage detected