ruby-next-core 0.13.3 → 0.15.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -0
  3. data/README.md +65 -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 +44 -23
  7. data/lib/.rbnext/2.3/ruby-next/commands/nextify.rb +15 -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 +14 -2
  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 +15 -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/irb.rb +24 -0
  23. data/lib/ruby-next/language/eval.rb +1 -0
  24. data/lib/ruby-next/language/rewriters/{numeric_literals.rb → 2.1/numeric_literals.rb} +0 -0
  25. data/lib/ruby-next/language/rewriters/{required_kwargs.rb → 2.1/required_kwargs.rb} +0 -0
  26. data/lib/ruby-next/language/rewriters/{safe_navigation.rb → 2.3/safe_navigation.rb} +0 -0
  27. data/lib/ruby-next/language/rewriters/{squiggly_heredoc.rb → 2.3/squiggly_heredoc.rb} +0 -0
  28. data/lib/ruby-next/language/rewriters/{runtime → 2.4}/dir.rb +0 -0
  29. data/lib/ruby-next/language/rewriters/2.5/rescue_within_block.rb +39 -0
  30. data/lib/ruby-next/language/rewriters/{endless_range.rb → 2.6/endless_range.rb} +0 -0
  31. data/lib/ruby-next/language/rewriters/{args_forward.rb → 2.7/args_forward.rb} +0 -0
  32. data/lib/ruby-next/language/rewriters/{numbered_params.rb → 2.7/numbered_params.rb} +0 -0
  33. data/lib/ruby-next/language/rewriters/{pattern_matching.rb → 2.7/pattern_matching.rb} +121 -34
  34. data/lib/ruby-next/language/rewriters/{args_forward_leading.rb → 3.0/args_forward_leading.rb} +0 -0
  35. data/lib/ruby-next/language/rewriters/{endless_method.rb → 3.0/endless_method.rb} +15 -12
  36. data/lib/ruby-next/language/rewriters/{find_pattern.rb → 3.0/find_pattern.rb} +1 -3
  37. data/lib/ruby-next/language/rewriters/3.0/in_pattern.rb +22 -0
  38. data/lib/ruby-next/language/rewriters/3.1/anonymous_block.rb +68 -0
  39. data/lib/ruby-next/language/rewriters/3.1/endless_method_command.rb +46 -0
  40. data/lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb +41 -0
  41. data/lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb +50 -0
  42. data/lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb +60 -0
  43. data/lib/ruby-next/language/rewriters/{shorthand_hash.rb → 3.1/shorthand_hash.rb} +6 -4
  44. data/lib/ruby-next/language/rewriters/base.rb +14 -2
  45. data/lib/ruby-next/language/{edge.rb → rewriters/edge.rb} +0 -0
  46. data/lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb +50 -0
  47. data/lib/ruby-next/language/rewriters/{method_reference.rb → proposed/method_reference.rb} +0 -0
  48. data/lib/ruby-next/language/rewriters/proposed.rb +9 -0
  49. data/lib/ruby-next/language/rewriters/runtime.rb +1 -2
  50. data/lib/ruby-next/language/setup.rb +1 -1
  51. data/lib/ruby-next/language.rb +44 -23
  52. data/lib/ruby-next/pry.rb +90 -0
  53. data/lib/ruby-next/rubocop.rb +24 -4
  54. data/lib/ruby-next/version.rb +1 -1
  55. data/lib/uby-next/irb.rb +3 -0
  56. data/lib/uby-next/pry.rb +3 -0
  57. metadata +40 -43
  58. data/lib/ruby-next/language/proposed.rb +0 -9
  59. data/lib/ruby-next/language/rewriters/in_pattern.rb +0 -56
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyNext
4
+ module Language
5
+ module Rewriters
6
+ class AnonymousBlock < Base
7
+ NAME = "anonymous-block"
8
+ SYNTAX_PROBE = "obj = Object.new; def obj.foo(&) bar(&); end"
9
+ MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
10
+
11
+ BLOCK = :__block__
12
+
13
+ def on_args(node)
14
+ block = node.children.last
15
+
16
+ return super unless block&.type == :blockarg
17
+ return super unless block.children.first.nil?
18
+
19
+ context.track! self
20
+
21
+ replace(block.loc.expression, "&#{BLOCK}")
22
+
23
+ node.updated(
24
+ :args,
25
+ [
26
+ *node.children.slice(0, node.children.index(block)),
27
+ s(:blockarg, BLOCK)
28
+ ]
29
+ )
30
+ end
31
+
32
+ def on_send(node)
33
+ block = extract_block_pass(node)
34
+ return super unless block&.children == [nil]
35
+
36
+ process_block(node, block)
37
+ end
38
+
39
+ def on_super(node)
40
+ block = extract_block_pass(node)
41
+ return super unless block&.children == [nil]
42
+
43
+ process_block(node, block)
44
+ end
45
+
46
+ private
47
+
48
+ def extract_block_pass(node)
49
+ node.children.find { |child| child.is_a?(::Parser::AST::Node) && child.type == :block_pass }
50
+ end
51
+
52
+ def process_block(node, block)
53
+ replace(block.loc.expression, "&#{BLOCK}")
54
+
55
+ process(
56
+ node.updated(
57
+ nil,
58
+ [
59
+ *node.children.take(node.children.index(block)),
60
+ s(:block_pass, s(:lvar, BLOCK))
61
+ ]
62
+ )
63
+ )
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyNext
4
+ module Language
5
+ module Rewriters
6
+ class EndlessMethodCommand < EndlessMethod
7
+ NAME = "endless-method-command"
8
+ SYNTAX_PROBE = "obj = Object.new; def obj.foo = puts 'Hello'"
9
+ MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
10
+
11
+ def process_def(node)
12
+ return node unless command?(node)
13
+
14
+ super(node)
15
+ end
16
+
17
+ def process_defs(node)
18
+ return node unless command?(node)
19
+
20
+ super(node)
21
+ end
22
+
23
+ private
24
+
25
+ def command?(node)
26
+ buffer = ::Parser::Source::Buffer.new("(endless-method-rewriter)").tap do |buffer|
27
+ buffer.source = node.loc.expression.source
28
+ end
29
+
30
+ parser30.parse(buffer)
31
+ false
32
+ rescue ::Parser::SyntaxError
33
+ true
34
+ end
35
+
36
+ def parser30
37
+ require "parser/ruby30" unless defined?(::Parser::Ruby30)
38
+
39
+ ::Parser::Ruby30.new(Language::Builder.new).tap do |prs|
40
+ prs.diagnostics.all_errors_are_fatal = true
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -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
 
