ruby-next-core 0.7.0 → 0.8.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 +12 -0
- data/README.md +16 -8
- data/bin/transform +3 -4
- data/lib/ruby-next.rb +2 -2
- data/lib/ruby-next/commands/nextify.rb +7 -1
- data/lib/ruby-next/language.rb +7 -1
- data/lib/ruby-next/language/edge.rb +6 -0
- data/lib/ruby-next/language/rewriters/args_forward.rb +10 -8
- data/lib/ruby-next/language/rewriters/base.rb +0 -4
- data/lib/ruby-next/language/rewriters/endless_method.rb +40 -0
- data/lib/ruby-next/language/rewriters/right_hand_assignment.rb +44 -0
- data/lib/ruby-next/rubocop.rb +26 -0
- data/lib/ruby-next/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb8a0798576c2859d40a9bcc7ce9b4c5a9bcdd2560a603bdf14b897a1248edc2
|
4
|
+
data.tar.gz: 38f599eb8a725bb52ad7a7ae66342c3450da6906366a8d6e53304484ca60a1b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abdb54f137bce953dfe24eaa29dcb35c057534821ac2dbd5a4b3092608aa88b6a2e8ac81032f86766d2eda29c70bbc0b2acd79f72dcd2490d230cd92a34af00b
|
7
|
+
data.tar.gz: ff4087bb6b6ecf1cc159166b0a4a8bcc650d2ef1ee315f3eeee5e8b8b1f3005ce560c4fcd7ffd5673cef206fbaf7f3fca2e0f0a594fda042b5f5178d43ea2a5b
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,18 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.8.0 (2020-05-01) 🚩
|
6
|
+
|
7
|
+
- Add right-hand assignment support. ([@palkan][])
|
8
|
+
|
9
|
+
It is real: `13.divmod(5) => a, b`.
|
10
|
+
|
11
|
+
- Add endless methods support. ([@palkan][])
|
12
|
+
|
13
|
+
Now you can write `def foo() = :bar`.
|
14
|
+
|
15
|
+
## 0.7.0 (2020-04-29)
|
16
|
+
|
5
17
|
- Try to auto-transpile the source code on load in `.setup_gem_load_path` if transpiled files are missing. ([@palkan][])
|
6
18
|
|
7
19
|
This would make it possible to install gems from source if transpiled files do not exist in the repository.
|
data/README.md
CHANGED
@@ -62,12 +62,16 @@ $ gem install ruby-next
|
|
62
62
|
|
63
63
|
# Call ruby with -ruby-next flag
|
64
64
|
$ ruby -ruby-next -e "
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
def greet(val) =
|
66
|
+
case val
|
67
|
+
in hello: hello if hello =~ /human/i
|
68
|
+
'🙂'
|
69
|
+
in hello: 'martian'
|
70
|
+
'👽'
|
71
|
+
end
|
72
|
+
|
73
|
+
greet(hello: 'martian') => greeting
|
74
|
+
puts greeting
|
71
75
|
"
|
72
76
|
|
73
77
|
=> 👽
|
@@ -160,6 +164,8 @@ You can change the transpiler mode:
|
|
160
164
|
- Via environmental variable `RUBY_NEXT_TRANSPILE_MODE=rewrite`.
|
161
165
|
- Via CLI option ([see below](#cli)).
|
162
166
|
|
167
|
+
**NOTE:** For the time being, Unparser [doesn't support](https://github.com/mbj/unparser/pull/142) new Ruby 2.7 AST nodes, so we always use rewrite mode in Ruby 2.7+.
|
168
|
+
|
163
169
|
## CLI
|
164
170
|
|
165
171
|
Ruby Next ships with the command-line interface (`ruby-next`) which provides the following functionality:
|
@@ -431,11 +437,13 @@ require "ruby-next/language/runtime"
|
|
431
437
|
|
432
438
|
### Supported edge features
|
433
439
|
|
434
|
-
|
440
|
+
- "Endless" method definition (`def foo() = 42`) ([#16746](https://bugs.ruby-lang.org/issues/16746)).
|
441
|
+
|
442
|
+
- Right-hand assignment (`13.divmod(5) => a,b`) ([#15921](https://bugs.ruby-lang.org/issues/15921))
|
435
443
|
|
436
444
|
### Supported proposed features
|
437
445
|
|
438
|
-
- _Method reference_ operator (`.:`) ([
|
446
|
+
- _Method reference_ operator (`.:`) ([#13581](https://bugs.ruby-lang.org/issues/13581)).
|
439
447
|
|
440
448
|
## Contributing
|
441
449
|
|
data/bin/transform
CHANGED
@@ -5,11 +5,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
|
6
6
|
require "bundler/setup"
|
7
7
|
|
8
|
-
|
8
|
+
ENV["RUBY_NEXT_EDGE"] = "1"
|
9
|
+
ENV["RUBY_NEXT_PROPOSED"] = "1"
|
9
10
|
|
10
|
-
|
11
|
-
require "ruby-next/language/rewriters/method_reference"
|
12
|
-
RubyNext::Language.rewriters << RubyNext::Language::Rewriters::MethodReference
|
11
|
+
require "ruby-next/language"
|
13
12
|
|
14
13
|
contents =
|
15
14
|
if File.exist?(ARGV[0])
|
data/lib/ruby-next.rb
CHANGED
@@ -11,10 +11,10 @@ module RubyNext
|
|
11
11
|
|
12
12
|
# Defines last minor version for every major version
|
13
13
|
LAST_MINOR_VERSIONS = {
|
14
|
-
2 =>
|
14
|
+
2 => 8
|
15
15
|
}.freeze
|
16
16
|
|
17
|
-
LATEST_VERSION = [2,
|
17
|
+
LATEST_VERSION = [2, 8].freeze
|
18
18
|
|
19
19
|
class << self
|
20
20
|
def next_version(version = RUBY_VERSION)
|
@@ -97,7 +97,13 @@ module RubyNext
|
|
97
97
|
rewriters = Language.rewriters.select { |rw| rw.unsupported_version?(version) }
|
98
98
|
|
99
99
|
context = Language::TransformContext.new
|
100
|
-
|
100
|
+
|
101
|
+
new_contents =
|
102
|
+
if Gem::Version.new(version) >= Gem::Version.new("2.7.0") && !defined?(Unparser::Emitter::CaseMatch)
|
103
|
+
Language.rewrite contents, context: context, rewriters: rewriters
|
104
|
+
else
|
105
|
+
Language.transform contents, context: context, rewriters: rewriters
|
106
|
+
end
|
101
107
|
|
102
108
|
return unless context.dirty?
|
103
109
|
|
data/lib/ruby-next/language.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
gem "ruby-next-parser", ">= 2.8.0.
|
3
|
+
gem "ruby-next-parser", ">= 2.8.0.3"
|
4
4
|
gem "unparser", ">= 0.4.7"
|
5
5
|
|
6
6
|
require "set"
|
@@ -83,6 +83,12 @@ module RubyNext
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def runtime!
|
86
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.7.0") && !defined?(Unparser::Emitter::CaseMatch)
|
87
|
+
RubyNext.warn "Ruby Next fallbacks to \"rewrite\" transpiling mode since Unparser doesn't support 2.7 AST yet.\n" \
|
88
|
+
"See https://github.com/mbj/unparser/pull/142"
|
89
|
+
self.mode = :rewrite
|
90
|
+
end
|
91
|
+
|
86
92
|
@runtime = true
|
87
93
|
end
|
88
94
|
|
@@ -1,3 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Load edge Ruby features
|
4
|
+
|
5
|
+
require "ruby-next/language/rewriters/endless_method"
|
6
|
+
RubyNext::Language.rewriters << RubyNext::Language::Rewriters::EndlessMethod
|
7
|
+
|
8
|
+
require "ruby-next/language/rewriters/right_hand_assignment"
|
9
|
+
RubyNext::Language.rewriters << RubyNext::Language::Rewriters::RightHandAssignment
|
@@ -25,21 +25,23 @@ module RubyNext
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def on_send(node)
|
28
|
-
return unless node.children[2]&.type == :forwarded_args
|
28
|
+
return super(node) unless node.children[2]&.type == :forwarded_args
|
29
29
|
|
30
30
|
replace(node.children[2].loc.expression, "*#{REST}, &#{BLOCK}")
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
process(
|
33
|
+
node.updated(
|
34
|
+
nil,
|
35
|
+
[
|
36
|
+
*node.children[0..1],
|
37
|
+
*forwarded_args
|
38
|
+
]
|
39
|
+
)
|
38
40
|
)
|
39
41
|
end
|
40
42
|
|
41
43
|
def on_super(node)
|
42
|
-
return unless node.children[0]&.type == :forwarded_args
|
44
|
+
return super(node) unless node.children[0]&.type == :forwarded_args
|
43
45
|
|
44
46
|
replace(node.children[0].loc.expression, "*#{REST}, &#{BLOCK}")
|
45
47
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyNext
|
4
|
+
module Language
|
5
|
+
module Rewriters
|
6
|
+
class EndlessMethod < Base
|
7
|
+
SYNTAX_PROBE = "obj = Object.new; def obj.foo() = 42"
|
8
|
+
MIN_SUPPORTED_VERSION = Gem::Version.new("2.8.0")
|
9
|
+
|
10
|
+
def on_def_e(node)
|
11
|
+
context.track! self
|
12
|
+
|
13
|
+
replace(node.loc.assignment, "; ")
|
14
|
+
insert_after(node.loc.expression, "; end")
|
15
|
+
|
16
|
+
process(
|
17
|
+
node.updated(
|
18
|
+
:def,
|
19
|
+
node.children
|
20
|
+
)
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_defs_e(node)
|
25
|
+
context.track! self
|
26
|
+
|
27
|
+
replace(node.loc.assignment, "; ")
|
28
|
+
insert_after(node.loc.expression, "; end")
|
29
|
+
|
30
|
+
process(
|
31
|
+
node.updated(
|
32
|
+
:defs,
|
33
|
+
node.children
|
34
|
+
)
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyNext
|
4
|
+
module Language
|
5
|
+
module Rewriters
|
6
|
+
class RightHandAssignment < Base
|
7
|
+
SYNTAX_PROBE = "1 + 2 => a"
|
8
|
+
MIN_SUPPORTED_VERSION = Gem::Version.new("2.8.0")
|
9
|
+
|
10
|
+
def on_rasgn(node)
|
11
|
+
context.track! self
|
12
|
+
|
13
|
+
val_node, asgn_node = *node
|
14
|
+
|
15
|
+
remove(val_node.loc.expression.end.join(asgn_node.loc.expression))
|
16
|
+
insert_before(val_node.loc.expression, "#{asgn_node.loc.expression.source} = ")
|
17
|
+
|
18
|
+
process(
|
19
|
+
asgn_node.updated(
|
20
|
+
nil,
|
21
|
+
asgn_node.children + [val_node]
|
22
|
+
)
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_mrasgn(node)
|
27
|
+
context.track! self
|
28
|
+
|
29
|
+
lhs, rhs = *node
|
30
|
+
|
31
|
+
replace(lhs.loc.expression.end.join(rhs.loc.expression), ")")
|
32
|
+
insert_before(lhs.loc.expression, "#{rhs.loc.expression.source} = (")
|
33
|
+
|
34
|
+
process(
|
35
|
+
node.updated(
|
36
|
+
:masgn,
|
37
|
+
[rhs, lhs]
|
38
|
+
)
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/ruby-next/rubocop.rb
CHANGED
@@ -84,6 +84,32 @@ module RuboCop
|
|
84
84
|
send(:"on_#{child.type}", child)
|
85
85
|
end
|
86
86
|
end
|
87
|
+
|
88
|
+
unless method_defined?(:on_def_e)
|
89
|
+
def on_def_e(node)
|
90
|
+
_name, _args_node, body_node = *node
|
91
|
+
send(:"on_#{body_node.type}", body_node)
|
92
|
+
end
|
93
|
+
|
94
|
+
def on_defs_e(node)
|
95
|
+
_definee_node, _name, _args_node, body_node = *node
|
96
|
+
send(:"on_#{body_node.type}", body_node)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
unless method_defined?(:on_rasgn)
|
101
|
+
def on_rasgn(node)
|
102
|
+
val_node, asgn_node = *node
|
103
|
+
send(:"on_#{asgn_node.type}", asgn_node)
|
104
|
+
send(:"on_#{val_node.type}", val_node)
|
105
|
+
end
|
106
|
+
|
107
|
+
def on_mrasgn(node)
|
108
|
+
lhs, rhs = *node
|
109
|
+
send(:"on_#{lhs.type}", lhs)
|
110
|
+
send(:"on_#{rhs.type}", rhs)
|
111
|
+
end
|
112
|
+
end
|
87
113
|
end
|
88
114
|
end
|
89
115
|
end
|
data/lib/ruby-next/version.rb
CHANGED
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.
|
4
|
+
version: 0.8.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: 2020-
|
11
|
+
date: 2020-05-01 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: 2.8.0.
|
19
|
+
version: 2.8.0.4
|
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: 2.8.0.
|
26
|
+
version: 2.8.0.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: unparser
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,10 +90,12 @@ files:
|
|
90
90
|
- lib/ruby-next/language/proposed.rb
|
91
91
|
- lib/ruby-next/language/rewriters/args_forward.rb
|
92
92
|
- lib/ruby-next/language/rewriters/base.rb
|
93
|
+
- lib/ruby-next/language/rewriters/endless_method.rb
|
93
94
|
- lib/ruby-next/language/rewriters/endless_range.rb
|
94
95
|
- lib/ruby-next/language/rewriters/method_reference.rb
|
95
96
|
- lib/ruby-next/language/rewriters/numbered_params.rb
|
96
97
|
- lib/ruby-next/language/rewriters/pattern_matching.rb
|
98
|
+
- lib/ruby-next/language/rewriters/right_hand_assignment.rb
|
97
99
|
- lib/ruby-next/language/runtime.rb
|
98
100
|
- lib/ruby-next/language/setup.rb
|
99
101
|
- lib/ruby-next/language/unparser.rb
|