ruby-next-core 0.13.1 → 0.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/README.md +31 -5
  4. data/bin/transform +5 -1
  5. data/lib/.rbnext/2.1/ruby-next/core.rb +7 -1
  6. data/lib/.rbnext/2.1/ruby-next/language.rb +41 -23
  7. data/lib/.rbnext/2.3/ruby-next/commands/nextify.rb +2 -2
  8. data/lib/.rbnext/2.3/ruby-next/language/eval.rb +1 -0
  9. data/lib/.rbnext/2.3/ruby-next/language/rewriters/{endless_range.rb → 2.6/endless_range.rb} +0 -0
  10. data/lib/.rbnext/2.3/ruby-next/language/rewriters/{pattern_matching.rb → 2.7/pattern_matching.rb} +121 -34
  11. data/lib/.rbnext/2.3/ruby-next/language/rewriters/3.1/anonymous_block.rb +68 -0
  12. data/lib/.rbnext/2.3/ruby-next/language/rewriters/base.rb +13 -1
  13. data/lib/.rbnext/2.7/ruby-next/core.rb +7 -1
  14. data/lib/.rbnext/2.7/ruby-next/language/rewriters/2.7/pattern_matching.rb +1061 -0
  15. data/lib/ruby-next/commands/nextify.rb +2 -2
  16. data/lib/ruby-next/config.rb +2 -2
  17. data/lib/ruby-next/core/enumerable/compact.rb +22 -0
  18. data/lib/ruby-next/core/integer/try_convert.rb +16 -0
  19. data/lib/ruby-next/core/matchdata/match.rb +9 -0
  20. data/lib/ruby-next/core/refinement/import.rb +60 -0
  21. data/lib/ruby-next/core.rb +7 -1
  22. data/lib/ruby-next/language/eval.rb +1 -0
  23. data/lib/ruby-next/language/rewriters/{numeric_literals.rb → 2.1/numeric_literals.rb} +0 -0
  24. data/lib/ruby-next/language/rewriters/{required_kwargs.rb → 2.1/required_kwargs.rb} +0 -0
  25. data/lib/ruby-next/language/rewriters/{safe_navigation.rb → 2.3/safe_navigation.rb} +0 -0
  26. data/lib/ruby-next/language/rewriters/{squiggly_heredoc.rb → 2.3/squiggly_heredoc.rb} +0 -0
  27. data/lib/ruby-next/language/rewriters/{runtime → 2.4}/dir.rb +0 -0
  28. data/lib/ruby-next/language/rewriters/{endless_range.rb → 2.6/endless_range.rb} +0 -0
  29. data/lib/ruby-next/language/rewriters/{args_forward.rb → 2.7/args_forward.rb} +0 -0
  30. data/lib/ruby-next/language/rewriters/{numbered_params.rb → 2.7/numbered_params.rb} +0 -0
  31. data/lib/ruby-next/language/rewriters/{pattern_matching.rb → 2.7/pattern_matching.rb} +121 -34
  32. data/lib/ruby-next/language/rewriters/{args_forward_leading.rb → 3.0/args_forward_leading.rb} +0 -0
  33. data/lib/ruby-next/language/rewriters/{endless_method.rb → 3.0/endless_method.rb} +15 -12
  34. data/lib/ruby-next/language/rewriters/{find_pattern.rb → 3.0/find_pattern.rb} +1 -3
  35. data/lib/ruby-next/language/rewriters/3.0/in_pattern.rb +22 -0
  36. data/lib/ruby-next/language/rewriters/3.1/anonymous_block.rb +68 -0
  37. data/lib/ruby-next/language/rewriters/3.1/endless_method_command.rb +46 -0
  38. data/lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb +41 -0
  39. data/lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb +50 -0
  40. data/lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb +60 -0
  41. data/lib/ruby-next/language/rewriters/{shorthand_hash.rb → 3.1/shorthand_hash.rb} +6 -4
  42. data/lib/ruby-next/language/rewriters/base.rb +13 -1
  43. data/lib/ruby-next/language/{edge.rb → rewriters/edge.rb} +0 -0
  44. data/lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb +50 -0
  45. data/lib/ruby-next/language/rewriters/{method_reference.rb → proposed/method_reference.rb} +0 -0
  46. data/lib/ruby-next/language/rewriters/proposed.rb +9 -0
  47. data/lib/ruby-next/language/rewriters/runtime.rb +1 -2
  48. data/lib/ruby-next/language.rb +41 -23
  49. data/lib/ruby-next/rubocop.rb +24 -4
  50. data/lib/ruby-next/version.rb +1 -1
  51. metadata +35 -23
  52. data/lib/ruby-next/language/proposed.rb +0 -9
  53. data/lib/ruby-next/language/rewriters/in_pattern.rb +0 -56
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyNext
4
+ module Language
5
+ module Rewriters
6
+ using RubyNext
7
+
8
+ # Allow omitting parentheses around patterns in `=>` and `in`
9
+ class OnelinePatternParensless < Base
10
+ NAME = "pattern-matching-oneline-parensless"
11
+ SYNTAX_PROBE = "[1, 2] => a, b"
12
+ MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
13
+
14
+ def on_match_pattern(node)
15
+ _, pattern = *node.children
16
+
17
+ # When no parens, children boundaries are the same as the whole pattern
18
+ if (
19
+ pattern.type == :array_pattern ||
20
+ pattern.type == :hash_pattern
21
+ ) &&
22
+ pattern.children.any? &&
23
+ pattern.loc.column == pattern.children.first.loc.column &&
24
+ pattern.loc.last_column == pattern.children.last.loc.last_column
25
+
26
+ context.track! self
27
+
28
+ left_p, right_p = pattern.type == :array_pattern ? %w([ ]) : %w[{ }]
29
+
30
+ insert_before(pattern.loc.expression, left_p)
31
+ insert_after(pattern.loc.expression, right_p)
32
+ else
33
+ super(node)
34
+ end
35
+ end
36
+
37
+ alias on_match_pattern_p on_match_pattern
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyNext
4
+ module Language
5
+ module Rewriters
6
+ using RubyNext
7
+
8
+ # Separate pattern matching rewriter for Ruby 2.7 and 3.0 to
9
+ # transpile only ^(ivar|cvar|gvar)
10
+ class PinVarsPattern < PatternMatching
11
+ NAME = "pattern-matching-pin-vars"
12
+ SYNTAX_PROBE = "@a = 0; case 0; in ^@a; true; end"
13
+ MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
14
+
15
+ def on_case_match(node)
16
+ @has_pin_vars = false
17
+ process_regular_node(node).then do |new_node|
18
+ return new_node unless has_pin_vars
19
+ super(node)
20
+ end
21
+ end
22
+
23
+ def on_match_pattern(node)
24
+ @has_pin_vars = false
25
+ process_regular_node(node).then do |new_node|
26
+ return new_node unless has_pin_vars
27
+ super(node)
28
+ end
29
+ end
30
+
31
+ def on_match_pattern_p(node)
32
+ @has_pin_vars = false
33
+ process_regular_node(node).then do |new_node|
34
+ return new_node unless has_pin_vars
35
+ super(node)
36
+ end
37
+ end
38
+
39
+ def on_pin(node)
40
+ @has_pin_vars = node.children.first.type != :lvar
41
+ super(node)
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :has_pin_vars
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add binding argument to all self-less eval's
4
+ module RubyNext
5
+ module Language
6
+ module Rewriters
7
+ class RefinementImportMethods < Language::Rewriters::Base
8
+ NAME = "refinement-import-methods"
9
+ SYNTAX_PROBE = "a = Module.new{}; Module.new do; refine String do; import_methods a end; end"
10
+ MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
11
+
12
+ def on_block(node)
13
+ sender, args, body = *node
14
+ receiver, mid, * = *sender
15
+
16
+ return super unless mid == :refine && receiver.nil?
17
+
18
+ return super unless body
19
+
20
+ @within_refinement = true
21
+
22
+ node.updated(
23
+ nil,
24
+ [
25
+ sender,
26
+ args,
27
+ process(body)
28
+ ]
29
+ ).tap do
30
+ @within_refinement = false
31
+ end
32
+ end
33
+
34
+ def on_send(node)
35
+ return super unless @within_refinement
36
+
37
+ _receiver, mid, *children = *node
38
+
39
+ return super unless mid == :import_methods
40
+
41
+ context.track! self
42
+
43
+ updated = node.updated(
44
+ nil,
45
+ [
46
+ s(:const, s(:const, s(:cbase), :RubyNext), :Core),
47
+ mid,
48
+ *children,
49
+ s(:send, nil, :binding)
50
+ ]
51
+ )
52
+
53
+ replace(node.loc.expression, updated)
54
+
55
+ updated
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -5,13 +5,15 @@ module RubyNext
5
5
  module Rewriters