@@ -54,7 +66,7 @@ module RubyNext
54
66
  end
55
67
 
56
68
  class << self
57
- # Returns true if the syntax is supported
69
+ # Returns true if the syntax is not supported
58
70
  # by the current Ruby (performs syntax check, not version check)
59
71
  def unsupported_syntax?
60
72
  save_verbose, $VERBOSE = $VERBOSE, nil
@@ -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
@@ -12,7 +12,7 @@ module RubyNext
12
12
  return if File.directory?(target_dir)
13
13
 
14
14
  Dir.chdir(root_dir) do
15
- unless system("bundle exec ruby-next nextify ./#{lib_dir} -o #{target_dir} > /dev/null 2>&1")
15
+ unless system("bundle exec ruby-next nextify ./#{lib_dir} -o #{target_dir} --min-version=#{RUBY_VERSION} > /dev/null 2>&1")
16
16
  RubyNext.warn "Traspiled files are missing in: #{target_dir}. \n" \
17
17
  "Make sure you have gem 'ruby-next' in your Gemfile to auto-transpile the required files from source on load. " \
18
18
  "Otherwise the code from #{root_dir} may not work correctly."
@@ -174,54 +174,75 @@ 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
185
-
186
- require "ruby-next/language/rewriters/required_kwargs"
187
- rewriters << Rewriters::RequiredKwargs
189
+ require "ruby-next/language/rewriters/2.5/rescue_within_block"
190
+ rewriters << Rewriters::RescueWithinBlock
188
191
 
189
- require "ruby-next/language/rewriters/args_forward"
192
+ require "ruby-next/language/rewriters/2.7/args_forward"
190
193
  rewriters << Rewriters::ArgsForward
191
194
 
192
- # Must be added after general args forward rewriter to become
193
- # no-op in Ruby <2.7
194
- require "ruby-next/language/rewriters/args_forward_leading"
195
- rewriters << Rewriters::ArgsForwardLeading
196
-
197
- require "ruby-next/language/rewriters/numbered_params"
195
+ require "ruby-next/language/rewriters/2.7/numbered_params"
198
196
  rewriters << Rewriters::NumberedParams
199
197
 
200
- require "ruby-next/language/rewriters/pattern_matching"
198
+ require "ruby-next/language/rewriters/2.7/pattern_matching"
201
199
  rewriters << Rewriters::PatternMatching
202
200
 
201
+ # Must be added after general args forward rewriter to become
202
+ # no-op in Ruby <2.7
203
+ require "ruby-next/language/rewriters/3.0/args_forward_leading"
204
+ rewriters << Rewriters::ArgsForwardLeading
205
+
203
206
  # Must be added after general pattern matching rewriter to become
204
207
  # no-op in Ruby <2.7
205
- require "ruby-next/language/rewriters/find_pattern"
208
+ require "ruby-next/language/rewriters/3.0/find_pattern"
206
209
  rewriters << Rewriters::FindPattern
207
210
 
