feat: allow ifchains and for loops

This commit is contained in:
Jonathan Kelley committed 2023-01-13 10:51:12 -08:00
1 parent 2dd2d7fe66
commit 6cd87796f2
6 files changed
+82 -29

No files matched your search

+2 -2
View File
@@ -365,8 +365,8 @@ impl Writer {
Some(len) => total_count += len,
None => return None,
},
BodyNode::ForLoop(_) => todo!(),
BodyNode::IfChain(_) => todo!(),
BodyNode::ForLoop(_forloop) => return None,
BodyNode::IfChain(_chain) => return None,
}
}
+3 -3
View File
@@ -1,16 +1,16 @@
//! pretty printer for rsx!
use std::fmt::{Result, Write};
use proc_macro2::Span;
use crate::Writer;
impl Writer {
pub fn write_raw_expr(&mut self, exp: &syn::Expr) -> Result {
pub fn write_raw_expr(&mut self, placement: Span) -> Result {
/*
We want to normalize the expr to the appropriate indent level.
*/
use syn::spanned::Spanned;
let placement = exp.span();
let start = placement.start();
let end = placement.end();
+31 -4
View File
@@ -1,10 +1,11 @@
use dioxus_rsx::{BodyNode, ElementAttr, ElementAttrNamed};
use dioxus_rsx::{BodyNode, ElementAttr, ElementAttrNamed, ForLoop};
use proc_macro2::{LineColumn, Span};
use quote::ToTokens;
use std::{
collections::{HashMap, VecDeque},
fmt::{Result, Write},
};
use syn::{spanned::Spanned, Expr};
use syn::{spanned::Spanned, Expr, ExprIf};
use crate::buffer::Buffer;
@@ -37,8 +38,9 @@ impl Writer {
BodyNode::Element(el) => self.write_element(el),
BodyNode::Component(component) => self.write_component(component),
BodyNode::Text(text) => self.out.write_text(text),
BodyNode::RawExpr(exp) => self.write_raw_expr(exp),
_ => Ok(()),
BodyNode::RawExpr(exp) => self.write_raw_expr(exp.span()),
BodyNode::ForLoop(forloop) => self.write_for_loop(forloop),
BodyNode::IfChain(ifchain) => self.write_if_chain(ifchain),
}
}
@@ -176,6 +178,31 @@ impl Writer {
.or_insert_with(|| prettyplease::unparse_expr(expr))
.as_str()
}
fn write_for_loop(&mut self, forloop: &ForLoop) -> std::fmt::Result {
write!(
self.out,
"for {} in {} {{",
forloop.pat.clone().into_token_stream().to_string(),
prettyplease::unparse_expr(&forloop.expr)
)?;
if forloop.body.is_empty() {
write!(self.out, "}}")?;
return Ok(());
}
self.write_body_indented(&forloop.body)?;
self.out.tabbed_line()?;
write!(self.out, "}}")?;
Ok(())
}
fn write_if_chain(&mut self, ifchain: &ExprIf) -> std::fmt::Result {
self.write_raw_expr(ifchain.span())
}
}
trait SpanLength {