6
6
  class ShorthandHash < Base
7
7
  NAME = "shorthand-hash"
8
- SYNTAX_PROBE = "data = {x}"
9
- MIN_SUPPORTED_VERSION = Gem::Version.new(RubyNext::NEXT_VERSION)
8
+ SYNTAX_PROBE = "data = {x:}"
9
+ MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
10
+
11
+ def on_pair(node)
12
+ return super(node) unless node.children[0].loc.last_column == node.children[1].loc.last_column
10
13
 
11
- def on_ipair(node)
12
14
  context.track! self
13
15
 
14
- ident, = *node.children
16
+ _, ident, = *node.children
15
17
 
16
18
  key = key_from_ident(ident)
17
19
 
@@ -15,6 +15,18 @@ module RubyNext
15
15
 
16
16
  class Base < ::Parser::TreeRewriter
17
17
  class LocalsTracker
18
+ using(Module.new do
19
+ refine ::Parser::AST::Node do
20
+ def to_index
21
+ children&.first || type
22
+ end
23
+ end
24
+
25
+ refine ::Object do
26
+ alias to_index itself
27
+ end
28
+ end)
29
+
18
30
  attr_reader :stacks
19
31
 
20
32
  def initialize
@@ -29,7 +41,7 @@ module RubyNext
29
41
  def [](name, suffix = nil)
