Skip to content

Commit 0a877a4

Browse files
committed
generate: rely on FromShapeFields to create handles.
1 parent 9f2a212 commit 0a877a4

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

src/generate/rust.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,17 +1030,9 @@ where
10301030
let ident = Src::ident(&cx[name]);
10311031
let field_handle_expr = |(i, field): (usize, &RustField)| {
10321032
if field.refutable {
1033-
quote!(_r[#i].map(|node| Handle {
1034-
node,
1035-
forest,
1036-
_marker: PhantomData,
1037-
}))
1033+
quote!(Option::<Handle<'a, 'i, I, _>>::from_shape_fields(forest, [fields[#i]]))
10381034
} else {
1039-
quote!(Handle {
1040-
node: _r[#i].unwrap(),
1041-
forest,
1042-
_marker: PhantomData,
1043-
})
1035+
quote!(Handle::from_shape_fields(forest, [fields[#i]]))
10441036
}
10451037
};
10461038

@@ -1073,11 +1065,9 @@ where
10731065
let variants_expr = variants.iter().map(|(&v_name, (_, variant))| {
10741066
let variant_ident = Src::ident(&cx[v_name]);
10751067
match variant {
1076-
RustVariant::Newtype(_) => quote!(#ident::#variant_ident(Handle {
1077-
node: _r[#max_fields_len].unwrap(),
1078-
forest,
1079-
_marker: PhantomData,
1080-
})),
1068+
RustVariant::Newtype(_) => quote!(#ident::#variant_ident(
1069+
Handle::from_shape_fields(forest, [fields[#max_fields_len]]),
1070+
)),
10811071
RustVariant::StructLike(v_fields) => {
10821072
let fields_ident = v_fields.keys().map(|&name| Src::ident(&cx[name]));
10831073
let fields_expr = v_fields.values().enumerate().map(field_handle_expr);
@@ -1092,7 +1082,7 @@ where
10921082
max_fields_len + 1,
10931083
quote!({ #max_fields_len @ #(#variants_shape)* }),
10941084
quote!(
1095-
match _r[#max_fields_len].unwrap().kind {
1085+
match fields[#max_fields_len].unwrap().kind {
10961086
#(#variants_kind_src => #variants_expr,)*
10971087
_ => unreachable!(),
10981088
}
@@ -1103,7 +1093,7 @@ where
11031093
let fields_ident = fields.keys().map(|&name| Src::ident(&cx[name]));
11041094
let fields_expr = fields.values().enumerate().map(field_handle_expr);
11051095
let marker_field = if fields.is_empty() {
1106-
Some(quote!(_marker: { let _ = forest; PhantomData },))
1096+
Some(quote!(_marker: { let _ = forest; let [] = fields; PhantomData },))
11071097
} else {
11081098
None
11091099
};
@@ -1138,7 +1128,7 @@ where
11381128

11391129
fn from_shape_fields(
11401130
forest: &'a _forest::ParseForest<'i, _G, I>,
1141-
_r: Self::Fields,
1131+
fields: Self::Fields,
11421132
) -> Self {
11431133
#from_shape
11441134
}

src/generate/templates/header.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,27 @@ impl<'a, I: gll::grammer::input::Input, T: ?Sized> Handle<'a, '_, I, T> {
4040
}
4141
}
4242

43+
impl<'a, 'i, I, T: ?Sized>
44+
_forest::typed::FromShapeFields<'a, _forest::ParseForest<'i, _G, I>, Node<'i, _G>>
45+
for Handle<'a, 'i, I, T>
46+
where
47+
I: gll::grammer::input::Input,
48+
{
49+
type Output = Self;
50+
type Fields = [Option<Node<'i, _G>>; 1];
51+
52+
fn from_shape_fields(
53+
forest: &'a _forest::ParseForest<'i, _G, I>,
54+
[node]: Self::Fields,
55+
) -> Self {
56+
Handle {
57+
node: node.unwrap(),
58+
forest,
59+
_marker: PhantomData,
60+
}
61+
}
62+
}
63+
4364
impl<'a, 'i, I: gll::grammer::input::Input, T> From<Ambiguity<Handle<'a, 'i, I, T>>>
4465
for Ambiguity<Handle<'a, 'i, I, Any>>
4566
{

0 commit comments

Comments
 (0)