witx_codegen/assemblyscript/
tuple.rs

1use std::io::Write;
2
3use super::*;
4
5pub struct Tuple;
6
7impl Tuple {
8    pub fn name_for(tuple_members: &[ASTupleMember]) -> String {
9        format!(
10            "WasiTuple{}{}",
11            tuple_members.len(),
12            tuple_members
13                .iter()
14                .map(|member| member.type_.to_string())
15                .collect::<Vec<_>>()
16                .join("_")
17        )
18    }
19}
20
21impl AssemblyScriptGenerator {
22    pub fn define_as_tuple<T: Write>(
23        w: &mut PrettyWriter<T>,
24        name: &str,
25        members: &[ASTupleMember],
26    ) -> Result<(), Error> {
27        w.write_line("// @ts-ignore: decorator")?
28            .write_line("@unmanaged")?
29            .write_line(format!("export class {} {{ // -- Tuple", name.as_type()))?;
30        {
31            let mut w = w.new_block();
32            for (i, member) in members.iter().enumerate() {
33                let member_type = member.type_.as_ref();
34                w.write_line(format!("v{}: {};", i, member_type.as_lang()))?;
35
36                let pad_len = member.padding;
37                for i in 0..(pad_len & 1) {
38                    w.write_line(format!("private __pad8_{}: u8;", i))?;
39                }
40                for i in 0..(pad_len & 3) / 2 {
41                    w.write_line(format!("private __pad16_{}: u16;", i))?;
42                }
43                for i in 0..(pad_len & 7) / 4 {
44                    w.write_line(format!("private __pad32_{}: u32;", i))?;
45                }
46                for i in 0..pad_len / 8 {
47                    w.write_line(format!("private __pad64_{}: u64;", i))?;
48                }
49            }
50        }
51        w.write_line("}")?.eob()?;
52        Ok(())
53    }
54}