unparser 0.8.0 → 0.8.1

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: e0e776dd7b47efb62b8ad18d7262d247362944f28ea67edb7e518d8a94c74649
4
- data.tar.gz: 759ec6fb240c4c62835bd8c789877fc26fc974563d2566687a63b2c0dec1072f
3
+ metadata.gz: 74c2dbda8910251cd49656bf6a510eb8441327d9c1f0e4f6fe1756f0f016a174
4
+ data.tar.gz: 3ee345b280dde6c11e5174a3ab6137f99d4a21e90996ce1aa9cec8ec36bd4bae
5
5
  SHA512:
6
- metadata.gz: 11fe99943d2575e00ca2fc150a78cad1f2f830b3249f3692f473da7e520775fc9423b254fb2f7613e4b6811f03dd3d2af0d4bba1d0f2f143e048ab65281771ff
7
- data.tar.gz: f08db4117aa2ebba9c5ac7a9e057ca7ddc9fc0613170752ac10cc7515058f491fe756b880db73629e2e7a8328cc979872b4c682197c061de39da52a44796587f
6
+ metadata.gz: 9fa96e7fbb09baf4c0c04e9afe14e9f0348bf2de1601abba5360ed8cdbdd3040b742deeefb44f0485d0501a26d4798ce631e004a357aab11e21c5b131c030ef4
7
+ data.tar.gz: 1a3953a9be8966ff0030ea4757228bf56d4f2be565246bf843649fd3e03735353fd8da3fabd1ea1f6586502940c054981477f043086c86fa2d8264b1a526b989
@@ -51,7 +51,7 @@ module Unparser
51
51
  emit_send_target
52
52
  when :lambda
53
53
  visit(target)
54
- emit_lambda_arguments unless node.type.equal?(:numblock)
54
+ emit_lambda_arguments
55
55
  else
56
56
  visit(target)
57
57
  end
@@ -63,7 +63,11 @@ module Unparser
63
63
  target_writer.emit_arguments_without_heredoc_body
64
64
  end
65
65
 
66
+ # NOTE: mutant fails on Ruby < 3.4
67
+ # mutant:disable
66
68
  def emit_lambda_arguments
69
+ return if node.type.equal?(:numblock) || itblock?
70
+
67
71
  parentheses { writer_with(Args, node: arguments).emit_lambda_arguments }
68
72
  end
69
73
 
@@ -26,42 +26,41 @@ module Unparser
26
26
  #
27
27
  # mutant:disable
28
28
  def dispatch
29
- if heredoc?
30
- write(HEREDOC_HEADER)
31
- buffer.push_heredoc(heredoc_body)
32
- elsif round_tripping_segmented_source
33
- write(round_tripping_segmented_source)
34
- else
35
- fail UnsupportedNodeError, "Unparser cannot round trip this node: #{node.inspect}"
36
- end
29
+ # Try predictable patterns first before exhaustive search
30
+
31
+ # Pattern 1: HEREDOC for large dstr (>= 8 children, preserve readability)
32
+ return write_heredoc if children.length >= HEREDOC_THRESHOLD && round_trips_heredoc?
33
+
34
+ # Pattern 2: Limited search (prevent exponential blowup)
35
+ source = limited_search_segmented_source
36
+ return write(source) if source
37
+
38
+ # Pattern 3: HEREDOC fallback (last resort if segmentation fails)
39
+ return write_heredoc if round_trips_heredoc?
40
+
41
+ fail UnsupportedNodeError, "Unparser cannot round trip this node: #{node.inspect}"
37
42
  end
38
43
 
39
44
  private
40
45
 
41
- def heredoc?
42
- if children.length >= HEREDOC_THRESHOLD
43
- round_trips_heredoc?
44
- else
45
- round_tripping_segmented_source.nil? # && round_trips_heredoc?
46
- end
46
+ def write_heredoc
47
+ write(HEREDOC_HEADER)
48
+ buffer.push_heredoc(heredoc_body)
47
49
  end
48
- memoize :heredoc?
49
50
 
50
51
  def round_trips_heredoc?
51
52
  round_trips?(source: heredoc_source)
52
53
  end
53
54
  memoize :round_trips_heredoc?
54
55
 
55
- def round_tripping_segmented_source
56
+ def limited_search_segmented_source
56
57
  each_segments(children) do |segments|
57
-
58
58
  source = segmented_source(segments: segments)
59
-
60
59
  return source if round_trips?(source: source)
61
60
  end
61
+
62
62
  nil
63
63
  end
64
- memoize :round_tripping_segmented_source
65
64
 
66
65
  def each_segments(array)
67
66
  yield [array]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
@@ -43,28 +43,28 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '1.4'
46
+ version: 1.5.1
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '1.4'
53
+ version: 1.5.1
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: mutant
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.13.0
60
+ version: 0.13.2
61
61
  type: :development
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.13.0
67
+ version: 0.13.2
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: mutant-rspec
70
70
  requirement: !ruby/object:Gem::Requirement