30
42
  fetch(name).then do |name|
31
43
  next name unless suffix
32
- :"#{name}#{suffix}__"
44
+ :"#{name}#{suffix.to_index}__"
33
45
  end
34
46
  end
35
47
 
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyNext
4
+ module Language
5
+ module Rewriters
6
+ using RubyNext
7
+
8
+ # Separate pattern matching rewriter for Ruby <3.2 to
9
+ # transpile patterns with variable (instance, class, global) binding
10
+ class BindVarsPattern < PatternMatching
11
+ NAME = "pattern-matching-find-pattern"
12
+ SYNTAX_PROBE = "case 0; in @a; true; else; 1; end"
13
+ MIN_SUPPORTED_VERSION = Gem::Version.new(RubyNext::NEXT_VERSION)
14
+
15
+ def on_case_match(node)
16
+ @has_vars_pattern = false
17
+ process_regular_node(node).then do |new_node|
18
+ return new_node unless has_vars_pattern
19
+ super(node)
20
+ end
21
+ end
22
+
23
+ def on_match_pattern(node)
24
+ @has_vars_pattern = false
25
+ process_regular_node(node).then do |new_node|
26
+ return new_node unless has_vars_pattern
27
+ super(node)
28
+ end
29
+ end
30
+
31
+ def on_match_pattern_p(node)
32
+ @has_vars_pattern = false
33
+ process_regular_node(node).then do |new_node|
34
+ return new_node unless has_vars_pattern
35
+ super(node)
36
+ end
37
+ end
38
+
39
+ def on_match_var(node)
40
+ @has_vars_pattern = true if node.children[0].is_a?(::Parser::AST::Node)
41
+ super(node)
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :has_vars_pattern
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Load experimental, proposed etc. Ruby features
4
+
5
+ require "ruby-next/language/rewriters/proposed/method_reference"
6
+ RubyNext::Language.rewriters << RubyNext::Language::Rewriters::MethodReference
7
+
8
+ require "ruby-next/language/rewriters/proposed/bind_vars_pattern"
9
+ RubyNext::Language.rewriters << RubyNext::Language::Rewriters::BindVarsPattern
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Load rewriters only required for runtime transpiling
4
-
5
- require "ruby-next/language/rewriters/runtime/dir"
4
+ require "ruby-next/language/rewriters/2.4/dir"
6
5
  RubyNext::Language.rewriters << RubyNext::Language::Rewriters::Dir
