(
&self,
def: &EnumDefinition,
name: &str,
con: &Constructor,
)
| 1942 | } |
| 1943 | |
| 1944 | fn constructor_make_function( |
| 1945 | &self, |
| 1946 | def: &EnumDefinition, |
| 1947 | name: &str, |
| 1948 | con: &Constructor, |
| 1949 | ) -> String { |
| 1950 | let mut out = emitter(); |
| 1951 | |
| 1952 | let ty_name = &def.name; |
| 1953 | let tag = format!("{ty_name}_{cons}", cons = con.name); |
| 1954 | |
| 1955 | let (fields, params): (Vec<_>, Vec<_>) = con |
| 1956 | .fields |
| 1957 | .iter() |
| 1958 | .enumerate() |
| 1959 | .map(|(index, f)| { |
| 1960 | let arg = format!("arg_{index}"); |
| 1961 | let sig = self.to_type(&f.ty); |
| 1962 | let param = format!("{arg} {sig}"); |
| 1963 | |
| 1964 | let field_name = constructor_field_name(&con.name, con.fields.len(), index); |
| 1965 | let field = format!("{field_name}: {arg}"); |
| 1966 | |
| 1967 | (field, param) |
| 1968 | }) |
| 1969 | .unzip(); |
| 1970 | |
| 1971 | let fields = fields.join(", "); |
| 1972 | let params = params.join(", "); |
| 1973 | |
| 1974 | let (generic_params, generic_args) = if def.generics.is_empty() { |
| 1975 | ("".to_string(), "".to_string()) |
| 1976 | } else { |
| 1977 | let args = def |
| 1978 | .generics |
| 1979 | .clone() |
| 1980 | .into_iter() |
| 1981 | .map(|g| g.name) |
| 1982 | .collect::<Vec<_>>() |
| 1983 | .join(", "); |
| 1984 | let generics = generics_to_string(&def.generics); |
| 1985 | (generics, format!("[{args}]")) |
| 1986 | }; |
| 1987 | |
| 1988 | let ret = Type::Con { |
| 1989 | id: Symbol::ethereal(&def.name), |
| 1990 | args: def |
| 1991 | .generics |
| 1992 | .iter() |
| 1993 | .map(|g| Type::Con { |
| 1994 | id: Symbol::ethereal(&g.name), |
| 1995 | args: vec![], |
| 1996 | }) |
| 1997 | .collect(), |
| 1998 | }; |
| 1999 | |
| 2000 | let ret = self.to_type(&ret); |
| 2001 |
no test coverage detected