ruby-next-core 0.13.0 → 0.14.0

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.
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} +53 -7
  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/ruby-next/commands/nextify.rb +2 -2
  15. data/lib/ruby-next/config.rb +2 -2
  16. data/lib/ruby-next/core/enumerable/compact.rb +22 -0
  17. data/lib/ruby-next/core/integer/try_convert.rb +16 -0
  18. data/lib/ruby-next/core/matchdata/match.rb +9 -0
  19. data/lib/ruby-next/core/refinement/import.rb +60 -0
  20. data/lib/ruby-next/core.rb +7 -1
  21. data/lib/ruby-next/language/eval.rb +1 -0
  22. data/lib/ruby-next/language/rewriters/{numeric_literals.rb → 2.1/numeric_literals.rb} +0 -0
  23. data/lib/ruby-next/language/rewriters/{required_kwargs.rb → 2.1/required_kwargs.rb} +0 -0
  24. data/lib/ruby-next/language/rewriters/{safe_navigation.rb → 2.3/safe_navigation.rb} +0 -0
  25. data/lib/ruby-next/language/rewriters/{squiggly_heredoc.rb → 2.3/squiggly_heredoc.rb} +0 -0
  26. data/lib/ruby-next/language/rewriters/{runtime → 2.4}/dir.rb +0 -0
  27. data/lib/ruby-next/language/rewriters/{endless_range.rb → 2.6/endless_range.rb} +0 -0
  28. data/lib/ruby-next/language/rewriters/{args_forward.rb → 2.7/args_forward.rb} +0 -0
  29. data/lib/ruby-next/language/rewriters/{numbered_params.rb → 2.7/numbered_params.rb} +0 -0
  30. data/lib/ruby-next/language/rewriters/{pattern_matching.rb → 2.7/pattern_matching.rb} +53 -7
  31. data/lib/ruby-next/language/rewriters/{args_forward_leading.rb → 3.0/args_forward_leading.rb} +0 -0
  32. data/lib/ruby-next/language/rewriters/{endless_method.rb → 3.0/endless_method.rb} +15 -12
  33. data/lib/ruby-next/language/rewriters/{find_pattern.rb → 3.0/find_pattern.rb} +1 -3
  34. data/lib/ruby-next/language/rewriters/3.0/in_pattern.rb +22 -0
  35. data/lib/ruby-next/language/rewriters/3.1/anonymous_block.rb +68 -0
  36. data/lib/ruby-next/language/rewriters/3.1/endless_method_command.rb +46 -0
  37. data/lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb +41 -0
  38. data/lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb +50 -0
  39. data/lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb +60 -0
  40. data/lib/ruby-next/language/rewriters/{shorthand_hash.rb → 3.1/shorthand_hash.rb} +6 -4
  41. data/lib/ruby-next/language/rewriters/base.rb +13 -1
  42. data/lib/ruby-next/language/{edge.rb → rewriters/edge.rb} +0 -0
  43. data/lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb +50 -0
  44. data/lib/ruby-next/language/rewriters/{method_reference.rb → proposed/method_reference.rb} +0 -0
  45. data/lib/ruby-next/language/rewriters/proposed.rb +9 -0
  46. data/lib/ruby-next/language/rewriters/runtime.rb +1 -2
  47. data/lib/ruby-next/language/setup.rb +2 -1
  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 -24
  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,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
@@ -50,7 +50,8 @@ module RubyNext
50
50
  GemTranspiler.maybe_transpile(File.dirname(dirname), lib_dir, next_dirname) if transpile
51
51
 
52
52
  current_index = $LOAD_PATH.find_index do |load_path|
53
- Pathname.new(load_path).realpath.to_s == dirname
53
+ pn = Pathname.new(load_path)
54
+ pn.exist? && pn.realpath.to_s == dirname
54
55
  end
55
56
 
56
57
  raise "Gem's lib is not in the $LOAD_PATH: #{dirname}" if current_index.nil?
@@ -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.0"
4
+ VERSION = "0.14.0"
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.0
4
+ version: 0.14.0
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: 2021-12-29 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,9 +61,10 @@ 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
69
70
  - lib/ruby-next.rb
