use tokens::TokenStream;
use crate::dom::{Component, Property};
use crate::gen::{DomNode, Field, Generator, IntoGenerator, TokenStreamExt};
use crate::tokenize::prelude::*;
impl Component {
fn into_expression(self) -> TokenStream {
let mut render = self.path.clone();
render.write(if self.children.is_some() {
"::__render_with"
} else {
"::__render"
});
if let Some(generics) = self.generics {
render.write(("::", generics));
}
let mut params = self.path;
params.write("::__undefined()");
for Property { name, expr } in self.props {
params.write(('.', call(name, expr.stream)));
}
if let Some(children) = self.children {
let children = crate::gen::generate(children);
params.write((',', children));
}
call(render, params)
}
}
impl IntoGenerator for Component {
fn into_gen(self, gen: &mut Generator) -> DomNode {
let name = gen.names.next();
let value = self.into_expression();
gen.out.fields.push(Field::new(name, value));
DomNode::Variable(name)
}
}