From d02647f6e5861bbf4d616120386aa5bf8bd5e10e Mon Sep 17 00:00:00 2001 From: Bram Hoendervangers Date: Sun, 2 Feb 2025 16:58:12 +0100 Subject: [PATCH] chore: upgrade to rstml 12 --- Cargo.lock | 68 ++++++++++++++++++++-------- formatter/Cargo.toml | 2 +- formatter/src/formatter/attribute.rs | 53 +++++++++++++--------- formatter/src/formatter/element.rs | 25 ++++++---- formatter/src/formatter/fragment.rs | 4 +- formatter/src/formatter/node.rs | 6 ++- formatter/src/test_helpers.rs | 9 ++-- printer/src/algorithm.rs | 2 +- 8 files changed, 113 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c20def..9a25291 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,6 +178,17 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "either" version = "1.12.0" @@ -319,7 +330,7 @@ dependencies = [ "rustywind_core", "serde", "syn", - "thiserror", + "thiserror 1.0.61", ] [[package]] @@ -362,26 +373,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", ] [[package]] @@ -408,9 +417,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -466,16 +475,17 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rstml" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe542870b8f59dd45ad11d382e5339c9a1047cde059be136a7016095bbdefa77" +checksum = "61cf4616de7499fc5164570d40ca4e1b24d231c6833a88bff0fe00725080fd56" dependencies = [ + "derive-where", "proc-macro2", "proc-macro2-diagnostics", "quote", "syn", "syn_derive", - "thiserror", + "thiserror 2.0.11", ] [[package]] @@ -552,11 +562,11 @@ dependencies = [ [[package]] name = "syn_derive" -version = "0.1.8" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "cdb066a04799e45f5d582e8fc6ec8e6d6896040d00898eb4e6a835196815b219" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", "syn", @@ -568,7 +578,16 @@ version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.61", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", ] [[package]] @@ -582,6 +601,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "toml" version = "0.7.8" diff --git a/formatter/Cargo.toml b/formatter/Cargo.toml index 9af87f2..ed3c333 100644 --- a/formatter/Cargo.toml +++ b/formatter/Cargo.toml @@ -10,7 +10,7 @@ description = "view macro formatter for the Leptos web framework" [dependencies] leptosfmt-pretty-printer.workspace = true leptosfmt-prettyplease.workspace = true -rstml = "0.11.2" +rstml = "0.12.1" syn = { workspace = true } proc-macro2 = { workspace = true } thiserror = "1.0.61" diff --git a/formatter/src/formatter/attribute.rs b/formatter/src/formatter/attribute.rs index 6d4d946..5ee3c61 100644 --- a/formatter/src/formatter/attribute.rs +++ b/formatter/src/formatter/attribute.rs @@ -1,4 +1,6 @@ -use rstml::node::{FnBinding, KeyedAttribute, KeyedAttributeValue, NodeAttribute, NodeBlock}; +use rstml::node::{ + FnBinding, KVAttributeValue, KeyedAttribute, KeyedAttributeValue, NodeAttribute, NodeBlock, +}; use syn::{spanned::Spanned, Expr, RangeLimits, Stmt}; use crate::{formatter::Formatter, AttributeValueBraceStyle as Braces}; @@ -52,31 +54,40 @@ impl Formatter<'_> { fn attribute_value( &mut self, - value: &Expr, + value: &KVAttributeValue, formatter: Option, next_attribute: Option<&NodeAttribute>, ) { - match (self.settings.attr_value_brace_style, value, next_attribute) { - (Braces::WhenRequired, syn::Expr::Block(_), Some(next)) - if is_spread_attribute(next) => - { - // If the next attribute is a spread attribute, make sure that the braces are not stripped from the expression - // to avoid an ambiguity in the parser (i.e. `foo=bar {..}` could be interpreted as initialization of a struct called `bar`, instead of two separate attributes) - self.node_value_expr(value, false, true, formatter) + match value { + KVAttributeValue::InvalidBraced(invalid) => { + self.printer.word(invalid.span().source_text().unwrap()); } - (Braces::Always, syn::Expr::Block(_), _) => { - self.node_value_expr(value, false, false, formatter) + KVAttributeValue::Expr(expr) => { + match (self.settings.attr_value_brace_style, expr, next_attribute) { + (Braces::WhenRequired, syn::Expr::Block(_), Some(next)) + if is_spread_attribute(next) => + { + // If the next attribute is a spread attribute, make sure that the braces are not stripped from the expression + // to avoid an ambiguity in the parser (i.e. `foo=bar {..}` could be interpreted as initialization of a struct called `bar`, instead of two separate attributes) + self.node_value_expr(expr, false, true, formatter) + } + (Braces::Always, syn::Expr::Block(_), _) => { + self.node_value_expr(expr, false, false, formatter) + } + (Braces::AlwaysUnlessLit, syn::Expr::Block(_) | syn::Expr::Lit(_), _) => { + self.node_value_expr(expr, false, true, formatter) + } + (Braces::Always | Braces::AlwaysUnlessLit, _, _) => { + self.printer.word("{"); + self.node_value_expr(expr, false, false, formatter); + self.printer.word("}"); + } + (Braces::WhenRequired, _, _) => { + self.node_value_expr(expr, true, true, formatter) + } + (Braces::Preserve, _, _) => self.node_value_expr(expr, false, false, formatter), + } } - (Braces::AlwaysUnlessLit, syn::Expr::Block(_) | syn::Expr::Lit(_), _) => { - self.node_value_expr(value, false, true, formatter) - } - (Braces::Always | Braces::AlwaysUnlessLit, _, _) => { - self.printer.word("{"); - self.node_value_expr(value, false, false, formatter); - self.printer.word("}"); - } - (Braces::WhenRequired, _, _) => self.node_value_expr(value, true, true, formatter), - (Braces::Preserve, _, _) => self.node_value_expr(value, false, false, formatter), } } } diff --git a/formatter/src/formatter/element.rs b/formatter/src/formatter/element.rs index eefccc8..6896c8a 100644 --- a/formatter/src/formatter/element.rs +++ b/formatter/src/formatter/element.rs @@ -1,10 +1,14 @@ use crate::{formatter::Formatter, ClosingTagStyle}; -use rstml::node::{Node, NodeAttribute, NodeElement}; +use rstml::{ + atoms::{CloseTag, OpenTag}, + node::{CustomNode, Node, NodeAttribute, NodeElement}, + Infallible, +}; use syn::spanned::Spanned; impl Formatter<'_> { - pub fn element(&mut self, element: &NodeElement) { + pub fn element(&mut self, element: &NodeElement) { let name = element.name().to_string(); let is_self_closing = is_self_closing(element, &name, self.settings.closing_tag_style); @@ -13,11 +17,12 @@ impl Formatter<'_> { if !is_self_closing { self.children(&element.children, element.attributes().len()); self.flush_comments(element.close_tag.span().end().line - 1, true); - self.closing_tag(element) + // Note: we pass open_tag instead of close_tag, such that we may auto-close non-self-closing elements + self.closing_tag(&element.open_tag); } } - fn opening_tag(&mut self, element: &NodeElement, is_self_closing: bool) { + fn opening_tag(&mut self, element: &NodeElement, is_self_closing: bool) { self.printer.word("<"); self.node_name(&element.open_tag.name); self.format_syn_generics(&element.open_tag.generics); @@ -31,10 +36,10 @@ impl Formatter<'_> { } } - fn closing_tag(&mut self, element: &NodeElement) { + fn closing_tag(&mut self, open_tag: &OpenTag) { self.printer.word(""); } @@ -149,7 +154,11 @@ fn is_void_element(name: &str) -> bool { ) } -fn is_self_closing(element: &NodeElement, name: &str, closing_tag_style: ClosingTagStyle) -> bool { +fn is_self_closing( + element: &NodeElement, + name: &str, + closing_tag_style: ClosingTagStyle, +) -> bool { if !element.children.is_empty() { return false; } diff --git a/formatter/src/formatter/fragment.rs b/formatter/src/formatter/fragment.rs index 9a8e54c..e07584d 100644 --- a/formatter/src/formatter/fragment.rs +++ b/formatter/src/formatter/fragment.rs @@ -1,9 +1,9 @@ -use rstml::node::NodeFragment; +use rstml::{node::NodeFragment, Infallible}; use crate::formatter::Formatter; impl Formatter<'_> { - pub fn fragment(&mut self, fragment: &NodeFragment) { + pub fn fragment(&mut self, fragment: &NodeFragment) { self.printer.word("<>"); self.children(&fragment.children, 0); self.printer.word(""); diff --git a/formatter/src/formatter/node.rs b/formatter/src/formatter/node.rs index e0933e8..b5f28d7 100644 --- a/formatter/src/formatter/node.rs +++ b/formatter/src/formatter/node.rs @@ -1,4 +1,7 @@ -use rstml::node::{Node, NodeBlock, NodeComment, NodeDoctype, NodeName, NodeText, RawText}; +use rstml::{ + node::{CustomNode, Node, NodeBlock, NodeComment, NodeDoctype, NodeName, NodeText, RawText}, + Infallible, +}; use syn::spanned::Spanned; use crate::{formatter::Formatter, get_text_beween_spans}; @@ -15,6 +18,7 @@ impl Formatter<'_> { Node::Comment(comment) => self.comment(comment), Node::Doctype(doctype) => self.doctype(doctype), Node::Block(block) => self.node_block(block), + Node::Custom(_) => todo!(), }; } diff --git a/formatter/src/test_helpers.rs b/formatter/src/test_helpers.rs index aee1e4d..675843c 100644 --- a/formatter/src/test_helpers.rs +++ b/formatter/src/test_helpers.rs @@ -2,7 +2,10 @@ use std::str::FromStr; use crop::Rope; use leptosfmt_pretty_printer::Printer; -use rstml::node::{Node, NodeAttribute, NodeComment, NodeDoctype, NodeElement, NodeFragment}; +use rstml::{ + node::{Node, NodeAttribute, NodeComment, NodeDoctype, NodeElement, NodeFragment}, + Infallible, +}; macro_rules! attribute { ($($tt:tt)*) => { @@ -85,14 +88,14 @@ pub fn get_element_attribute( .clone() } -pub fn get_element(mut nodes: Vec, element_index: usize) -> NodeElement { +pub fn get_element(mut nodes: Vec, element_index: usize) -> NodeElement { let Node::Element(element) = nodes.swap_remove(element_index) else { panic!("expected element") }; element } -pub fn get_fragment(mut nodes: Vec, fragment_index: usize) -> NodeFragment { +pub fn get_fragment(mut nodes: Vec, fragment_index: usize) -> NodeFragment { let Node::Fragment(fragment) = nodes.swap_remove(fragment_index) else { panic!("expected fragment") }; diff --git a/printer/src/algorithm.rs b/printer/src/algorithm.rs index 63dd960..9888a6b 100644 --- a/printer/src/algorithm.rs +++ b/printer/src/algorithm.rs @@ -350,7 +350,7 @@ impl Printer { } self.out.push('\n'); let indent = self.indent as isize + token.offset; - self.pending_indentation = usize::try_from(indent).unwrap(); + self.pending_indentation = usize::try_from(indent).unwrap_or(0); self.space = cmp::max(self.settings.margin - indent, self.settings.min_space); if !token.post_break.is_empty() { self.print_indent();