From e87e1e214319a0c8891410e73a956faa1b591e7c Mon Sep 17 00:00:00 2001
From: Li Junchen <lijunchen95@outlook.com>
Date: Mon, 4 Nov 2024 14:36:27 +0800
Subject: [PATCH 1/2] add `moon fmt --block-style`

---
 crates/moon/src/cli/fmt.rs                  |  5 +++++
 crates/moon/src/cli/tool/format_and_diff.rs | 18 ++++++++++++++----
 crates/moonbuild/src/fmt.rs                 |  8 ++++++++
 crates/moonutil/src/common.rs               |  1 +
 4 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/crates/moon/src/cli/fmt.rs b/crates/moon/src/cli/fmt.rs
index a9189a14..1e7c88bd 100644
--- a/crates/moon/src/cli/fmt.rs
+++ b/crates/moon/src/cli/fmt.rs
@@ -37,6 +37,10 @@ pub struct FmtSubcommand {
     #[clap(long)]
     pub sort_input: bool,
 
+    /// Add separator between each segments
+    #[clap(long)]
+    pub block_style: bool,
+
     pub args: Vec<String>,
 }
 
@@ -68,6 +72,7 @@ pub fn run_fmt(cli: &UniversalFlags, cmd: FmtSubcommand) -> anyhow::Result<i32>
         run_mode,
         fmt_opt: Some(FmtOpt {
             check: cmd.check,
+            block_style: cmd.block_style,
             extra_args: cmd.args,
         }),
         build_graph: cli.build_graph,
