diff --git a/Cargo.toml b/Cargo.toml index ece8239..afd7732 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,10 +10,10 @@ members = [ "crates/rangular-runtime", ] exclude = ["demo-leptos", "demo-tauri/src"] -resolver = "2" +resolver = "3" [workspace.package] -edition = "2021" +edition = "2024" license = "Apache-2.0" version = "1.0.2" authors = ["Interchouette"] diff --git a/crates/rangular-aot/src/emit.rs b/crates/rangular-aot/src/emit.rs index 5416695..e051238 100644 --- a/crates/rangular-aot/src/emit.rs +++ b/crates/rangular-aot/src/emit.rs @@ -1,4 +1,4 @@ -use rangular_parser::{builtin_tag_io, classify_bindings, parse, Diagnostic}; +use rangular_parser::{Diagnostic, builtin_tag_io, classify_bindings, parse}; use crate::error::{AotIssue, EmitResult, EmitTokens}; use crate::lower::{emit_rust, emit_rust_tokens}; diff --git a/crates/rangular-aot/src/glue.rs b/crates/rangular-aot/src/glue.rs index fa30c9a..74c589f 100644 --- a/crates/rangular-aot/src/glue.rs +++ b/crates/rangular-aot/src/glue.rs @@ -2,8 +2,8 @@ use std::cell::RefCell; use std::rc::Rc; use std::sync::Arc; -use rangular_expr::{eval_with_pipes, Expr, Host, PipeRegistry, Value}; -use rangular_host::{for_implicit_value, EventPayload, LoopScope}; +use rangular_expr::{Expr, Host, PipeRegistry, Value, eval_with_pipes}; +use rangular_host::{EventPayload, LoopScope, for_implicit_value}; use send_wrapper::SendWrapper; /// Shared host handle for AOT-generated views. diff --git a/crates/rangular-aot/src/lib.rs b/crates/rangular-aot/src/lib.rs index 53860e5..759674b 100644 --- a/crates/rangular-aot/src/lib.rs +++ b/crates/rangular-aot/src/lib.rs @@ -17,7 +17,7 @@ pub use print::tokens_to_rust_source; pub use rangular_expr; pub use rangular_host; pub use rangular_parser; -pub use rangular_parser::{binding_ir, binding_ir_snapshot, IrBinding, IrNode}; +pub use rangular_parser::{IrBinding, IrNode, binding_ir, binding_ir_snapshot}; /// Structural binding IR for `source` (shared with runtime parity). #[must_use] diff --git a/crates/rangular-aot/src/lower.rs b/crates/rangular-aot/src/lower.rs index f3b27a5..05b32f5 100644 --- a/crates/rangular-aot/src/lower.rs +++ b/crates/rangular-aot/src/lower.rs @@ -4,8 +4,8 @@ use proc_macro2::{Literal, Punct, Spacing, TokenStream, TokenTree}; use quote::{format_ident, quote}; use rangular_expr::Expr; use rangular_parser::{ - collect_ng_templates, collect_projection_selects, has_default_projection, select_param_name, - template_outlet_ref, Attr, Element, ForBlock, IfBlock, Node, Projection, Template, + Attr, Element, ForBlock, IfBlock, Node, Projection, Template, collect_ng_templates, + collect_projection_selects, has_default_projection, select_param_name, template_outlet_ref, }; use crate::error::{AotIssue, EmitResult, EmitTokens}; @@ -695,16 +695,12 @@ fn event_attr(name: &str, value: &TokenStream) -> TokenStream { } const fn sanitize_tag(tag: &str) -> &str { - if tag.is_empty() { - "div" - } else { - tag - } + if tag.is_empty() { "div" } else { tag } } #[cfg(test)] mod coverage_arms { - use super::{lower_one_attr, sanitize_tag, HoistState, Scope}; + use super::{HoistState, Scope, lower_one_attr, sanitize_tag}; use rangular_parser::{Attr, Span}; #[test] diff --git a/crates/rangular-aot/tests/host_cell.rs b/crates/rangular-aot/tests/host_cell.rs index 82a7882..57da55d 100644 --- a/crates/rangular-aot/tests/host_cell.rs +++ b/crates/rangular-aot/tests/host_cell.rs @@ -4,7 +4,7 @@ use std::rc::Rc; use std::sync::Arc; use rangular_aot::HostCell; -use rangular_expr::{parse, Expr, Host, PipeRegistry, Value}; +use rangular_expr::{Expr, Host, PipeRegistry, Value, parse}; use rangular_host::{EventPayload, HostError, LoopScope}; type ValueMap = HashMap; @@ -125,10 +125,11 @@ fn host_cell_events_and_value_display_variants() { cell.emit_dom_event_call("onInput", &handler, "load", String::new()); cell.emit_dom_event_call("onInput", &handler, "focus", "x".into()); - assert!(cell - .eval_value(&Expr::Ident("$event".into())) - .as_event() - .is_some()); + assert!( + cell.eval_value(&Expr::Ident("$event".into())) + .as_event() + .is_some() + ); let host2 = MapHost::new(); host2.values.borrow_mut().insert( @@ -186,11 +187,13 @@ fn host_cell_scoped_bool_none_item_and_event_helpers() { let cell2 = HostCell::new(seed); let write = rangular_parser::banana_write_expr(&Expr::Ident("seed".into())); cell2.emit_dom_event_call("$bananaSet", &write, "click", "1,2".into()); - assert!(values - .borrow() - .get("seed") - .and_then(Value::as_event) - .is_some()); + assert!( + values + .borrow() + .get("seed") + .and_then(Value::as_event) + .is_some() + ); } #[test] diff --git a/crates/rangular-aot/tests/smoke.rs b/crates/rangular-aot/tests/smoke.rs index bcadc58..c36f84e 100644 --- a/crates/rangular-aot/tests/smoke.rs +++ b/crates/rangular-aot/tests/smoke.rs @@ -144,7 +144,7 @@ fn hostcell_dom_event_passes_dollar_event_to_handler() { use std::rc::Rc; use rangular_aot::HostCell; - use rangular_expr::{parse, Host, Value}; + use rangular_expr::{Host, Value, parse}; use rangular_host::{EventPayload, HostError}; struct CaptureHost { @@ -233,10 +233,12 @@ fn lower_edge_templates() { "missing_outlet_view", ); assert!(!unknown.ok()); - assert!(unknown - .issues - .iter() - .any(|i| i.message.contains("unknown ngTemplateOutlet"))); + assert!( + unknown + .issues + .iter() + .any(|i| i.message.contains("unknown ngTemplateOutlet")) + ); } #[test] diff --git a/crates/rangular-css/src/encapsulate.rs b/crates/rangular-css/src/encapsulate.rs index 32902d7..647abdd 100644 --- a/crates/rangular-css/src/encapsulate.rs +++ b/crates/rangular-css/src/encapsulate.rs @@ -410,8 +410,8 @@ fn strip_comments(css: &str) -> String { #[cfg(test)] mod coverage_arms { use super::{ - append_attr, flatten_block, flatten_host, flatten_selector, process_block, take_rule, - ScopeAttrs, + ScopeAttrs, append_attr, flatten_block, flatten_host, flatten_selector, process_block, + take_rule, }; #[test] diff --git a/crates/rangular-css/src/lib.rs b/crates/rangular-css/src/lib.rs index 410c53e..ffa7c6b 100644 --- a/crates/rangular-css/src/lib.rs +++ b/crates/rangular-css/src/lib.rs @@ -6,7 +6,7 @@ mod encapsulate; mod error; mod globals; -pub use encapsulate::{compile_scss, encapsulate, encapsulate_css, ScopeAttrs}; +pub use encapsulate::{ScopeAttrs, compile_scss, encapsulate, encapsulate_css}; pub use error::{CssIssue, CssResult}; pub use globals::is_global_selector; diff --git a/crates/rangular-css/tests/encapsulate.rs b/crates/rangular-css/tests/encapsulate.rs index bf890db..776379b 100644 --- a/crates/rangular-css/tests/encapsulate.rs +++ b/crates/rangular-css/tests/encapsulate.rs @@ -1,4 +1,4 @@ -use rangular_css::{compile_scss, encapsulate, encapsulate_css, ScopeAttrs}; +use rangular_css::{ScopeAttrs, compile_scss, encapsulate, encapsulate_css}; use std::path::{Path, PathBuf}; fn fixture_root() -> PathBuf { @@ -180,9 +180,10 @@ fn encapsulate_keeps_container_and_has() { ); assert!(out.ok(), "{:?}", out.issues); assert!(out.css.contains("@container (max-width: 20rem)")); - assert!(out - .css - .contains(".item-list[_ngcontent-r0]:has(.item-list__implicit)")); + assert!( + out.css + .contains(".item-list[_ngcontent-r0]:has(.item-list__implicit)") + ); assert!(out.css.contains(".item-list__row[_ngcontent-r0]")); } @@ -346,8 +347,10 @@ fn compile_scss_layer_font_and_host_descendants() { let empty_sel = encapsulate_css(".a,,.b { color: red; }", &scope()); assert!(!empty_sel.ok()); - assert!(empty_sel - .issues - .iter() - .any(|i| i.message.contains("empty selector"))); + assert!( + empty_sel + .issues + .iter() + .any(|i| i.message.contains("empty selector")) + ); } diff --git a/crates/rangular-expr/src/lib.rs b/crates/rangular-expr/src/lib.rs index 4bc6b76..294e091 100644 --- a/crates/rangular-expr/src/lib.rs +++ b/crates/rangular-expr/src/lib.rs @@ -7,7 +7,7 @@ mod parse_issue; mod pipe; pub use ast::{BinOp, Expr, Literal, UnOp}; -pub use eval::{eval, eval_with_pipes, EvalError}; +pub use eval::{EvalError, eval, eval_with_pipes}; pub use parse::parse; pub use parse_issue::{IssueSeverity, ParseIssue, ParseResult}; pub use pipe::{PipeFn, PipeRegistry}; diff --git a/crates/rangular-expr/tests/eval.rs b/crates/rangular-expr/tests/eval.rs index 9b36e44..971487e 100644 --- a/crates/rangular-expr/tests/eval.rs +++ b/crates/rangular-expr/tests/eval.rs @@ -1,4 +1,4 @@ -use rangular_expr::{eval, parse, BinOp, Expr, Host, Literal, Value}; +use rangular_expr::{BinOp, Expr, Host, Literal, Value, eval, parse}; use rangular_host::HostError; struct Counter; @@ -199,38 +199,46 @@ fn parse_error_and_feature_paths() { assert!(ternary.issues.iter().any(|i| i.message.contains("ternary"))); let bad_ternary = parse("flag ? 1"); - assert!(bad_ternary - .issues - .iter() - .any(|i| i.message.contains("expected ':'"))); + assert!( + bad_ternary + .issues + .iter() + .any(|i| i.message.contains("expected ':'")) + ); let grouped = parse("(n == 2)"); assert!(grouped.expr.is_some()); assert_eq!(grouped.issues.len(), 0); let unclosed_paren = parse("(n"); - assert!(unclosed_paren - .issues - .iter() - .any(|i| i.message.contains("unclosed"))); + assert!( + unclosed_paren + .issues + .iter() + .any(|i| i.message.contains("unclosed")) + ); let call_args = parse("fn(a, b)"); assert!(matches!(call_args.expr, Some(Expr::Call { .. }))); let unclosed_call = parse("fn(a"); - assert!(unclosed_call - .issues - .iter() - .any(|i| i.message.contains("unclosed"))); + assert!( + unclosed_call + .issues + .iter() + .any(|i| i.message.contains("unclosed")) + ); let escaped = parse(r#""a\"b""#); assert!(escaped.expr.is_some()); let unclosed_str = parse("'abc"); - assert!(unclosed_str - .issues - .iter() - .any(|i| i.message.contains("unclosed string"))); + assert!( + unclosed_str + .issues + .iter() + .any(|i| i.message.contains("unclosed string")) + ); let bad_ident = parse("1n"); assert!(bad_ident.expr.is_some() || !bad_ident.issues.is_empty()); diff --git a/crates/rangular-host/src/lib.rs b/crates/rangular-host/src/lib.rs index e780cea..853527a 100644 --- a/crates/rangular-host/src/lib.rs +++ b/crates/rangular-host/src/lib.rs @@ -9,7 +9,7 @@ mod value; pub use error::HostError; pub use event::EventPayload; -pub use for_scope::{for_implicit_value, LoopScope}; +pub use for_scope::{LoopScope, for_implicit_value}; pub use host::Host; pub use regex::Regex; pub use validate::{ diff --git a/crates/rangular-host/tests/for_scope.rs b/crates/rangular-host/tests/for_scope.rs index 49db690..ee0a9d8 100644 --- a/crates/rangular-host/tests/for_scope.rs +++ b/crates/rangular-host/tests/for_scope.rs @@ -1,4 +1,4 @@ -use rangular_host::{for_implicit_value, Value}; +use rangular_host::{Value, for_implicit_value}; #[test] fn for_implicit_index_and_count() { diff --git a/crates/rangular-host/tests/seed_bar.rs b/crates/rangular-host/tests/seed_bar.rs index b9df81d..7b819aa 100644 --- a/crates/rangular-host/tests/seed_bar.rs +++ b/crates/rangular-host/tests/seed_bar.rs @@ -1,4 +1,4 @@ -use rangular_expr::{eval, parse, Expr, Host, Value}; +use rangular_expr::{Expr, Host, Value, eval, parse}; use rangular_host::HostError; struct SeedBarHost { @@ -87,10 +87,11 @@ fn seed_bar_handlers() { assert_eq!(host.last_call.as_deref(), Some("onGenerate([])")); eval(&must_parse("seedChange($event)"), &mut host).unwrap(); - assert!(host - .last_call - .as_deref() - .is_some_and(|c| c.starts_with("seedChange("))); + assert!( + host.last_call + .as_deref() + .is_some_and(|c| c.starts_with("seedChange(")) + ); } #[test] diff --git a/crates/rangular-host/tests/validate.rs b/crates/rangular-host/tests/validate.rs index 1d1ed60..b8c3a5c 100644 --- a/crates/rangular-host/tests/validate.rs +++ b/crates/rangular-host/tests/validate.rs @@ -1,6 +1,6 @@ use rangular_host::{ - first_error, max_length, max_length_value, min_length, min_length_value, pattern, - pattern_value, required, required_value, show_when_dirty, Regex, Value, + Regex, Value, first_error, max_length, max_length_value, min_length, min_length_value, pattern, + pattern_value, required, required_value, show_when_dirty, }; #[test] diff --git a/crates/rangular-host/tests/value.rs b/crates/rangular-host/tests/value.rs index e1d9c86..d03f931 100644 --- a/crates/rangular-host/tests/value.rs +++ b/crates/rangular-host/tests/value.rs @@ -15,10 +15,12 @@ fn is_truthy_covers_variants() { assert!(Value::from(EventPayload::Error).is_truthy()); assert!(Value::from(EventPayload::Load).is_truthy()); assert!(Value::from(EventPayload::Input { value: "a".into() }).is_truthy()); - assert!(!Value::from(EventPayload::Input { - value: String::new() - }) - .is_truthy()); + assert!( + !Value::from(EventPayload::Input { + value: String::new() + }) + .is_truthy() + ); assert!(Value::from(EventPayload::Custom(Box::new(Value::Bool(true)))).is_truthy()); assert!(!Value::from(EventPayload::Custom(Box::new(Value::Unit))).is_truthy()); } @@ -87,9 +89,11 @@ fn event_payload_labels_and_from_dom() { ); assert_eq!(EventPayload::Error.demo_label(), "Error"); assert_eq!(EventPayload::Load.demo_label(), "Load"); - assert!(EventPayload::Custom(Box::new(Value::Unit)) - .demo_label() - .starts_with("Custom(")); + assert!( + EventPayload::Custom(Box::new(Value::Unit)) + .demo_label() + .starts_with("Custom(") + ); assert_eq!(EventPayload::Click { x: 0, y: 0 }.kind_label(), "click"); assert_eq!( EventPayload::Input { diff --git a/crates/rangular-macros/src/lib.rs b/crates/rangular-macros/src/lib.rs index 1cfff02..b9a901c 100644 --- a/crates/rangular-macros/src/lib.rs +++ b/crates/rangular-macros/src/lib.rs @@ -10,7 +10,7 @@ use std::path::PathBuf; use proc_macro::TokenStream; use quote::quote; -use syn::{parse_macro_input, LitStr}; +use syn::{LitStr, parse_macro_input}; #[proc_macro] pub fn rangular_template(input: TokenStream) -> TokenStream { @@ -56,7 +56,7 @@ fn default_fn_name(path: &str) -> String { #[cfg(test)] mod tests { - use super::{default_fn_name, TemplateInput}; + use super::{TemplateInput, default_fn_name}; use syn::parse_str; fn resolve_fn_name(input: &TemplateInput) -> String { diff --git a/crates/rangular-parser/src/diag.rs b/crates/rangular-parser/src/diag.rs index f7a9624..77c9457 100644 --- a/crates/rangular-parser/src/diag.rs +++ b/crates/rangular-parser/src/diag.rs @@ -1,4 +1,4 @@ -use crate::span::{line_col, Span}; +use crate::span::{Span, line_col}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Severity { diff --git a/crates/rangular-parser/src/lib.rs b/crates/rangular-parser/src/lib.rs index ce53859..3a2cbf0 100644 --- a/crates/rangular-parser/src/lib.rs +++ b/crates/rangular-parser/src/lib.rs @@ -9,20 +9,20 @@ mod projection; mod span; pub use ast::{Attr, Element, ForBlock, IfBlock, NgTemplate, Node, Projection, Template}; -pub use banana::{banana_event_name, banana_set_target, banana_write_expr, BANANA_SET_CALLEE}; -pub use component_io::{builtin_tag_io, classify_bindings, TagIo}; +pub use banana::{BANANA_SET_CALLEE, banana_event_name, banana_set_target, banana_write_expr}; +pub use component_io::{TagIo, builtin_tag_io, classify_bindings}; pub use diag::{Diagnostic, Severity}; pub use expr::{BinOp, Expr, Literal, UnOp}; pub use ir::{ - event_handler_name, from_template as binding_ir, snapshot as binding_ir_snapshot, IrBinding, - IrNode, + IrBinding, IrNode, event_handler_name, from_template as binding_ir, + snapshot as binding_ir_snapshot, }; -pub use parser::{parse, Parsed}; +pub use parser::{Parsed, parse}; pub use projection::{ collect_ng_templates, collect_projection_selects, has_default_projection, is_outlet_container, is_projection_tag, matches_select, select_param_name, template_outlet_ref, }; -pub use span::{line_col, Span}; +pub use span::{Span, line_col}; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/crates/rangular-parser/src/parser.rs b/crates/rangular-parser/src/parser.rs index 17416a1..7310cf4 100644 --- a/crates/rangular-parser/src/parser.rs +++ b/crates/rangular-parser/src/parser.rs @@ -1,9 +1,9 @@ use crate::ast::{Attr, Element, ForBlock, IfBlock, NgTemplate, Node, Projection, Template}; use crate::banana::{banana_event_name, banana_write_expr}; use crate::diag::Diagnostic; -use crate::expr::{parse_into, Expr}; +use crate::expr::{Expr, parse_into}; use crate::projection::is_projection_tag; -use crate::span::{pos, Span}; +use crate::span::{Span, pos}; const VOID: &[&str] = &[ "area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", diff --git a/crates/rangular-parser/tests/corpus.rs b/crates/rangular-parser/tests/corpus.rs index 2edfa12..b58d41e 100644 --- a/crates/rangular-parser/tests/corpus.rs +++ b/crates/rangular-parser/tests/corpus.rs @@ -1,4 +1,4 @@ -use rangular_parser::{parse, Node}; +use rangular_parser::{Node, parse}; use std::path::{Path, PathBuf}; fn fixture_root() -> PathBuf { @@ -78,11 +78,13 @@ fn asset_icon_has_nested_if() { let src = std::fs::read_to_string(path).unwrap(); let parsed = parse(&src, "asset-icon.html"); assert!(parsed.ok()); - assert!(parsed - .template - .nodes - .iter() - .any(|n| matches!(n, Node::If(_)))); + assert!( + parsed + .template + .nodes + .iter() + .any(|n| matches!(n, Node::If(_))) + ); } #[test] @@ -179,10 +181,12 @@ fn template_outlet_parses_ref() { _ => None, }) .expect("section"); - assert!(section - .children - .iter() - .any(|c| { matches!(c, Node::NgTemplate(t) if t.name == "card") })); + assert!( + section + .children + .iter() + .any(|c| { matches!(c, Node::NgTemplate(t) if t.name == "card") }) + ); } #[test] @@ -204,8 +208,10 @@ fn garbage_input_never_panics() { fn unknown_directive_warns_not_panics() { let parsed = parse(r#"
"#, "warn.html"); assert!(parsed.ok()); - assert!(parsed - .diagnostics - .iter() - .any(|d| d.code == "RANG101" && d.message.contains("unknown structural directive"))); + assert!( + parsed + .diagnostics + .iter() + .any(|d| d.code == "RANG101" && d.message.contains("unknown structural directive")) + ); } diff --git a/crates/rangular-parser/tests/edge_cases.rs b/crates/rangular-parser/tests/edge_cases.rs index d432bae..c4119ff 100644 --- a/crates/rangular-parser/tests/edge_cases.rs +++ b/crates/rangular-parser/tests/edge_cases.rs @@ -1,21 +1,25 @@ use rangular_parser::{ - banana_event_name, banana_set_target, banana_write_expr, collect_ng_templates, - collect_projection_selects, has_default_projection, is_outlet_container, is_projection_tag, - matches_select, parse, select_param_name, template_outlet_ref, Attr, Expr, Node, + Attr, Expr, Node, banana_event_name, banana_set_target, banana_write_expr, + collect_ng_templates, collect_projection_selects, has_default_projection, is_outlet_container, + is_projection_tag, matches_select, parse, select_param_name, template_outlet_ref, }; #[test] fn unexpected_else_and_closing_tag() { let lone_else = parse("@else { hi }", "t.html"); - assert!(lone_else - .diagnostics - .iter() - .any(|d| d.message.contains("unexpected @else"))); + assert!( + lone_else + .diagnostics + .iter() + .any(|d| d.message.contains("unexpected @else")) + ); let close = parse("", "t.html"); - assert!(close - .diagnostics - .iter() - .any(|d| d.message.contains("unexpected closing tag"))); + assert!( + close + .diagnostics + .iter() + .any(|d| d.message.contains("unexpected closing tag")) + ); } #[test] @@ -28,10 +32,11 @@ fn comments_and_unclosed_comment() { )); let bad = parse("

