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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75dbfbcc5bd176d4dc5394a718354c0d027c6ae2d855e2ee70422b3b17c91c8f
4
- data.tar.gz: dafa925df2d12a4f055da3e03c777f96fb235eb5fde1b1d28c34ca8ba2ad110d
3
+ metadata.gz: b17e8b19308af7368b77ac8b7a89bab1b7c321e16de03f1aae0b8d3df27f678c
4
+ data.tar.gz: 9929e63f33a0e116ce70441e86d6c525157517b37e2f83f4e9cb931d53eab8af
5
5
  SHA512:
6
- metadata.gz: 6444ec42f910b398e3129dbb9028577a9eb893de5224fcf35bd1ccc961142b6a9f33bda5f26c369ca6b8c569a5d26c166a81526c323f1cf7483d639e6e8dbc14
7
- data.tar.gz: 4c013c8e0f7263c472c38cdbbdb12990f517e66fa5be011b9d7535ccb2cba473ba9ed958e0b5ff7fc789c693bc39c47bafa3cdfdb7bf06f6d55ba6d4b5b2e6a3
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
@@ -1214,7 +1214,7 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
1214
1214
 
1215
1215
  [[package]]
1216
1216
  name = "rfmt"
1217
- version = "1.5.1"
1217
+ version = "1.5.2"
1218
1218
  dependencies = [
1219
1219
  "anyhow",
1220
1220
  "clap",
data/ext/rfmt/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rfmt"
3
- version = "1.5.1"
3
+ version = "1.5.2"
4
4
  edition = "2021"
5
5
  authors = ["fujitani sora <fujitanisora0414@gmail.com>"]
6
6
  license = "MIT"
@@ -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
- assert_eq!(node.formatting.multiline, true);
371
+ assert!(node.formatting.multiline);
372
372
  assert!(node.is_multiline());
373
373
  assert_eq!(node.line_count(), 3);
374
374
  }
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rfmt
4
- VERSION = '1.5.1'
4
+ VERSION = '1.5.2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfmt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - fujitani sora