MCPcopy Create free account
hub / github.com/bytecodealliance/wit-bindgen / lower_variant

Method lower_variant

crates/csharp/src/function.rs:79–158  ·  view source on GitHub ↗
(
        &mut self,
        cases: &[(&str, Option<Type>)],
        lowered_types: &[WasmType],
        op: &str,
        results: &mut Vec<String>,
    )

Source from the content-addressed store, hash-verified

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}

Callers 1

emitMethod · 0.45

Calls 9

newFunction · 0.85
mapMethod · 0.80
extendMethod · 0.80
joinMethod · 0.80
concatMethod · 0.80
iterMethod · 0.45
tmpMethod · 0.45
non_empty_typeMethod · 0.45

Tested by

no test coverage detected