x

", "t.html"); let ir = binding_ir(&with_comment.template); @@ -452,9 +484,11 @@ fn binding_ir_comment_outlet_and_handler_names() { "t.html", ); let outlet_ir = binding_ir(&outlet.template); - assert!(outlet_ir - .iter() - .any(|n| matches!(n, IrNode::TemplateOutlet { .. }))); + assert!( + outlet_ir + .iter() + .any(|n| matches!(n, IrNode::TemplateOutlet { .. })) + ); assert_eq!( event_handler_name(&Expr::Call { @@ -472,7 +506,7 @@ fn binding_ir_comment_outlet_and_handler_names() { #[test] fn classify_bindings_marks_registered_outputs() { - use rangular_parser::{classify_bindings, Attr, TagIo}; + use rangular_parser::{Attr, TagIo, classify_bindings}; use std::collections::HashMap; let mut parsed = parse( @@ -488,50 +522,63 @@ fn classify_bindings_marks_registered_outputs() { let Some(Node::Element(el)) = parsed.template.nodes.first() else { panic!("expected element"); }; - assert!(el - .attrs - .iter() - .any(|a| matches!(a, Attr::Output { name, .. } if name == "muteToggle"))); + assert!( + el.attrs + .iter() + .any(|a| matches!(a, Attr::Output { name, .. } if name == "muteToggle")) + ); } #[test] fn banana_event_paren_and_for_ident_edges() { // Terminate bananas on `>` / `/` so the attr loop advances (no hang). let banana_paren = parse(r"", "t.html"); - assert!(banana_paren - .diagnostics - .iter() - .any(|d| d.message.contains("expected ')' in two-way"))); + assert!( + banana_paren + .diagnostics + .iter() + .any(|d| d.message.contains("expected ')' in two-way")) + ); let banana_bracket = parse(r"", "t.html"); - assert!(banana_bracket - .diagnostics - .iter() - .any(|d| d.message.contains("expected ']' in two-way"))); + assert!( + banana_bracket + .diagnostics + .iter() + .any(|d| d.message.contains("expected ']' in two-way")) + ); let banana_quote = parse(r"", "t.html"); - assert!(banana_quote - .diagnostics - .iter() - .any(|d| d.message.contains("expected quoted"))); + assert!( + banana_quote + .diagnostics + .iter() + .any(|d| d.message.contains("expected quoted")) + ); let banana_warn = parse(r#""#, "t.html"); - assert!(banana_warn - .diagnostics - .iter() - .any(|d| d.message.contains("two-way binding target"))); + assert!( + banana_warn + .diagnostics + .iter() + .any(|d| d.message.contains("two-way binding target")) + ); let event_paren = parse(r"