(
&mut self,
cases: &[(&str, Option<Type>)],
lowered_types: &[WasmType],
op: &str,
results: &mut Vec<String>,
)
| 77 | } |
| 78 | |
| 79 | fn lower_variant( |
| 80 | &mut self, |
| 81 | cases: &[(&str, Option<Type>)], |
| 82 | lowered_types: &[WasmType], |
| 83 | op: &str, |
| 84 | results: &mut Vec<String>, |
| 85 | ) { |
| 86 | let blocks = self |
| 87 | .blocks |
| 88 | .drain(self.blocks.len() - cases.len()..) |
| 89 | .collect::<Vec<_>>(); |
| 90 | |
| 91 | let payloads = self |
| 92 | .payloads |
| 93 | .drain(self.payloads.len() - cases.len()..) |
| 94 | .collect::<Vec<_>>(); |
| 95 | |
| 96 | let lowered = lowered_types |
| 97 | .iter() |
| 98 | .map(|_| self.locals.tmp("lowered")) |
| 99 | .collect::<Vec<_>>(); |
| 100 | |
| 101 | results.extend(lowered.iter().cloned()); |
| 102 | |
| 103 | let declarations = lowered |
| 104 | .iter() |
| 105 | .zip(lowered_types) |
| 106 | .map(|(lowered, ty)| format!("{} {lowered};", crate::world_generator::wasm_type(*ty))) |
| 107 | .collect::<Vec<_>>() |
| 108 | .join("\n"); |
| 109 | |
| 110 | let cases = cases |
| 111 | .iter() |
| 112 | .zip(blocks) |
| 113 | .zip(payloads) |
| 114 | .enumerate() |
| 115 | .map( |
| 116 | |(i, (((name, ty), Block { body, results, .. }), payload))| { |
| 117 | let payload = if let Some(ty) = self.interface_gen.non_empty_type(ty.as_ref()) { |
| 118 | let ty = self.interface_gen.type_name_with_qualifier(ty, true); |
| 119 | let name = name.to_upper_camel_case(); |
| 120 | |
| 121 | format!("{ty} {payload} = {op}.As{name};") |
| 122 | } else { |
| 123 | String::new() |
| 124 | }; |
| 125 | |
| 126 | let assignments = lowered |
| 127 | .iter() |
| 128 | .zip(&results) |
| 129 | .map(|(lowered, result)| format!("{lowered} = {result};\n")) |
| 130 | .collect::<Vec<_>>() |
| 131 | .concat(); |
| 132 | |
| 133 | format!( |
| 134 | "case {i}: {{ |
| 135 | {payload} |
| 136 | {body} |
no test coverage detected