@@ -174,54 +174,72 @@ module RubyNext
174
174
 
175
175
  require "ruby-next/language/rewriters/base"
176
176
 
177
- require "ruby-next/language/rewriters/squiggly_heredoc"
177
+ require "ruby-next/language/rewriters/2.1/numeric_literals"
178
+ rewriters << Rewriters::NumericLiterals
179
+
180
+ require "ruby-next/language/rewriters/2.1/required_kwargs"
181
+ rewriters << Rewriters::RequiredKwargs
182
+
183
+ require "ruby-next/language/rewriters/2.3/squiggly_heredoc"
178
184
  rewriters << Rewriters::SquigglyHeredoc
179
185
 
180
- require "ruby-next/language/rewriters/safe_navigation"
186
+ require "ruby-next/language/rewriters/2.3/safe_navigation"
181
187
  rewriters << Rewriters::SafeNavigation
182
188
 
183
- require "ruby-next/language/rewriters/numeric_literals"
184
- rewriters << Rewriters::NumericLiterals
189
+ require "ruby-next/language/rewriters/2.7/args_forward"
190
+ rewriters << Rewriters::ArgsForward
185
191
 
186
- require "ruby-next/language/rewriters/required_kwargs"
187
- rewriters << Rewriters::RequiredKwargs
192
+ require "ruby-next/language/rewriters/2.7/numbered_params"
193
+ rewriters << Rewriters::NumberedParams
188
194
 
189
- require "ruby-next/language/rewriters/args_forward"
190
- rewriters << Rewriters::ArgsForward
195
+ require "ruby-next/language/rewriters/2.7/pattern_matching"
196
+ rewriters << Rewriters::PatternMatching
191
197
 
192
198
  # Must be added after general args forward rewriter to become
193
199
  # no-op in Ruby <2.7
194
- require "ruby-next/language/rewriters/args_forward_leading"
200
+ require "ruby-next/language/rewriters/3.0/args_forward_leading"
195
201
  rewriters << Rewriters::ArgsForwardLeading
196
202
 
197
- require "ruby-next/language/rewriters/numbered_params"
198
- rewriters << Rewriters::NumberedParams
199
-
200
- require "ruby-next/language/rewriters/pattern_matching"
201
- rewriters << Rewriters::PatternMatching
202
-
203
203
  # Must be added after general pattern matching rewriter to become
204
204
  # no-op in Ruby <2.7
205
- require "ruby-next/language/rewriters/find_pattern"
205
+ require "ruby-next/language/rewriters/3.0/find_pattern"
206
206
  rewriters << Rewriters::FindPattern
207
207
 
208
- require "ruby-next/language/rewriters/in_pattern"
208
+ require "ruby-next/language/rewriters/3.0/in_pattern"
209
209
  rewriters << Rewriters::InPattern
210
210
 
