wagon_codegen/nodes/
sum.rs1use crate::SpannableIdent;
2
3use super::{Rc, ToTokensState};
4use proc_macro2::{TokenStream, Ident};
5use quote::quote;
6
7use wagon_parser::parser::sum::{Sum, SumP};
8
9fn to_tokens_sump<U>(left: &TokenStream, sump: &SumP, state: &mut U, label: Rc<Ident>, attr_fun: fn(&mut U, Rc<Ident>, SpannableIdent)) -> TokenStream {
10 let op = &sump.op;
11 let right = sump.right.to_tokens(state, label.clone(), attr_fun);
12 sump.cont.as_ref().map_or_else(|| quote!(#op (#left, #right)?), |cont| {
13 let cont_stream = to_tokens_sump(&right, cont, state, label, attr_fun);
14 quote!(#op (#left, #cont_stream)?)
15 })
16}
17
18impl<U> ToTokensState<U> for Sum {
19 fn to_tokens(&self, state: &mut U, label: Rc<Ident>, attr_fun: fn(&mut U, Rc<Ident>, SpannableIdent)) -> TokenStream {
20 let left = self.left.to_tokens(state, label.clone(), attr_fun);
21 if let Some(sump) = &self.cont {
22 to_tokens_sump(&left, sump, state, label, attr_fun)
23 } else {
24 left
25 }
26 }
27}