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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -0
- data/README.md +65 -5
- data/bin/transform +5 -1
- data/lib/.rbnext/2.1/ruby-next/core.rb +7 -1
- data/lib/.rbnext/2.1/ruby-next/language.rb +44 -23
- data/lib/.rbnext/2.3/ruby-next/commands/nextify.rb +15 -2
- data/lib/.rbnext/2.3/ruby-next/language/eval.rb +1 -0
- data/lib/.rbnext/2.3/ruby-next/language/rewriters/{endless_range.rb → 2.6/endless_range.rb} +0 -0
- data/lib/.rbnext/2.3/ruby-next/language/rewriters/{pattern_matching.rb → 2.7/pattern_matching.rb} +121 -34
- data/lib/.rbnext/2.3/ruby-next/language/rewriters/3.1/anonymous_block.rb +68 -0
- data/lib/.rbnext/2.3/ruby-next/language/rewriters/base.rb +14 -2
- data/lib/.rbnext/2.7/ruby-next/core.rb +7 -1
- data/lib/.rbnext/2.7/ruby-next/language/rewriters/2.7/pattern_matching.rb +1061 -0
- data/lib/ruby-next/commands/nextify.rb +15 -2
- data/lib/ruby-next/config.rb +2 -2
- data/lib/ruby-next/core/enumerable/compact.rb +22 -0
- data/lib/ruby-next/core/integer/try_convert.rb +16 -0
- data/lib/ruby-next/core/matchdata/match.rb +9 -0
- data/lib/ruby-next/core/refinement/import.rb +60 -0
- data/lib/ruby-next/core.rb +7 -1
- data/lib/ruby-next/irb.rb +24 -0
- data/lib/ruby-next/language/eval.rb +1 -0
- data/lib/ruby-next/language/rewriters/{numeric_literals.rb → 2.1/numeric_literals.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{required_kwargs.rb → 2.1/required_kwargs.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{safe_navigation.rb → 2.3/safe_navigation.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{squiggly_heredoc.rb → 2.3/squiggly_heredoc.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{runtime → 2.4}/dir.rb +0 -0
- data/lib/ruby-next/language/rewriters/2.5/rescue_within_block.rb +39 -0
- data/lib/ruby-next/language/rewriters/{endless_range.rb → 2.6/endless_range.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{args_forward.rb → 2.7/args_forward.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{numbered_params.rb → 2.7/numbered_params.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{pattern_matching.rb → 2.7/pattern_matching.rb} +121 -34
- data/lib/ruby-next/language/rewriters/{args_forward_leading.rb → 3.0/args_forward_leading.rb} +0 -0
- data/lib/ruby-next/language/rewriters/{endless_method.rb → 3.0/endless_method.rb} +15 -12
- data/lib/ruby-next/language/rewriters/{find_pattern.rb → 3.0/find_pattern.rb} +1 -3
- data/lib/ruby-next/language/rewriters/3.0/in_pattern.rb +22 -0
- data/lib/ruby-next/language/rewriters/3.1/anonymous_block.rb +68 -0
- data/lib/ruby-next/language/rewriters/3.1/endless_method_command.rb +46 -0
- data/lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb +41 -0
- data/lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb +50 -0
- data/lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb +60 -0
- data/lib/ruby-next/language/rewriters/{shorthand_hash.rb → 3.1/shorthand_hash.rb} +6 -4
- data/lib/ruby-next/language/rewriters/base.rb +14 -2
- data/lib/ruby-next/language/{edge.rb → rewriters/edge.rb} +0 -0
- data/lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb +50 -0
- data/lib/ruby-next/language/rewriters/{method_reference.rb → proposed/method_reference.rb} +0 -0
- data/lib/ruby-next/language/rewriters/proposed.rb +9 -0
- data/lib/ruby-next/language/rewriters/runtime.rb +1 -2
- data/lib/ruby-next/language/setup.rb +1 -1
- data/lib/ruby-next/language.rb +44 -23
- data/lib/ruby-next/pry.rb +90 -0
- data/lib/ruby-next/rubocop.rb +24 -4
- data/lib/ruby-next/version.rb +1 -1
- data/lib/uby-next/irb.rb +3 -0
- data/lib/uby-next/pry.rb +3 -0
- metadata +40 -43
- data/lib/ruby-next/language/proposed.rb +0 -9
- 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(
|
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
|
File without changes
|
@@ -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
|
File without changes
|
@@ -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
|
@@ -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."
|
data/lib/ruby-next/language.rb
CHANGED
@@ -174,54 +174,75 @@ module RubyNext
|
|
174
174
|
|
175
175
|
require "ruby-next/language/rewriters/base"
|
176
176
|
|
177
|
-
require "ruby-next/language/rewriters/
|
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/
|
184
|
-
rewriters << Rewriters::
|
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
|
-
|
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)
|
data/lib/ruby-next/rubocop.rb
CHANGED
@@ -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
|
data/lib/ruby-next/version.rb
CHANGED
data/lib/uby-next/irb.rb
ADDED
data/lib/uby-next/pry.rb
ADDED