rfmt 1.5.1 → 1.5.2
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 +12 -0
- data/Cargo.lock +1 -1
- data/ext/rfmt/Cargo.toml +1 -1
- data/ext/rfmt/src/emitter/mod.rs +45 -0
- data/ext/rfmt/src/parser/prism_adapter.rs +1 -1
- data/lib/rfmt/prism_bridge.rb +2 -0
- data/lib/rfmt/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b17e8b19308af7368b77ac8b7a89bab1b7c321e16de03f1aae0b8d3df27f678c
|
|
4
|
+
data.tar.gz: 9929e63f33a0e116ce70441e86d6c525157517b37e2f83f4e9cb931d53eab8af
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f2c375826007f03f24163fa83b1b51dffa3ef241ad4e38c800145b8387b108368807cc221b4d453860861b2dea8fcfbea33ad7391b61c24f2d973da004078aaa
|
|
7
|
+
data.tar.gz: 7305b6778b6dcecb116a7e9df522d5085eee28f763fa88283ecc70a1a0d71e70eace61e7be736eb010a8cf8aacf556b34a9226d05cf83f9216c3e385d43ce720
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [1.5.2] - 2026-02-21
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Instance variable write node emission support (#92)
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
- Nix dev environment optimization (build caching, direnv support, devShell splitting)
|
|
10
|
+
- Code formatting improvements (clippy, rustfmt)
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Fix Nix bundler version conflict (remove pkgs.bundler, use Ruby built-in)
|
|
14
|
+
|
|
3
15
|
## [1.5.1] - 2026-02-21
|
|
4
16
|
|
|
5
17
|
### Fixed
|
data/Cargo.lock
CHANGED
data/ext/rfmt/Cargo.toml
CHANGED
data/ext/rfmt/src/emitter/mod.rs
CHANGED
|
@@ -463,6 +463,9 @@ impl Emitter {
|
|
|
463
463
|
NodeType::SingletonClassNode => self.emit_singleton_class(node, indent_level)?,
|
|
464
464
|
NodeType::CaseMatchNode => self.emit_case_match(node, indent_level)?,
|
|
465
465
|
NodeType::InNode => self.emit_in(node, indent_level)?,
|
|
466
|
+
NodeType::LocalVariableWriteNode | NodeType::InstanceVariableWriteNode => {
|
|
467
|
+
self.emit_variable_write(node, indent_level)?
|
|
468
|
+
}
|
|
466
469
|
_ => self.emit_generic(node, indent_level)?,
|
|
467
470
|
}
|
|
468
471
|
Ok(())
|
|
@@ -1380,6 +1383,48 @@ impl Emitter {
|
|
|
1380
1383
|
Ok(())
|
|
1381
1384
|
}
|
|
1382
1385
|
|
|
1386
|
+
/// Emit variable write node (LocalVariableWriteNode, InstanceVariableWriteNode)
|
|
1387
|
+
/// Handles `x = value` and `@x = value` patterns
|
|
1388
|
+
fn emit_variable_write(&mut self, node: &Node, indent_level: usize) -> Result<()> {
|
|
1389
|
+
self.emit_comments_before(node.location.start_line, indent_level)?;
|
|
1390
|
+
|
|
1391
|
+
let name = node.metadata.get("name").map(|s| s.as_str()).unwrap_or("_");
|
|
1392
|
+
|
|
1393
|
+
// Get value node (first child)
|
|
1394
|
+
let value = match node.children.first() {
|
|
1395
|
+
Some(v) => v,
|
|
1396
|
+
None => {
|
|
1397
|
+
// No value: fallback to source extraction
|
|
1398
|
+
return self.emit_generic(node, indent_level);
|
|
1399
|
+
}
|
|
1400
|
+
};
|
|
1401
|
+
|
|
1402
|
+
let is_block_value = matches!(
|
|
1403
|
+
value.node_type,
|
|
1404
|
+
NodeType::IfNode
|
|
1405
|
+
| NodeType::UnlessNode
|
|
1406
|
+
| NodeType::CaseNode
|
|
1407
|
+
| NodeType::CaseMatchNode
|
|
1408
|
+
| NodeType::BeginNode
|
|
1409
|
+
| NodeType::WhileNode
|
|
1410
|
+
| NodeType::UntilNode
|
|
1411
|
+
| NodeType::ForNode
|
|
1412
|
+
);
|
|
1413
|
+
|
|
1414
|
+
self.emit_indent(indent_level)?;
|
|
1415
|
+
if is_block_value {
|
|
1416
|
+
writeln!(self.buffer, "{} =", name)?;
|
|
1417
|
+
self.emit_node(value, indent_level + 1)?;
|
|
1418
|
+
} else {
|
|
1419
|
+
write!(self.buffer, "{} = ", name)?;
|
|
1420
|
+
self.write_source_text_trimmed(value)?;
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
self.emit_trailing_comments(node.location.end_line)?;
|
|
1424
|
+
|
|
1425
|
+
Ok(())
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1383
1428
|
/// Emit generic node by extracting from source
|
|
1384
1429
|
fn emit_generic(&mut self, node: &Node, indent_level: usize) -> Result<()> {
|
|
1385
1430
|
self.emit_comments_before(node.location.start_line, indent_level)?;
|
|
@@ -368,7 +368,7 @@ mod tests {
|
|
|
368
368
|
|
|
369
369
|
let node = result.unwrap();
|
|
370
370
|
assert_eq!(node.node_type, NodeType::ClassNode);
|
|
371
|
-
|
|
371
|
+
assert!(node.formatting.multiline);
|
|
372
372
|
assert!(node.is_multiline());
|
|
373
373
|
assert_eq!(node.line_count(), 3);
|
|
374
374
|
}
|
data/lib/rfmt/prism_bridge.rb
CHANGED
|
@@ -465,6 +465,8 @@ module Rfmt
|
|
|
465
465
|
if (value = extract_literal_value(node))
|
|
466
466
|
metadata['value'] = value
|
|
467
467
|
end
|
|
468
|
+
when Prism::LocalVariableWriteNode, Prism::InstanceVariableWriteNode
|
|
469
|
+
metadata['name'] = node.name.to_s
|
|
468
470
|
when Prism::IfNode, Prism::UnlessNode
|
|
469
471
|
# Detect ternary operator: if_keyword_loc is nil for ternary
|
|
470
472
|
metadata['is_ternary'] = node.if_keyword_loc.nil?.to_s if node.respond_to?(:if_keyword_loc)
|
data/lib/rfmt/version.rb
CHANGED