@@ -78,6 +79,7 @@ files:
78
79
  - lib/ruby-next/core/array/intersect.rb
79
80
  - lib/ruby-next/core/constants/frozen_error.rb
80
81
  - lib/ruby-next/core/constants/no_matching_pattern_error.rb
82
+ - lib/ruby-next/core/enumerable/compact.rb
81
83
  - lib/ruby-next/core/enumerable/filter.rb
82
84
  - lib/ruby-next/core/enumerable/filter_map.rb
83
85
  - lib/ruby-next/core/enumerable/tally.rb
@@ -85,8 +87,11 @@ files:
85
87
  - lib/ruby-next/core/hash/deconstruct_keys.rb
86
88
  - lib/ruby-next/core/hash/except.rb
87
89
  - lib/ruby-next/core/hash/merge.rb
90
+ - lib/ruby-next/core/integer/try_convert.rb
88
91
  - lib/ruby-next/core/kernel/then.rb
92
+ - lib/ruby-next/core/matchdata/match.rb
89
93
  - lib/ruby-next/core/proc/compose.rb
94
+ - lib/ruby-next/core/refinement/import.rb
90
95
  - lib/ruby-next/core/runtime.rb
91
96
  - lib/ruby-next/core/string/split.rb
92
97
  - lib/ruby-next/core/struct/deconstruct.rb
@@ -99,27 +104,33 @@ files:
99
104
  - lib/ruby-next/core_ext.rb
100
105
  - lib/ruby-next/language.rb
101
106
  - lib/ruby-next/language/bootsnap.rb
102
- - lib/ruby-next/language/edge.rb
103
107
  - lib/ruby-next/language/eval.rb
104
108
  - 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
109
+ - lib/ruby-next/language/rewriters/2.1/numeric_literals.rb
110
+ - lib/ruby-next/language/rewriters/2.1/required_kwargs.rb
111
+ - lib/ruby-next/language/rewriters/2.3/safe_navigation.rb
112
+ - lib/ruby-next/language/rewriters/2.3/squiggly_heredoc.rb
113
+ - lib/ruby-next/language/rewriters/2.4/dir.rb
114
+ - lib/ruby-next/language/rewriters/2.6/endless_range.rb
115
+ - lib/ruby-next/language/rewriters/2.7/args_forward.rb
116
+ - lib/ruby-next/language/rewriters/2.7/numbered_params.rb
117
+ - lib/ruby-next/language/rewriters/2.7/pattern_matching.rb
118
+ - lib/ruby-next/language/rewriters/3.0/args_forward_leading.rb
119
+ - lib/ruby-next/language/rewriters/3.0/endless_method.rb
120
+ - lib/ruby-next/language/rewriters/3.0/find_pattern.rb
121
+ - lib/ruby-next/language/rewriters/3.0/in_pattern.rb
122
+ - lib/ruby-next/language/rewriters/3.1/anonymous_block.rb
123
+ - lib/ruby-next/language/rewriters/3.1/endless_method_command.rb
124
+ - lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb
125
+ - lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb
126
+ - lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb
127
+ - lib/ruby-next/language/rewriters/3.1/shorthand_hash.rb
108
128
  - 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
129
+ - lib/ruby-next/language/rewriters/edge.rb
130
+ - lib/ruby-next/language/rewriters/proposed.rb
131
+ - lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb
132
+ - lib/ruby-next/language/rewriters/proposed/method_reference.rb
118
133
  - 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
134
  - lib/ruby-next/language/runtime.rb
124
135
  - lib/ruby-next/language/setup.rb
125
136
  - lib/ruby-next/language/unparser.rb
@@ -153,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
164
  - !ruby/object:Gem::Version
154
165
  version: '0'
155
166
  requirements: []
156
- rubygems_version: 3.2.15
167
+ rubygems_version: 3.2.22
157
168
  signing_key:
158
169
  specification_version: 4
159
170
  summary: Ruby Next core functionality
@@ -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