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 +4 -4
- data/CHANGELOG.md +7 -0
- data/Cargo.lock +1 -1
- data/ext/rfmt/Cargo.toml +1 -1
- data/ext/rfmt/src/emitter/mod.rs +94 -0
- data/lib/rfmt/rfmt.so +0 -0
- data/lib/rfmt/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 67e0ceb39e5630237f92ac2d78fcf2438313dcd883c72ec44066ede9e9868735
|
|
4
|
+
data.tar.gz: 69b818c97c55f1ffc4f09518393c2249b71e0e084207249ba8fa631679d66167
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
data/ext/rfmt/Cargo.toml
CHANGED
data/ext/rfmt/src/emitter/mod.rs
CHANGED
|
@@ -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
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
|
+
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-
|
|
11
|
+
date: 2026-01-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rb_sys
|