211
+ require "ruby-next/language/rewriters/3.0/endless_method"
212
+ RubyNext::Language.rewriters << RubyNext::Language::Rewriters::EndlessMethod
213
+
214
+ require "ruby-next/language/rewriters/3.1/oneline_pattern_parensless"
215
+ rewriters << Rewriters::OnelinePatternParensless
216
+
217
+ require "ruby-next/language/rewriters/3.1/pin_vars_pattern"
218
+ rewriters << Rewriters::PinVarsPattern
219
+
220
+ require "ruby-next/language/rewriters/3.1/anonymous_block"
221
+ rewriters << Rewriters::AnonymousBlock
222
+
223
+ require "ruby-next/language/rewriters/3.1/refinement_import_methods"
224
+ rewriters << Rewriters::RefinementImportMethods
225
+
226
+ require "ruby-next/language/rewriters/3.1/endless_method_command"
227
+ rewriters << Rewriters::EndlessMethodCommand
228
+
229
+ require "ruby-next/language/rewriters/3.1/shorthand_hash"
230
+ rewriters << RubyNext::Language::Rewriters::ShorthandHash
231
+
211
232
  # Put endless range in the end, 'cause Parser fails to parse it in
212
233
  # pattern matching
213
- require "ruby-next/language/rewriters/endless_range"
234
+ require "ruby-next/language/rewriters/2.6/endless_range"
214
235
  rewriters << Rewriters::EndlessRange
215
236
 
216
- require "ruby-next/language/rewriters/endless_method"
217
- RubyNext::Language.rewriters << RubyNext::Language::Rewriters::EndlessMethod
218
-
219
237
  if ENV["RUBY_NEXT_EDGE"] == "1"
220
- require "ruby-next/language/edge"
238
+ require "ruby-next/language/rewriters/edge"
221
239
  end
222
240
 
223
241
  if ENV["RUBY_NEXT_PROPOSED"] == "1"
224
- require "ruby-next/language/proposed"
242
+ require "ruby-next/language/rewriters/proposed"
225
243
  end
226
244
  end
227
245
  end
@@ -79,10 +79,6 @@ module RuboCop
79
79
  trigger_responding_cops(:on_meth_ref, node)
80
80
  end
81
81
 
82
- def on_ipair(node)
83
- trigger_responding_cops(:on_ipair, node)
84
- end
85
-
86
82
  unless method_defined?(:on_numblock)
87
83
  def on_numblock(node)
88
84
  children = node.children
@@ -108,6 +104,21 @@ module RuboCop
108
104
  end
109
105
  end
110
106
 
107
+ Commissioner.prepend(Module.new do
108
+ # Ignore anonymous blocks
109
+ def on_block_pass(node)
110
+ return if node.children == [nil]
111
+
112
+ super
113
+ end
114
+
115
+ def on_blockarg(node)
116
+ return if node.children == [nil]
117
+
118
+ super
119
+ end
120
+ end)
121
+
111
122
  module Layout
112
123
  require "rubocop/cop/layout/assignment_indentation"
113
124
 
@@ -147,6 +158,15 @@ module RuboCop
147
158
  node.loc.expression.line
148
159
  end
149
160
  end)
161
+
162
+ require "rubocop/cop/layout/space_after_colon"
163
+ SpaceAfterColon.prepend(Module.new do
164
+ def on_pair(node)
165
+ return if node.children[0].loc.last_column == node.children[1].loc.last_column
166
+
167
+ super(node)
168
+ end
169
+ end)
150
170
  end
151
171
 
152
172
  module Style
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyNext
4
- VERSION = "0.13.1"
4
+ VERSION = "0.14.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-next-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-27 00:00:00.000000000 Z
11
+ date: 2022-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-next-parser
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0.3
19
+ version: 3.1.1.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.0.3
26
+ version: 3.1.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: unparser
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -61,11 +61,13 @@ files:
61
61
  - lib/.rbnext/2.3/ruby-next/commands/core_ext.rb
62
62
  - lib/.rbnext/2.3/ruby-next/commands/nextify.rb
63
63
  - lib/.rbnext/2.3/ruby-next/language/eval.rb
