feat: format components properly

This commit is contained in:
Jonathan Kelley committed 2022-04-24 13:12:20 -04:00
1 parent 2a1970b3a9
commit f9d9f85924
3 files changed
+101 -7

No files matched your search

+62 -2
View File
@@ -1,5 +1,6 @@
//! pretty printer for rsx!
use dioxus_rsx::*;
use quote::ToTokens;
use std::fmt::{self, Write};
mod prettyplease;
@@ -15,7 +16,7 @@ pub fn fmt_block(block: &str) -> Option<String> {
Some(buf)
}
pub fn write_ident(buf: &mut dyn Write, node: &BodyNode, indent: usize) -> fmt::Result {
pub fn write_ident(buf: &mut String, node: &BodyNode, indent: usize) -> fmt::Result {
match node {
BodyNode::Element(el) => {
let Element {
@@ -81,7 +82,66 @@ pub fn write_ident(buf: &mut dyn Write, node: &BodyNode, indent: usize) -> fmt::
write_tabs(buf, indent)?;
writeln!(buf, "}}")?;
}
BodyNode::Component(_) => {
BodyNode::Component(component) => {
let Component {
name,
body,
children,
manual_props,
} = component;
let name = name.to_token_stream().to_string();
write_tabs(buf, indent)?;
writeln!(buf, "{name} {{")?;
for field in body {
write_tabs(buf, indent + 1)?;
let name = &field.name;
match &field.content {
ContentField::ManExpr(exp) => {
let out = prettyplease::unparse_expr(exp);
writeln!(buf, "{}: {},", name, out)?;
}
ContentField::Formatted(s) => {
writeln!(buf, "{}: {},", name, s.value())?;
}
ContentField::OnHandlerRaw(exp) => {
let out = prettyplease::unparse_expr(exp);
let mut lines = out.split('\n').peekable();
let first = lines.next().unwrap();
write!(buf, "{}: {}", name, first)?;
for line in lines {
writeln!(buf)?;
write_tabs(buf, indent + 1)?;
write!(buf, "{}", line)?;
}
writeln!(buf, ",")?;
}
}
}
if let Some(exp) = manual_props {
write_tabs(buf, indent + 1)?;
let out = prettyplease::unparse_expr(exp);
let mut lines = out.split('\n').peekable();
let first = lines.next().unwrap();
write!(buf, "..{}", first)?;
for line in lines {
writeln!(buf)?;
write_tabs(buf, indent + 1)?;
write!(buf, "{}", line)?;
}
writeln!(buf)?;
}
for child in children {
write_ident(buf, child, indent + 1)?;
}
write_tabs(buf, indent)?;
writeln!(buf, "}}")?;
//
// write!(buf, "{}", " ".repeat(ident))
}
+36 -2
View File
@@ -53,9 +53,43 @@ fn parse_comment() {
}
"#;
// let parsed: CallBody = syn::parse_str(block).ok()?;
let parsed: TokenStream2 = syn::parse_str(block).unwrap();
dbg!(parsed);
}
#[test]
fn formats_component() {
let block = r#"
Component {
adsasd: "asd", // this is a comment
onclick: move |_| {
let blah = 120;
let blah = 120;
},
}
"#;
let formatted = fmt_block(block).unwrap();
print!("{formatted}");
}
#[test]
fn formats_component_man_props() {
let block = r#"
Component {
..MyProps {
val: 123
},
adsasd: "asd", // this is a comment
onclick: move |_| {
let blah = 120;
},
}
"#;
let formatted = fmt_block(block).unwrap();
print!("{formatted}");
}
+3 -3
View File
@@ -150,11 +150,11 @@ impl ToTokens for Component {
// the struct's fields info
pub struct ComponentField {
name: Ident,
content: ContentField,
pub name: Ident,
pub content: ContentField,
}
enum ContentField {
pub enum ContentField {
ManExpr(Expr),
Formatted(LitStr),
OnHandlerRaw(Expr),