From 39cccee24bb9fc4298bb5d53f796ca0594ac516a Mon Sep 17 00:00:00 2001 From: Cesar <142530682+cr-fuel@users.noreply.github.com> Date: Sun, 22 Oct 2023 18:26:30 -0300 Subject: [PATCH] Fix struct indentation Fix struct properties indentation --- examples/enums/src/enum_of_structs.sw | 4 +- examples/structs/src/main.sw | 6 +- swayfmt/src/utils/language/expr/mod.rs | 17 +++++ .../src/utils/language/expr/struct_field.rs | 33 ++++++++- swayfmt/src/utils/language/punctuated.rs | 15 +---- swayfmt/tests/mod.rs | 67 +++++++++++++++++++ 6 files changed, 122 insertions(+), 20 deletions(-) diff --git a/examples/enums/src/enum_of_structs.sw b/examples/enums/src/enum_of_structs.sw index 33e4868dd2c..e74aa3528a4 100644 --- a/examples/enums/src/enum_of_structs.sw +++ b/examples/enums/src/enum_of_structs.sw @@ -12,6 +12,8 @@ enum MyEnum { fn main() { let my_enum = MyEnum::Item(Item { - price: 5, amount: 2, id: 42, + price: 5, + amount: 2, + id: 42, }); } diff --git a/examples/structs/src/main.sw b/examples/structs/src/main.sw index b9a3fed8f88..108320a409d 100644 --- a/examples/structs/src/main.sw +++ b/examples/structs/src/main.sw @@ -6,7 +6,8 @@ use data_structures::{Foo, Line, Point, TupleInStruct}; fn hardcoded_instantiation() -> Foo { // Instantiate `foo` as `Foo` let mut foo = Foo { - bar: 42, baz: false, + bar: 42, + baz: false, }; // Access and write to "baz" @@ -59,7 +60,8 @@ fn struct_destructuring() { let Point { x, .. } = point2; let line = Line { - p1: point1, p2: point2, + p1: point1, + p2: point2, }; // Destructure the values from the nested structs into variables let Line { diff --git a/swayfmt/src/utils/language/expr/mod.rs b/swayfmt/src/utils/language/expr/mod.rs index 6bc7ce069cd..4c85ff65131 100644 --- a/swayfmt/src/utils/language/expr/mod.rs +++ b/swayfmt/src/utils/language/expr/mod.rs @@ -65,6 +65,8 @@ impl Format for Expr { let (field_width, body_width) = get_field_width(fields.get(), &mut formatter.clone())?; + formatter.shape.code_line.update_expr_new_line(true); + // changes to the actual formatter let expr_width = buf.chars().count(); formatter.shape.code_line.update_width(expr_width); @@ -650,6 +652,21 @@ fn format_expr_struct( Ok(()) } +pub fn should_write_multiline(code: &str, formatter: &Formatter) -> bool { + if formatter.shape.code_line.expr_new_line { + true + } else { + let max_per_line = formatter.shape.width_heuristics.collection_width; + for (i, c) in code.chars().rev().enumerate() { + if c == '\n' { + return i > max_per_line; + } + } + + false + } +} + fn format_method_call( target: &Expr, dot_token: &DotToken, diff --git a/swayfmt/src/utils/language/expr/struct_field.rs b/swayfmt/src/utils/language/expr/struct_field.rs index 98895d12ef6..7bd4c3ece72 100644 --- a/swayfmt/src/utils/language/expr/struct_field.rs +++ b/swayfmt/src/utils/language/expr/struct_field.rs @@ -1,7 +1,11 @@ use crate::{ config::items::ItemBraceStyle, - formatter::{shape::LineStyle, *}, + formatter::{ + shape::{ExprKind, LineStyle}, + *, + }, utils::{ + language::expr::should_write_multiline, map::byte_span::{ByteSpan, LeafSpans}, CurlyBrace, }, @@ -18,8 +22,31 @@ impl Format for ExprStructField { ) -> Result<(), FormatterError> { write!(formatted_code, "{}", self.field_name.span().as_str())?; if let Some((colon_token, expr)) = &self.expr_opt { - write!(formatted_code, "{} ", colon_token.span().as_str())?; - expr.format(formatted_code, formatter)?; + formatter.with_shape( + formatter + .shape + .with_code_line_from(LineStyle::Inline, ExprKind::Struct), + |formatter| -> Result<(), FormatterError> { + let mut expr_str = FormattedCode::new(); + expr.format(&mut expr_str, formatter)?; + + let expr_str = if should_write_multiline(&expr_str, formatter) { + let mut expr_str = FormattedCode::new(); + formatter.shape.code_line.update_expr_new_line(true); + expr.format(&mut expr_str, formatter)?; + expr_str + } else { + expr_str + }; + write!( + formatted_code, + "{} {}", + colon_token.span().as_str(), + expr_str + )?; + Ok(()) + }, + )?; } Ok(()) diff --git a/swayfmt/src/utils/language/punctuated.rs b/swayfmt/src/utils/language/punctuated.rs index 1c136983cfe..e2d914bb470 100644 --- a/swayfmt/src/utils/language/punctuated.rs +++ b/swayfmt/src/utils/language/punctuated.rs @@ -9,20 +9,7 @@ use sway_ast::{ }; use sway_types::{ast::PunctKind, Ident, Spanned}; -fn should_write_multiline(code: &str, formatter: &Formatter) -> bool { - if formatter.shape.code_line.expr_new_line { - true - } else { - let max_per_line = formatter.shape.width_heuristics.collection_width; - for (i, c) in code.chars().rev().enumerate() { - if c == '\n' { - return i > max_per_line; - } - } - - false - } -} +use super::expr::should_write_multiline; impl Format for Punctuated where diff --git a/swayfmt/tests/mod.rs b/swayfmt/tests/mod.rs index a8deabf8a6d..1207b38125d 100644 --- a/swayfmt/tests/mod.rs +++ b/swayfmt/tests/mod.rs @@ -1890,3 +1890,70 @@ fn main() { "#, ); } + +#[test] +fn struct_new_line() { + check( + r#" + library; + +struct Item { + price: u64, amount: u64, + id: u64, +} + +enum MyEnum { + Item: Item, +} + +fn main() { + let my_enum = MyEnum::Item(Item { + price: 5, amount: 2, id: 42, + }); +} + "#, + r#"library; + +struct Item { + price: u64, + amount: u64, + id: u64, +} + +enum MyEnum { + Item: Item, +} + +fn main() { + let my_enum = MyEnum::Item(Item { + price: 5, + amount: 2, + id: 42, + }); +} +"#, + ) +} + +#[test] +fn struct_new_line_2() { + check( + r#" + library; +impl Convert for Rectangle { fn from(t: Square) -> Self { +Self { width: t + .width,length: t.width, +}}} + "#, + r#"library; +impl Convert for Rectangle { + fn from(t: Square) -> Self { + Self { + width: t.width, + length: t.width, + } + } +} +"#, + ) +}