208
- require "ruby-next/language/rewriters/in_pattern"
211
+ require "ruby-next/language/rewriters/3.0/in_pattern"
209
212
  rewriters << Rewriters::InPattern
210
213
 
214
+ require "ruby-next/language/rewriters/3.0/endless_method"
215
+ RubyNext::Language.rewriters << RubyNext::Language::Rewriters::EndlessMethod
216
+
217
+ require "ruby-next/language/rewriters/3.1/oneline_pattern_parensless"
218
+ rewriters << Rewriters::OnelinePatternParensless
219
+
220
+ require "ruby-next/language/rewriters/3.1/pin_vars_pattern"
221
+ rewriters << Rewriters::PinVarsPattern
222
+
223
+ require "ruby-next/language/rewriters/3.1/anonymous_block"
224
+ rewriters << Rewriters::AnonymousBlock
225
+
226
+ require "ruby-next/language/rewriters/3.1/refinement_import_methods"
227
+ rewriters << Rewriters::RefinementImportMethods
228
+
229
+ require "ruby-next/language/rewriters/3.1/endless_method_command"
230
+ rewriters << Rewriters::EndlessMethodCommand
231
+
232
+ require "ruby-next/language/rewriters/3.1/shorthand_hash"
233
+ rewriters << RubyNext::Language::Rewriters::ShorthandHash
234
+
211
235
  # Put endless range in the end, 'cause Parser fails to parse it in
212
236
  # pattern matching
213
- require "ruby-next/language/rewriters/endless_range"
237
+ require "ruby-next/language/rewriters/2.6/endless_range"
214
238
  rewriters << Rewriters::EndlessRange
215
239
 
216
- require "ruby-next/language/rewriters/endless_method"
217
- RubyNext::Language.rewriters << RubyNext::Language::Rewriters::EndlessMethod
218
-
219
240
  if ENV["RUBY_NEXT_EDGE"] == "1"
220
- require "ruby-next/language/edge"
241
+ require "ruby-next/language/rewriters/edge"
221
242
  end
222
243
 
223
244
  if ENV["RUBY_NEXT_PROPOSED"] == "1"
224
- require "ruby-next/language/proposed"
245
+ require "ruby-next/language/rewriters/proposed"
225
246
  end
226
247
  end
227
248
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file contains patches for Pry integration.
4
+ # It's supposed to be required inside .pryrc files.
5
+
6
+ require "ruby-next/language/setup"
7
+ require "ruby-next/language/runtime"
8
+
9
+ # Enables refinements by injecting "using RubyNext"
10
+ # before Pry copies and memorizes the TOPLEVEL_BINDING.
11
+ Pry.singleton_class.prepend(Module.new do
12
+ def toplevel_binding
13
+ unless defined?(@_using_injected) && @_using_injected
14
+ orig_binding = super
15
+
16
+ # Copy TOPLEVEL_BINDING without local variables.
17
+ TOPLEVEL_BINDING.eval <<-RUBY
18
+ using RubyNext
19
+
20
+ def self.__pry__
21
+ binding
22
+ end
23
+
24
+ Pry.toplevel_binding = __pry__
25
+
26
+ class << self; undef __pry__; end
27
+ RUBY
28
+
29
+ # Inject local variables from the original binding.
30
+ orig_binding.local_variables.each do |var|
31
+ value = orig_binding.local_variable_get(var)
32
+ @toplevel_binding.local_variable_set(var, value)
33
+ end
34
+
35
+ @_using_injected = true
36
+ end
37
+
38
+ super
39
+ end
40
+ end)
41
+
42
+ # Enables edge Ruby syntax by transpiling the code
43
+ # before it's evaluated in the context of a binding.
44
+ Pry.prepend(Module.new do
45
+ def current_binding
46
+ super.tap do |obj|
47
+ next if obj.respond_to?(:__nextified__)
48
+
49
+ obj.instance_eval do
50
+ def eval(code, *args)
51
+ new_code = ::RubyNext::Language::Runtime.transform(code, using: false)
52
+
53
+ super(new_code, *args)
54
+ end
55
+
56
+ def __nextified__
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end)
62
+
63
+ # Enables edge Ruby syntax for multi-line input.
64
+ Pry::Code.singleton_class.prepend(Module.new do
65
+ def complete_expression?(str)
66
+ silence_stderr do
67
+ ::Parser::RubyNext.parse(str)
68
+ end
69
+
70
+ true
71
+ rescue Parser::SyntaxError => ex
72
+ case ex.message
73
+ when /unexpected token \$end/
74
+ false
75
+ else
76
+ true
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def silence_stderr
83
+ stderr = StringIO.new
84
+ orig_stderr, $stderr = $stderr, stderr
85
+
86
+ yield
87
+
88
+ $stderr = orig_stderr
89
+ end
90
+ 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.3"
4
+ VERSION = "0.15.0"
5
5
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ruby-next/irb"
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ruby-next/pry"