Skip to main content

xidl_parser/hir/interface/
convert.rs

1//! Lowering concrete interface nodes into semantic declarations.
2
3use super::*;
4
5impl From<crate::typed_ast::InterfaceDcl> for InterfaceDcl {
6    fn from(value: crate::typed_ast::InterfaceDcl) -> Self {
7        Self {
8            annotations: expand_annotations(value.annotations),
9            decl: value.decl.into(),
10        }
11    }
12}
13
14impl From<crate::typed_ast::InterfaceDclInner> for InterfaceDclInner {
15    fn from(value: crate::typed_ast::InterfaceDclInner) -> Self {
16        match value {
17            crate::typed_ast::InterfaceDclInner::InterfaceForwardDcl(forward) => {
18                Self::InterfaceForwardDcl(forward.into())
19            }
20            crate::typed_ast::InterfaceDclInner::InterfaceDef(def) => {
21                Self::InterfaceDef(def.into())
22            }
23        }
24    }
25}
26
27impl From<crate::typed_ast::InterfaceForwardDcl> for InterfaceForwardDcl {
28    fn from(value: crate::typed_ast::InterfaceForwardDcl) -> Self {
29        Self {
30            ident: value.ident.0,
31        }
32    }
33}
34
35impl From<crate::typed_ast::InterfaceDef> for InterfaceDef {
36    fn from(value: crate::typed_ast::InterfaceDef) -> Self {
37        Self {
38            header: value.header.into(),
39            interface_body: value.interface_body.map(Into::into),
40        }
41    }
42}
43
44impl From<crate::typed_ast::InterfaceHeader> for InterfaceHeader {
45    fn from(value: crate::typed_ast::InterfaceHeader) -> Self {
46        Self {
47            ident: value.ident.0,
48            parent: value.parent.map(Into::into),
49        }
50    }
51}
52
53impl From<crate::typed_ast::InterfaceInheritanceSpec> for InterfaceInheritanceSpec {
54    fn from(value: crate::typed_ast::InterfaceInheritanceSpec) -> Self {
55        Self(value.0.into_iter().map(Into::into).collect())
56    }
57}
58
59impl From<crate::typed_ast::InterfaceName> for InterfaceName {
60    fn from(value: crate::typed_ast::InterfaceName) -> Self {
61        Self(value.0.into())
62    }
63}
64
65impl From<crate::typed_ast::InterfaceBody> for InterfaceBody {
66    fn from(value: crate::typed_ast::InterfaceBody) -> Self {
67        Self(value.0.into_iter().map(Into::into).collect())
68    }
69}
70
71impl From<crate::typed_ast::Export> for Export {
72    fn from(value: crate::typed_ast::Export) -> Self {
73        match value {
74            crate::typed_ast::Export::OpDcl(op_dcl) => Self::OpDcl(op_dcl.into()),
75            crate::typed_ast::Export::AttrDcl(attr_dcl) => Self::AttrDcl(attr_dcl.into()),
76            crate::typed_ast::Export::TypeDcl(type_dcl) => Self::TypeDcl(type_dcl.into()),
77            crate::typed_ast::Export::ConstDcl(const_dcl) => Self::ConstDcl(const_dcl.into()),
78            crate::typed_ast::Export::ExceptDcl(except_dcl) => Self::ExceptDcl(except_dcl.into()),
79        }
80    }
81}
82
83impl From<crate::typed_ast::OpDcl> for OpDcl {
84    fn from(value: crate::typed_ast::OpDcl) -> Self {
85        Self {
86            annotations: expand_annotations(value.annotations),
87            ty: value.ty.into(),
88            ident: value.ident.0,
89            parameter: value.parameter.map(Into::into),
90            raises: value.raises.map(Into::into),
91        }
92    }
93}
94
95impl From<crate::typed_ast::OpTypeSpec> for OpTypeSpec {
96    fn from(value: crate::typed_ast::OpTypeSpec) -> Self {
97        match value {
98            crate::typed_ast::OpTypeSpec::Void => Self::Void,
99            crate::typed_ast::OpTypeSpec::TypeSpec(ty) => Self::TypeSpec(ty.into()),
100        }
101    }
102}
103
104impl From<crate::typed_ast::ParameterDcls> for ParameterDcls {
105    fn from(value: crate::typed_ast::ParameterDcls) -> Self {
106        Self(value.0.into_iter().map(Into::into).collect())
107    }
108}
109
110impl From<crate::typed_ast::ParamDcl> for ParamDcl {
111    fn from(value: crate::typed_ast::ParamDcl) -> Self {
112        Self {
113            annotations: expand_annotations(value.annotations),
114            attr: value.attr.map(Into::into),
115            ty: value.ty.into(),
116            declarator: value.declarator.into(),
117        }
118    }
119}
120
121impl From<crate::typed_ast::ParamAttribute> for ParamAttribute {
122    fn from(value: crate::typed_ast::ParamAttribute) -> Self {
123        Self(value.0)
124    }
125}
126
127impl From<crate::typed_ast::RaisesExpr> for RaisesExpr {
128    fn from(value: crate::typed_ast::RaisesExpr) -> Self {
129        Self(value.0.into_iter().map(Into::into).collect())
130    }
131}
132
133impl From<crate::typed_ast::AttrDcl> for AttrDcl {
134    fn from(value: crate::typed_ast::AttrDcl) -> Self {
135        Self {
136            annotations: expand_annotations(value.annotations),
137            decl: value.decl.into(),
138        }
139    }
140}
141
142impl From<crate::typed_ast::AttrDclInner> for AttrDclInner {
143    fn from(value: crate::typed_ast::AttrDclInner) -> Self {
144        match value {
145            crate::typed_ast::AttrDclInner::ReadonlyAttrSpec(spec) => {
146                Self::ReadonlyAttrSpec(spec.into())
147            }
148            crate::typed_ast::AttrDclInner::AttrSpec(spec) => Self::AttrSpec(spec.into()),
149        }
150    }
151}
152
153impl From<crate::typed_ast::ReadonlyAttrSpec> for ReadonlyAttrSpec {
154    fn from(value: crate::typed_ast::ReadonlyAttrSpec) -> Self {
155        Self {
156            ty: value.ty.into(),
157            declarator: value.declarator.into(),
158        }
159    }
160}
161
162impl From<crate::typed_ast::ReadonlyAttrDeclarator> for ReadonlyAttrDeclarator {
163    fn from(value: crate::typed_ast::ReadonlyAttrDeclarator) -> Self {
164        match value {
165            crate::typed_ast::ReadonlyAttrDeclarator::SimpleDeclarator(declarators) => {
166                Self::SimpleDeclarator(declarators.into_iter().map(Into::into).collect())
167            }
168            crate::typed_ast::ReadonlyAttrDeclarator::WithRaises { declarator, raises } => {
169                Self::WithRaises {
170                    declarator: declarator.into(),
171                    raises: raises.into(),
172                }
173            }
174        }
175    }
176}
177
178impl From<crate::typed_ast::AttrSpec> for AttrSpec {
179    fn from(value: crate::typed_ast::AttrSpec) -> Self {
180        Self {
181            ty: value.type_spec.into(),
182            declarator: value.declarator.into(),
183        }
184    }
185}
186
187impl From<crate::typed_ast::AttrDeclarator> for AttrDeclarator {
188    fn from(value: crate::typed_ast::AttrDeclarator) -> Self {
189        match value {
190            crate::typed_ast::AttrDeclarator::SimpleDeclarator(declarator) => {
191                Self::SimpleDeclarator(declarator.into_iter().map(Into::into).collect())
192            }
193            crate::typed_ast::AttrDeclarator::WithRaises { declarator, raises } => {
194                Self::WithRaises {
195                    declarator: declarator.into(),
196                    raises: raises.into(),
197                }
198            }
199        }
200    }
201}
202
203impl From<crate::typed_ast::AttrRaisesExpr> for AttrRaisesExpr {
204    fn from(value: crate::typed_ast::AttrRaisesExpr) -> Self {
205        match value {
206            crate::typed_ast::AttrRaisesExpr::Case1(get, set) => {
207                Self::Case1(get.into(), set.map(Into::into))
208            }
209            crate::typed_ast::AttrRaisesExpr::SetExcepExpr(set) => Self::SetExcepExpr(set.into()),
210        }
211    }
212}
213
214impl From<crate::typed_ast::GetExcepExpr> for GetExcepExpr {
215    fn from(value: crate::typed_ast::GetExcepExpr) -> Self {
216        Self {
217            expr: value.expr.into(),
218        }
219    }
220}
221
222impl From<crate::typed_ast::SetExcepExpr> for SetExcepExpr {
223    fn from(value: crate::typed_ast::SetExcepExpr) -> Self {
224        Self {
225            expr: value.expr.into(),
226        }
227    }
228}
229
230impl From<crate::typed_ast::ExceptionList> for ExceptionList {
231    fn from(value: crate::typed_ast::ExceptionList) -> Self {
232        Self(value.0.into_iter().map(Into::into).collect())
233    }
234}