rfmt 1.2.4 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c95517c6abaad1c4bf47425dd4853dcd78bf5a2e47ab2bdc0cae1a3d3698c54
4
- data.tar.gz: a207798a5811f989a5ebb3405e48e0c86ac60d40b208f141e6d31a83de62dc0d
3
+ metadata.gz: 67e0ceb39e5630237f92ac2d78fcf2438313dcd883c72ec44066ede9e9868735
4
+ data.tar.gz: 69b818c97c55f1ffc4f09518393c2249b71e0e084207249ba8fa631679d66167
5
5
  SHA512:
6
- metadata.gz: 86307164b77b1836c57718c62ac84bbc920fbfc36a7f0367656bc4fadd65cd846df9f45e5d8985a3eff2f49a548a576a8a73cb05e8e78679fe666589e904762c
7
- data.tar.gz: 69a7f17c2e547616ebea1a109628df5d3695fb9d9359715d90707a51c4d1c2d72095bad48ffc1d370e7229a01f193392235c3c7c2a0f13fd211dc0885ef2c447
6
+ metadata.gz: 2e7cc3e550d2506c0f6691f6b4823f76a2c88e94519d46ca080c2d3b57a7330d5e3df4bca1ab4e18ae1551ea6821c92210638d657997cb6a72631512e47d2bc5
7
+ data.tar.gz: '0491cb8029834d053692a9cc251da952c5bbbf6e38045bcfe3a90dfb2a9ebf31cb3dfb09bfa640b0c22b427d1ab47f0e801ecd44a88c79626f05ab4898d19c64'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.2.5] - 2026-01-04
4
+
5
+ ### Fixed
6
+ - Fix trailing comments on `end` keyword (e.g., `end # rubocop:disable`)
7
+ - Fix block internal comments being moved outside the block
8
+ - Fix blank line preservation between code and comments inside blocks
9
+
3
10
  ## [1.2.4] - 2026-01-04
4
11
 
5
12
  ### Fixed
data/Cargo.lock CHANGED
@@ -1219,7 +1219,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1219
1219
 
1220
1220
  [[package]]
1221
1221
  name = "rfmt"
