expr_node.rs 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use crate::{DynIdx, PartialExpr};
  2. use quote::{quote, ToTokens, TokenStreamExt};
  3. use syn::parse::Parse;
  4. #[derive(PartialEq, Eq, Clone, Debug)]
  5. pub struct ExprNode {
  6. pub expr: PartialExpr,
  7. pub dyn_idx: DynIdx,
  8. }
  9. impl ExprNode {
  10. pub fn span(&self) -> proc_macro2::Span {
  11. self.expr.span()
  12. }
  13. }
  14. impl Parse for ExprNode {
  15. fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
  16. Ok(Self {
  17. expr: input.parse()?,
  18. dyn_idx: DynIdx::default(),
  19. })
  20. }
  21. }
  22. impl ToTokens for ExprNode {
  23. fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
  24. let expr = &self.expr;
  25. tokens.append_all(quote! {
  26. { let ___nodes = (#expr).into_dyn_node(); ___nodes }
  27. })
  28. }
  29. }
  30. #[test]
  31. fn no_commas() {
  32. use prettier_please::PrettyUnparse;
  33. let input = quote! {
  34. div {
  35. {label("Hello, world!")},
  36. }
  37. };
  38. let _expr: crate::BodyNode = syn::parse2(input).unwrap();
  39. println!("{}", _expr.to_token_stream().pretty_unparse());
  40. }