64
+ - lib/.rbnext/2.3/ruby-next/language/rewriters/2.6/endless_range.rb
65
+ - lib/.rbnext/2.3/ruby-next/language/rewriters/2.7/pattern_matching.rb
66
+ - lib/.rbnext/2.3/ruby-next/language/rewriters/3.1/anonymous_block.rb
64
67
  - lib/.rbnext/2.3/ruby-next/language/rewriters/base.rb
65
- - lib/.rbnext/2.3/ruby-next/language/rewriters/endless_range.rb
66
- - lib/.rbnext/2.3/ruby-next/language/rewriters/pattern_matching.rb
67
68
  - lib/.rbnext/2.3/ruby-next/utils.rb
68
69
  - lib/.rbnext/2.7/ruby-next/core.rb
70
+ - lib/.rbnext/2.7/ruby-next/language/rewriters/2.7/pattern_matching.rb
69
71
  - lib/ruby-next.rb
70
72
  - lib/ruby-next/cli.rb
71
73
  - lib/ruby-next/commands/base.rb
@@ -78,6 +80,7 @@ files:
78
80
  - lib/ruby-next/core/array/intersect.rb
79
81
  - lib/ruby-next/core/constants/frozen_error.rb
80
82
  - lib/ruby-next/core/constants/no_matching_pattern_error.rb
83
+ - lib/ruby-next/core/enumerable/compact.rb
81
84
  - lib/ruby-next/core/enumerable/filter.rb
82
85
  - lib/ruby-next/core/enumerable/filter_map.rb
83
86
  - lib/ruby-next/core/enumerable/tally.rb
@@ -85,8 +88,11 @@ files:
85
88
  - lib/ruby-next/core/hash/deconstruct_keys.rb
86
89
  - lib/ruby-next/core/hash/except.rb
87
90
  - lib/ruby-next/core/hash/merge.rb
91
+ - lib/ruby-next/core/integer/try_convert.rb
88
92
  - lib/ruby-next/core/kernel/then.rb
93
+ - lib/ruby-next/core/matchdata/match.rb
89
94
  - lib/ruby-next/core/proc/compose.rb
95
+ - lib/ruby-next/core/refinement/import.rb
90
96
  - lib/ruby-next/core/runtime.rb
91
97
  - lib/ruby-next/core/string/split.rb
92
98
  - lib/ruby-next/core/struct/deconstruct.rb
@@ -99,27 +105,33 @@ files:
99
105
  - lib/ruby-next/core_ext.rb
100
106
  - lib/ruby-next/language.rb
101
107
  - lib/ruby-next/language/bootsnap.rb
102
- - lib/ruby-next/language/edge.rb
103
108
  - lib/ruby-next/language/eval.rb
104
109
  - lib/ruby-next/language/parser.rb
105
- - lib/ruby-next/language/proposed.rb
106
- - lib/ruby-next/language/rewriters/args_forward.rb
107
- - lib/ruby-next/language/rewriters/args_forward_leading.rb
110
+ - lib/ruby-next/language/rewriters/2.1/numeric_literals.rb
111
+ - lib/ruby-next/language/rewriters/2.1/required_kwargs.rb
112
+ - lib/ruby-next/language/rewriters/2.3/safe_navigation.rb
113
+ - lib/ruby-next/language/rewriters/2.3/squiggly_heredoc.rb
114
+ - lib/ruby-next/language/rewriters/2.4/dir.rb
115
+ - lib/ruby-next/language/rewriters/2.6/endless_range.rb
116
+ - lib/ruby-next/language/rewriters/2.7/args_forward.rb
117
+ - lib/ruby-next/language/rewriters/2.7/numbered_params.rb
118
+ - lib/ruby-next/language/rewriters/2.7/pattern_matching.rb
119
+ - lib/ruby-next/language/rewriters/3.0/args_forward_leading.rb
120
+ - lib/ruby-next/language/rewriters/3.0/endless_method.rb
121
+ - lib/ruby-next/language/rewriters/3.0/find_pattern.rb
122
+ - lib/ruby-next/language/rewriters/3.0/in_pattern.rb
123
+ - lib/ruby-next/language/rewriters/3.1/anonymous_block.rb
124
+ - lib/ruby-next/language/rewriters/3.1/endless_method_command.rb
125
+ - lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb
126
+ - lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb
127
+ - lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb
128
+ - lib/ruby-next/language/rewriters/3.1/shorthand_hash.rb
108
129
  - lib/ruby-next/language/rewriters/base.rb