1222
- version = "1.2.4"
1222
+ version = "1.2.5"
1223
1223
  dependencies = [
1224
1224
  "anyhow",
1225
1225
  "clap",
data/ext/rfmt/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rfmt"
3
- version = "1.2.4"
3
+ version = "1.2.5"
4
4
  edition = "2021"
5
5
  authors = ["fujitani sora <fujitanisora0414@gmail.com>"]
6
6
  license = "MIT"
@@ -221,6 +221,55 @@ impl Emitter {
221
221
  Ok(())
222
222
  }
223
223
 
224
+ /// Emit comments that are within a given line range, preserving blank lines from prev_line
225
+ fn emit_comments_in_range_with_prev_line(
226
+ &mut self,
227
+ start_line: usize,
228
+ end_line: usize,
229
+ indent_level: usize,
230
+ prev_line: usize,
231
+ ) -> Result<()> {
232
+ let indent_str = match self.config.formatting.indent_style {
233
+ IndentStyle::Spaces => " ".repeat(self.config.formatting.indent_width * indent_level),
234
+ IndentStyle::Tabs => "\t".repeat(indent_level),
235
+ };
236
+
237
+ let mut comments_to_emit = Vec::new();
238
+ for (idx, comment) in self.all_comments.iter().enumerate() {
239
+ if self.emitted_comment_indices.contains(&idx) {
240
+ continue;
241
+ }
242
+
243
+ if comment.location.start_line >= start_line && comment.location.end_line < end_line {
244
+ comments_to_emit.push((
245
+ idx,
246
+ comment.text.clone(),
247
+ comment.location.start_line,
248
+ comment.location.end_line,
249
+ ));
250
+ }
251
+ }
252
+
253
+ // Sort by start_line to emit in order
254
+ comments_to_emit.sort_by_key(|(_, _, start, _)| *start);
255
+
256
+ let mut last_end_line: usize = prev_line;
257
+
258
+ for (idx, text, comment_start_line, comment_end_line) in comments_to_emit {
259
+ // Preserve blank lines between previous content and this comment
260
+ let gap = comment_start_line.saturating_sub(last_end_line);
261
+ for _ in 1..gap {
262
+ self.buffer.push('\n');
263
+ }
264
+
265
+ writeln!(self.buffer, "{}{}", indent_str, text)?;
266
+ self.emitted_comment_indices.push(idx);
267
+ last_end_line = comment_end_line;
268
+ }
269
+
270
+ Ok(())
271
+ }
272
+
224
273
  /// Emit comments that appear on the same line (trailing comments)
225
274
  fn emit_trailing_comments(&mut self, line: usize) -> Result<()> {
226
275
  let mut indices_to_emit = Vec::new();
@@ -376,6 +425,8 @@ impl Emitter {
376
425
 
377
426
  self.emit_indent(indent_level)?;
378
427
  write!(self.buffer, "end")?;
428
+ // Emit trailing comments on end line (e.g., `end # rubocop:disable`)
429
+ self.emit_trailing_comments(node.location.end_line)?;
379
430
 
380
431
  Ok(())
381
432
  }
@@ -421,6 +472,8 @@ impl Emitter {
421
472
 
422
473
  self.emit_indent(indent_level)?;
423
474
  write!(self.buffer, "end")?;
475
+ // Emit trailing comments on end line (e.g., `end # rubocop:disable`)
476
+ self.emit_trailing_comments(node.location.end_line)?;
424
477
 
425
478
  Ok(())
426
479
  }
@@ -493,6 +546,8 @@ impl Emitter {
493
546
 
494
547
  self.emit_indent(indent_level)?;
495
548
  write!(self.buffer, "end")?;
549
+ // Emit trailing comments on end line (e.g., `end # rubocop:disable`)
550
+ self.emit_trailing_comments(node.location.end_line)?;
496
551
 
497
552
  Ok(())
498
553
  }
@@ -524,6 +579,8 @@ impl Emitter {
524
579
 
525
580
  self.emit_indent(indent_level)?;
526
581
  write!(self.buffer, "end")?;
582
+ // Emit trailing comments on end line
583
+ self.emit_trailing_comments(node.location.end_line)?;
527
584
  } else {
528
585
  // Implicit begin - emit children directly
529
586
  for (i, child) in node.children.iter().enumerate() {
@@ -714,6 +771,8 @@ impl Emitter {
714
771
  // Emit "end" keyword
715
772
  self.emit_indent(indent_level)?;
716
773
  write!(self.buffer, "end")?;
774
+ // Emit trailing comments on end line
775
+ self.emit_trailing_comments(node.location.end_line)?;
717
776
 
718
777
  Ok(())
719
778
  }
@@ -931,6 +990,8 @@ impl Emitter {
931
990
  if !is_elsif {
932
991
  self.emit_indent(indent_level)?;
933
992
  write!(self.buffer, "end")?;
993
+ // Emit trailing comments on end line
994
+ self.emit_trailing_comments(node.location.end_line)?;
934
995
  }
935
996
 
936
997
  Ok(())
@@ -1021,17 +1082,46 @@ impl Emitter {
1021
1082
  self.buffer.push('\n');
1022
1083
 
1023
1084
  // Find and emit the body (StatementsNode among children)
1085
+ let block_start_line = block_node.location.start_line;
1086
+ let block_end_line = block_node.location.end_line;
1087
+ let mut last_stmt_end_line = block_start_line;
1088
+
1024
1089
  for child in &block_node.children {
1025
1090
  if matches!(child.node_type, NodeType::StatementsNode) {
1026
1091
  self.emit_statements(child, indent_level + 1)?;
1092
+ // Track the last statement's end line for blank line preservation
1093
+ if let Some(last_child) = child.children.last() {
1094
+ last_stmt_end_line = last_child.location.end_line;
1095
+ }
1027
1096
  self.buffer.push('\n');
1028
1097
  break;
1029
1098
  }
1030
1099
  }
1031
1100
 
1101
+ // Emit comments that are inside the block but not attached to any node
1102
+ // (comments between last statement and 'end')
1103
+ let had_internal_comments =
1104
+ self.has_comments_in_range(block_start_line + 1, block_end_line);
1105
+ if had_internal_comments {
1106
+ // Preserve blank line between last statement and first comment
1107
+ self.emit_comments_in_range_with_prev_line(
1108
+ block_start_line + 1,
1109
+ block_end_line,
1110
+ indent_level + 1,
1111
+ last_stmt_end_line,
1112
+ )?;
1113
+ }
1114
+
1115
+ // Add newline if there were internal comments
1116
+ if had_internal_comments && !self.buffer.ends_with('\n') {
1117
+ self.buffer.push('\n');
1118
+ }
1119
+
1032
1120
  // Emit 'end'
1033
1121
  self.emit_indent(indent_level)?;
1034
1122
  write!(self.buffer, "end")?;
1123
+ // Emit trailing comments on end line
1124
+ self.emit_trailing_comments(block_end_line)?;
1035
1125
 
1036
1126
  Ok(())
1037
1127
  }
@@ -1220,6 +1310,8 @@ impl Emitter {
1220
1310
 
1221
1311
  self.emit_indent(indent_level)?;
1222
1312
  write!(self.buffer, "end")?;
1313
+ // Emit trailing comments on end line
1314
+ self.emit_trailing_comments(node.location.end_line)?;
1223
1315
 
1224
1316
  Ok(())
1225
1317
  }
@@ -1271,6 +1363,8 @@ impl Emitter {
1271
1363
 
1272
1364
  self.emit_indent(indent_level)?;
1273
1365
  write!(self.buffer, "end")?;
1366
+ // Emit trailing comments on end line
1367
+ self.emit_trailing_comments(node.location.end_line)?;
1274
1368
 
1275
1369
  Ok(())
1276
1370
  }
data/lib/rfmt/rfmt.so CHANGED
Binary file
data/lib/rfmt/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rfmt
4
- VERSION = '1.2.4'
4
+ VERSION = '1.2.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfmt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - fujitani sora
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-01-03 00:00:00.000000000 Z
11
+ date: 2026-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb_sys