diff --git a/crates/moon/src/cli/tool/format_and_diff.rs b/crates/moon/src/cli/tool/format_and_diff.rs
index 3d82465f..53012789 100644
--- a/crates/moon/src/cli/tool/format_and_diff.rs
+++ b/crates/moon/src/cli/tool/format_and_diff.rs
@@ -29,15 +29,25 @@ pub struct FormatAndDiffSubcommand {
     #[clap(long)]
     new: PathBuf,
 
+    /// Add separator between each segments
+    #[clap(long)]
+    block_style: bool,
+
     pub args: Vec<String>,
 }
 
 pub fn run_format_and_diff(cmd: FormatAndDiffSubcommand) -> anyhow::Result<i32> {
+    let mut args = vec![
+        "-exit-code",
+        cmd.old.to_str().unwrap(),
+        "-o",
+        cmd.new.to_str().unwrap(),
+    ];
+    if cmd.block_style {
+        args.push("-block-style")
+    }
     let mut execution = std::process::Command::new("moonfmt")
-        .arg("-exit-code")
-        .arg(cmd.old.to_str().unwrap())
-        .arg("-o")
-        .arg(cmd.new.to_str().unwrap())
+        .args(args)
         .args(&cmd.args)
         .stdin(Stdio::inherit())
         .stdout(Stdio::inherit())
diff --git a/crates/moonbuild/src/fmt.rs b/crates/moonbuild/src/fmt.rs
index 20956fd4..64d091da 100644
--- a/crates/moonbuild/src/fmt.rs
+++ b/crates/moonbuild/src/fmt.rs
@@ -128,6 +128,10 @@ fn gen_inplace_fmt_command(
         .arg("-o")
         .arg(&item.phony_out)
         .args(&moonbuild_opt.fmt_opt.as_ref().unwrap().extra_args)
+        .arg_with_cond(
+            moonbuild_opt.fmt_opt.as_ref().unwrap().block_style,
+            "-block-style",
+        )
         .build();
     build.cmdline = Some(command);
     build.desc = Some(format!("moonfmt {}", item.input));
@@ -233,6 +237,10 @@ fn gen_fmt_to_command(
     .arg(&item.input)
     .arg("--new")
     .arg(&item.output)
+    .arg_with_cond(
+        moonbuild_opt.fmt_opt.as_ref().unwrap().block_style,
+        "--block-style",
+    )
     .args(&moonbuild_opt.fmt_opt.as_ref().unwrap().extra_args)
     .build();
     build.cmdline = Some(command);
diff --git a/crates/moonutil/src/common.rs b/crates/moonutil/src/common.rs
index 266a28ed..7539b5c0 100644
--- a/crates/moonutil/src/common.rs
+++ b/crates/moonutil/src/common.rs
@@ -379,6 +379,7 @@ pub struct TestArtifacts {
 #[derive(Debug, Clone, Default)]
 pub struct FmtOpt {
     pub check: bool,
+    pub block_style: bool,
     pub extra_args: Vec<String>,
 }
 

From 61c878d93707d3300097edf2612fcec5166dc2fa Mon Sep 17 00:00:00 2001
From: Li Junchen <lijunchen95@outlook.com>
Date: Mon, 4 Nov 2024 14:36:49 +0800
Subject: [PATCH 2/2] add and update tests

---
 crates/moon/tests/test_cases/mod.rs | 31 +++++++++++++++++++++++++++++
 docs/manual-zh/src/commands.md      |  1 +
 docs/manual/src/commands.md         |  1 +
 3 files changed, 33 insertions(+)

diff --git a/crates/moon/tests/test_cases/mod.rs b/crates/moon/tests/test_cases/mod.rs
index 0133b71a..bd5552ab 100644
--- a/crates/moon/tests/test_cases/mod.rs
+++ b/crates/moon/tests/test_cases/mod.rs
@@ -4001,6 +4001,37 @@ fn test_moon_fmt_extra_args() {
     );
 }
 
+#[test]
+fn test_moon_fmt_block_style() {
+    let dir = TestDir::new("moon_fmt.in");
+    check(
+        get_stdout(&dir, ["fmt", "--block-style", "--sort-input", "--dry-run"]),
+        expect![[r#"
+            moonfmt ./lib/hello.mbt -w -o ./target/wasm-gc/release/format/lib/hello.mbt -block-style
+            moonfmt ./lib/hello_wbtest.mbt -w -o ./target/wasm-gc/release/format/lib/hello_wbtest.mbt -block-style
+            moonfmt ./main/main.mbt -w -o ./target/wasm-gc/release/format/main/main.mbt -block-style
+        "#]],
+    );
+
+    check(
+        get_stdout(
+            &dir,
+            [
+                "fmt",
+                "--block-style",
+                "--check",
+                "--sort-input",
+                "--dry-run",
+            ],
+        ),
+        expect![[r#"
+            moon tool format-and-diff --old ./lib/hello.mbt --new ./target/wasm-gc/release/format/lib/hello.mbt --block-style
+            moon tool format-and-diff --old ./lib/hello_wbtest.mbt --new ./target/wasm-gc/release/format/lib/hello_wbtest.mbt --block-style
+            moon tool format-and-diff --old ./main/main.mbt --new ./target/wasm-gc/release/format/main/main.mbt --block-style
+        "#]],
+    );
+}
+
 #[test]
 fn test_export_memory_name() {
     let dir = TestDir::new("export_memory.in");
diff --git a/docs/manual-zh/src/commands.md b/docs/manual-zh/src/commands.md
index d5bb7be4..a40e4e0c 100644
--- a/docs/manual-zh/src/commands.md
+++ b/docs/manual-zh/src/commands.md
@@ -237,6 +237,7 @@ Format source code
 
 * `--check` — Check only and don't change the source code
 * `--sort-input` — Sort input files
+* `--block-style` — Add separator between each segments
 
 
 
diff --git a/docs/manual/src/commands.md b/docs/manual/src/commands.md
index d5bb7be4..a40e4e0c 100644
--- a/docs/manual/src/commands.md
+++ b/docs/manual/src/commands.md
@@ -237,6 +237,7 @@ Format source code
 
 * `--check` — Check only and don't change the source code
 * `--sort-input` — Sort input files
+* `--block-style` — Add separator between each segments