109
- - lib/ruby-next/language/rewriters/endless_method.rb
110
- - lib/ruby-next/language/rewriters/endless_range.rb
111
- - lib/ruby-next/language/rewriters/find_pattern.rb
112
- - lib/ruby-next/language/rewriters/in_pattern.rb
113
- - lib/ruby-next/language/rewriters/method_reference.rb
114
- - lib/ruby-next/language/rewriters/numbered_params.rb
115
- - lib/ruby-next/language/rewriters/numeric_literals.rb
116
- - lib/ruby-next/language/rewriters/pattern_matching.rb
117
- - lib/ruby-next/language/rewriters/required_kwargs.rb
130
+ - lib/ruby-next/language/rewriters/edge.rb
131
+ - lib/ruby-next/language/rewriters/proposed.rb
132
+ - lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb
133
+ - lib/ruby-next/language/rewriters/proposed/method_reference.rb
118
134
  - lib/ruby-next/language/rewriters/runtime.rb
119
- - lib/ruby-next/language/rewriters/runtime/dir.rb
120
- - lib/ruby-next/language/rewriters/safe_navigation.rb
121
- - lib/ruby-next/language/rewriters/shorthand_hash.rb
122
- - lib/ruby-next/language/rewriters/squiggly_heredoc.rb
123
135
  - lib/ruby-next/language/runtime.rb
124
136
  - lib/ruby-next/language/setup.rb
125
137
  - lib/ruby-next/language/unparser.rb
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Load experimental, proposed etc. Ruby features
4
-
5
- require "ruby-next/language/rewriters/method_reference"
6
- RubyNext::Language.rewriters << RubyNext::Language::Rewriters::MethodReference
7
-
8
- require "ruby-next/language/rewriters/shorthand_hash"
9
- RubyNext::Language.rewriters << RubyNext::Language::Rewriters::ShorthandHash
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "ruby-next/language/rewriters/pattern_matching"
4
-
5
- module RubyNext
6
- module Language
7
- module Rewriters
8
- using RubyNext
9
-
10
- # Separate pattern matching rewriter for Ruby 2.7 to
11
- # transpile only `in` patterns
12
- class InPattern < PatternMatching
13
- NAME = "pattern-matching-in"
14
- SYNTAX_PROBE = "1 in 2"
15
- MIN_SUPPORTED_VERSION = Gem::Version.new("3.0.0")
16
-
17
- # Make case-match no-op
18
- def on_case_match(node)
19
- node
20
- end
21
-
22
- def on_match_pattern_p(node)
23
- context.track! self
24
-
25
- @deconstructed_keys = {}
26
- @predicates = Predicates::Noop.new
27
-
28
- matchee =
29
- s(:begin, s(:lvasgn, MATCHEE, node.children[0]))
30
-
31
- pattern =
32
- locals.with(
33
- matchee: MATCHEE,
34
- arr: MATCHEE_ARR,
35
- hash: MATCHEE_HASH
36
- ) do
37
- send(
38
- :"#{node.children[1].type}_clause",
39
- node.children[1]
40
- )
41
- end
42
-
43
- node.updated(
44
- :and,
45
- [
46
- matchee,
47
- pattern
48
- ]
49
- ).tap do |new_node|
50
- replace(node.loc.expression, inline_blocks(unparse(new_node)))
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end