ruby-next-core 1.0.2 → 1.1.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +19 -1
  4. data/bin/parse +11 -0
  5. data/lib/.rbnext/2.1/ruby-next/language.rb +11 -0
  6. data/lib/.rbnext/2.3/ruby-next/config.rb +2 -2
  7. data/lib/.rbnext/2.3/ruby-next/language/eval.rb +3 -3
  8. data/lib/.rbnext/2.3/ruby-next/language/rewriters/2.7/args_forward.rb +4 -4
  9. data/lib/.rbnext/2.3/ruby-next/utils.rb +13 -5
  10. data/lib/.rbnext/2.7/ruby-next/language/paco_parsers/string_literals.rb +11 -7
  11. data/lib/.rbnext/3.2/ruby-next/rubocop.rb +11 -2
  12. data/lib/ruby-next/config.rb +2 -2
  13. data/lib/ruby-next/language/eval.rb +3 -3
  14. data/lib/ruby-next/language/paco_parsers/string_literals.rb +11 -7
  15. data/lib/ruby-next/language/parser.rb +2 -2
  16. data/lib/ruby-next/language/rewriters/2.3/safe_navigation.rb +4 -4
  17. data/lib/ruby-next/language/rewriters/2.3/squiggly_heredoc.rb +1 -1
  18. data/lib/ruby-next/language/rewriters/2.4/dir.rb +1 -1
  19. data/lib/ruby-next/language/rewriters/2.5/rescue_within_block.rb +1 -1
  20. data/lib/ruby-next/language/rewriters/2.7/args_forward.rb +4 -4
  21. data/lib/ruby-next/language/rewriters/3.0/args_forward_leading.rb +1 -1
  22. data/lib/ruby-next/language/rewriters/3.0/endless_method.rb +2 -2
  23. data/lib/ruby-next/language/rewriters/3.0/find_pattern.rb +1 -1
  24. data/lib/ruby-next/language/rewriters/3.1/endless_method_command.rb +2 -2
  25. data/lib/ruby-next/language/rewriters/3.1/oneline_pattern_parensless.rb +1 -1
  26. data/lib/ruby-next/language/rewriters/3.1/pin_vars_pattern.rb +1 -1
  27. data/lib/ruby-next/language/rewriters/3.1/shorthand_hash.rb +1 -1
  28. data/lib/ruby-next/language/rewriters/{edge → 3.4}/it_param.rb +1 -1
  29. data/lib/ruby-next/language/rewriters/edge.rb +0 -12
  30. data/lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb +1 -1
  31. data/lib/ruby-next/language.rb +11 -0
  32. data/lib/ruby-next/pry.rb +1 -2
  33. data/lib/ruby-next/rubocop.rb +11 -2
  34. data/lib/ruby-next/utils.rb +13 -5
  35. data/lib/ruby-next/version.rb +1 -1
  36. metadata +9 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac9ab37024b70ac4ba553ceca25b7b63a0029ccf356787295b5d6509eb2b5461
4
- data.tar.gz: a27ef393520aae1513047c234f999993ff0bc1dd6614e7aca8c5acf02561a7af
3
+ metadata.gz: b8ba05cac5681186f90c6a46731a78532ec69707c9b01bc1df15702ebae13e4d
4
+ data.tar.gz: cb58fc9d453a7be076a594902701b2011ea79496cab642437620519ccf3a0682
5
5
  SHA512:
6
- metadata.gz: 00b81f2df63fce2fb38da1470315a1d1fa2ae1e4ebc69b150712a9f02f2e5a07c7bb8f2776ae109ec4b3fd259567f674cf6df209f0d06fb4fa6e542467f44c7f
7
- data.tar.gz: 7f201ea784a2707d0aec127086d5b76c1475fa7c60e984988ddb7c37262d6168cc86139112b71ea466502eba330e1fd6cf98fe6c674266dfb7e4b5c62d75d7b4
6
+ metadata.gz: 1a75869db2f6fffade1e12d60aca0e1592cc669a0572cd114edae2c24e0d5bed22337063246a7edee5c2ce27a89c3aece048837aed463ff6781e5ea5e7052008
7
+ data.tar.gz: a28a71c3ad5e3a0e0bb08679dad23fe69a6a3ebdd14c66f4b800269c29eb97a74a837ab2c8479b824d9a47c81c1dd3916d1e9cefa76c3c88dd7a29170adc1b80
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.1.0 (2025-01-15)
6
+
7
+ - Prepare for Ruby 3.5.
8
+
9
+ ## 1.0.3 (2024-04-18)
10
+
11
+ - Fix RuboCop compatibility.
12
+
5
13
  ## 1.0.2 (2024-02-23)
6
14
 
7
15
  - Automatically mark context as dirty if `#safe_rewrite` modifies source code. ([@palkan][])
data/README.md CHANGED
@@ -364,6 +364,20 @@ If the command fails we warn the end user.
364
364
 
365
365
  This feature, _auto-transpiling_, is **disabled** by default (will likely be enabled in future versions). You can enable it by calling `RubyNext::Language.setup_gem_load_path(transpile: true)`.
366
366
 
367
+ ### Dependency-less setup
368
+
369
+ If you want to avoid adding `ruby-next-core` to your gem's dependencies, you can tweak the `$LOAD_PATH` yourself. It's much easier to do if you go with a single transpiled version per source file (i.e., use `--single-version` or specify particular rewriters using the `--rewrite` option of the `ruby-next nextify` command). If so, you can drop the following snippet to your gem's entrypoint:
370
+
371
+ ```ruby
372
+ # lib/my_gem.rb
373
+ $LOAD_PATH.unshift "#{__dir__}/.rbnext"
374
+
375
+ # Then go `require` statements
376
+ # ...
377
+ ```
378
+
379
+ That's it! Keep in mind that in this cases there is no auto-transpiling support (so, you may want to keep the transpiled files in the repository to allow installing the gem from source).
380
+
367
381
  ## Runtime usage
368
382
 
369
383
  It is also possible to transpile Ruby source code in run-time via Ruby Next.
@@ -552,7 +566,7 @@ require "ruby-next/language/runtime"
552
566
 
553
567
  ### Supported edge features
554
568
 
555
- - Implicit `it` block parameter ([#19890](https://bugs.ruby-lang.org/issues/18980)).
569
+ None yet.
556
570
 
557
571
  ### Supported proposed features
558
572
 
@@ -565,6 +579,9 @@ Wonder what would happen if Ruby get a null coalescing operator (`??=`) or some
565
579
 
566
580
  Ruby Next allows you to write your own syntax rewriters. Full-featured rewriters (used by Ruby Next itself) operate on AST and usually require parser modifications. However, we also support text-based rewriters which can be used to experiment with new syntax much quicker without dealing with grammars, parsers and syntax trees.
567
581
 
582
+ > [!TIP]
583
+ > You can experiment with Ruby Next rewriters at our [online playground][playground]!
584
+
568
585
  To implement a text-based rewriter, you need to create a new class inherited from `RubyNext::Language::Rewriters::Text` and implementing either `#rewrite` or `#safe_rewrite` method. For example, the method reference operator (`.:`) could be implemented as follows:
569
586
 
570
587
  ```ruby
@@ -704,3 +721,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
704
721
  [require-hooks]: https://github.com/ruby-next/require-hooks
705
722
  [Natalie]: https://natalie-lang.org
706
723
  [Paco]: https://github.com/ruby-next/paco
724
+ [playground]: https://ruby-next.github.io
data/bin/parse CHANGED
@@ -15,6 +15,17 @@ contents =
15
15
  ARGV[0]
16
16
  end
17
17
 
18
+ require "optparse"
19
+
20
+ OptionParser.new do |opts|
21
+ opts.banner = "Usage: parse filepath_or_code [options]"
22
+
23
+ opts.on("--next", "Use Ruby Next parser") do
24
+ require "parser/rubynext"
25
+ RubyNext::Language.parser_class = ::Parser::RubyNext
26
+ end
27
+ end.parse!
28
+
18
29
  ast = RubyNext::Language.parse(contents)
19
30
  puts ast
20
31
  puts "\n // Parsed with #{RubyNext::Language.parser_class}"
@@ -285,6 +285,17 @@ module RubyNext
285
285
  require "ruby-next/language/rewriters/2.6/endless_range"
286
286
  rewriters << Rewriters::EndlessRange
287
287
 
288
+ require "ruby-next/language/rewriters/3.4/it_param"
289
+
290
+ # We must add `it` rewriter before nubmered params rewriter to allow it to transform the source code further
291
+ number_params = rewriters.index(Rewriters::NumberedParams)
292
+
293
+ if number_params
294
+ rewriters.insert(number_params, Rewriters::ItParam)
295
+ else
296
+ rewriters << Rewriters::ItParam
297
+ end
298
+
288
299
  if RubyNext.edge_syntax?
289
300
  require "ruby-next/language/rewriters/edge"
290
301
  end
@@ -10,10 +10,10 @@ module RubyNext
10
10
  # Defines last minor version for every major version
11
11
  LAST_MINOR_VERSIONS = {
12
12
  2 => 8, # 2.8 is required for backward compatibility: some gems already uses it
13
- 3 => 4
13
+ 3 => 5
14
14
  }.freeze
15
15
 
16
- LATEST_VERSION = [3, 4].freeze
16
+ LATEST_VERSION = [3, 5].freeze
17
17
 
18
18
  # A virtual version number used for proposed features
19
19
  NEXT_VERSION = "1995.next.0"
@@ -20,7 +20,7 @@ module RubyNext
20
20
  module InstanceEval # :nodoc:
21
21
  refine Object do
22
22
  def instance_eval(*args, &block)
23
- return super(*args, &block) if block
23
+ return super if block
24
24
 
25
25
  source = args.shift
26
26
  new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
@@ -33,7 +33,7 @@ module RubyNext
33
33
  module ClassEval
34
34
  refine Module do
35
35
  def module_eval(*args, &block)
36
- return super(*args, &block) if block
36
+ return super if block
37
37
 
38
38
  source = args.shift
39
39
  new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
@@ -43,7 +43,7 @@ module RubyNext
43
43
  end
44
44
 
45
45
  def class_eval(*args, &block)
46
- return super(*args, &block) if block
46
+ return super if block
47
47
 
48
48
  source = args.shift
49
49
  new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
@@ -5,7 +5,7 @@ module RubyNext
5
5
  module Rewriters
6
6
  class ArgsForward < Base
7
7
  NAME = "args-forward"
8
- SYNTAX_PROBE = "obj = Object.new; def obj.foo(...) super(...); end"
8
+ SYNTAX_PROBE = "Module.new { def foo(...) super(...); end }"
9
9
  MIN_SUPPORTED_VERSION = Gem::Version.new("2.7.0")
10
10
 
11
11
  REST = :__rest__
@@ -17,7 +17,7 @@ module RubyNext
17
17
 
18
18
  context.track! self
19
19
 
20
- node = super(node)
20
+ node = super
21
21
 
22
22
  replace(farg.loc.expression, "*#{REST}, &#{BLOCK}")
23
23
 
@@ -33,14 +33,14 @@ module RubyNext
33
33
 
34
34
  def on_send(node)
35
35
  fargs = extract_fargs(node)
36
- return super(node) unless fargs
36
+ return super unless fargs
37
37
 
38
38
  process_fargs(node, fargs)
39
39
  end
40
40
 
41
41
  def on_super(node)
42
42
  fargs = extract_fargs(node)
43
- return super(node) unless fargs
43
+ return super unless fargs
44
44
 
45
45
  process_fargs(node, fargs)
46
46
  end
@@ -26,11 +26,19 @@ module RubyNext
26
26
  end
27
27
  using(Module.new do
28
28
  refine RubyNext::Utils::A do
29
- include(Module.new do
30
- def i_am_refinement
31
- "yes, you are!"
32
- end
33
- end)
29
+ if RUBY_VERSION >= "3.3.0"
30
+ import_methods(Module.new do
31
+ def i_am_refinement
32
+ "yes, you are!"
33
+ end
34
+ end)
35
+ else
36
+ include(Module.new do
37
+ def i_am_refinement
38
+ "yes, you are!"
39
+ end
40
+ end)
41
+ end
34
42
  end
35
43
  end)
36
44
  RubyNext::Utils::B.new.i_am_refinement
@@ -4,7 +4,7 @@ module RubyNext
4
4
  module Language
5
5
  module PacoParsers
6
6
  class StringLiterals < Base
7
- PAIRS = {"[" => "]", "{" => "}", "<" => ">"}.freeze
7
+ PAIRS = {"[" => "]", "{" => "}", "(" => ")"}.freeze
8
8
 
9
9
  def default
10
10
  all_strings.fmap do |result|
@@ -24,11 +24,15 @@ module RubyNext
24
24
  # heredoc_expanded
25
25
  end
26
26
 
27
+ def literal_start
28
+ alt(string("{"), string("("), string("["))
29
+ end
30
+
27
31
  def quoted
28
32
  seq(
29
- string("%q"),
30
- any_char.bind do |char|
31
- end_symbol = string(PAIRS[char] || char)
33
+ alt(string("%q"), string("%s"), string("%r"), string("%i"), string("%w")),
34
+ literal_start.bind do |char|
35
+ end_symbol = string(PAIRS.fetch(char))
32
36
  escapable_string(succeed(char), end_symbol)
33
37
  end
34
38
  )
@@ -40,9 +44,9 @@ module RubyNext
40
44
 
41
45
  def quoted_expanded
42
46
  seq(
43
- alt(string("%Q"), string("%")),
44
- any_char.bind do |char|
45
- end_symbol = string(PAIRS[char] || char)
47
+ alt(string("%Q"), string("%"), string("%W"), string("%I")),
48
+ literal_start.bind do |char|
49
+ end_symbol = string(PAIRS.fetch(char))
46
50
  escapable_string(succeed(char), end_symbol, interpolate: true)
47
51
  end
48
52
  )
@@ -36,7 +36,16 @@ end
36
36
  module RuboCop
37
37
  class ProcessedSource
38
38
  module ParserClassExt
39
- def parser_class(version)
39
+ require "ruby-next/language"
40
+ TEXT_REWRITERS = RubyNext::Language.rewriters.select(&:text?)
41
+
42
+ def parse(src, *args)
43
+ # We must apply text rewriters before parsing
44
+ src = RubyNext::Language.send(:text_rewrite, src, rewriters: TEXT_REWRITERS, using: false, context: RubyNext::Language::TransformContext.new(path: path))
45
+ super
46
+ end
47
+
48
+ def parser_class(version, *__rest__)
40
49
  return super unless version == RUBY_NEXT_VERSION
41
50
 
42
51
  require "parser/rubynext"
@@ -166,7 +175,7 @@ module RuboCop
166
175
  def on_pair(node)
167
176
  return if node.children[0].loc.last_column == node.children[1].loc.last_column
168
177
 
169
- super(node)
178
+ super
170
179
  end
171
180
  end)
172
181
  end
@@ -10,10 +10,10 @@ module RubyNext
10
10
  # Defines last minor version for every major version
11
11
  LAST_MINOR_VERSIONS = {
12
12
  2 => 8, # 2.8 is required for backward compatibility: some gems already uses it
13
- 3 => 4
13
+ 3 => 5
14
14
  }.freeze
15
15
 
16
- LATEST_VERSION = [3, 4].freeze
16
+ LATEST_VERSION = [3, 5].freeze
17
17
 
18
18
  # A virtual version number used for proposed features
19
19
  NEXT_VERSION = "1995.next.0"
@@ -20,7 +20,7 @@ module RubyNext
20
20
  module InstanceEval # :nodoc:
21
21
  refine Object do
22
22
  def instance_eval(*args, &block)
23
- return super(*args, &block) if block
23
+ return super if block
24
24
 
25
25
  source = args.shift
26
26
  new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
@@ -33,7 +33,7 @@ module RubyNext
33
33
  module ClassEval
34
34
  refine Module do
35
35
  def module_eval(*args, &block)
36
- return super(*args, &block) if block
36
+ return super if block
37
37
 
38
38
  source = args.shift
39
39
  new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
@@ -43,7 +43,7 @@ module RubyNext
43
43
  end
44
44
 
45
45
  def class_eval(*args, &block)
46
- return super(*args, &block) if block
46
+ return super if block
47
47
 
48
48
  source = args.shift
49
49
  new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
@@ -4,7 +4,7 @@ module RubyNext
4
4
  module Language
5
5
  module PacoParsers
6
6
  class StringLiterals < Base
7
- PAIRS = {"[" => "]", "{" => "}", "<" => ">"}.freeze
7
+ PAIRS = {"[" => "]", "{" => "}", "(" => ")"}.freeze
8
8
 
9
9
  def default
10
10
  all_strings.fmap do |result|
@@ -24,11 +24,15 @@ module RubyNext
24
24
  # heredoc_expanded
25
25
  end
26
26
 
27
+ def literal_start
28
+ alt(string("{"), string("("), string("["))
29
+ end
30
+
27
31
  def quoted
28
32
  seq(
29
- string("%q"),
30
- any_char.bind do |char|
31
- end_symbol = string(PAIRS[char] || char)
33
+ alt(string("%q"), string("%s"), string("%r"), string("%i"), string("%w")),
34
+ literal_start.bind do |char|
35
+ end_symbol = string(PAIRS.fetch(char))
32
36
  escapable_string(succeed(char), end_symbol)
33
37
  end
34
38
  )
@@ -40,9 +44,9 @@ module RubyNext
40
44
 
41
45
  def quoted_expanded
42
46
  seq(
43
- alt(string("%Q"), string("%")),
44
- any_char.bind do |char|
45
- end_symbol = string(PAIRS[char] || char)
47
+ alt(string("%Q"), string("%"), string("%W"), string("%I")),
48
+ literal_start.bind do |char|
49
+ end_symbol = string(PAIRS.fetch(char))
46
50
  escapable_string(succeed(char), end_symbol, interpolate: true)
47
51
  end
48
52
  )
@@ -4,7 +4,7 @@ begin
4
4
  require "prism"
5
5
  require "prism/translation/parser"
6
6
  rescue LoadError
7
- require "parser/ruby33"
7
+ require "parser/ruby34"
8
8
  end
9
9
 
10
10
  module RubyNext
@@ -83,7 +83,7 @@ module RubyNext
83
83
  Language.const_set(:PrismParser, clazz)
84
84
  end
85
85
  else
86
- ::Parser::Ruby33
86
+ ::Parser::Ruby34
87
87
  end
88
88
  end
89
89
  end
@@ -11,7 +11,7 @@ module RubyNext
11
11
  SAFE_LVAR = :__safe_lvar__
12
12
 
13
13
  def on_csend(node)
14
- node = super(node)
14
+ node = super # rubocop:disable Lint/ShadowedArgument
15
15
 
16
16
  context.track! self
17
17
 
@@ -32,7 +32,7 @@ module RubyNext
32
32
  end
33
33
 
34
34
  def on_block(node)
35
- return super(node) unless node.children[0].type == :csend
35
+ return super unless node.children[0].type == :csend
36
36
 
37
37
  context.track!(self)
38
38
 
@@ -40,7 +40,7 @@ module RubyNext
40
40
  end
41
41
 
42
42
  def on_numblock(node)
43
- return super(node) unless node.children[0].type == :csend
43
+ return super unless node.children[0].type == :csend
44
44
 
45
45
  context.track!(self)
46
46
 
@@ -48,7 +48,7 @@ module RubyNext
48
48
  end
49
49
 
50
50
  def on_op_asgn(node)
51
- return super(node) unless node.children[0].type == :csend
51
+ return super unless node.children[0].type == :csend
52
52
 
53
53
  context.track!(self)
54
54
 
@@ -9,7 +9,7 @@ module RubyNext
9
9
  MIN_SUPPORTED_VERSION = Gem::Version.new("2.3.0")
10
10
 
11
11
  def on_str(node)
12
- node = super(node) if defined?(super_method)
12
+ node = super if defined?(super_method)
13
13
  return node unless node.loc.respond_to?(:heredoc_body) && node.loc.expression.source.include?("<<~")
14
14
 
15
15
  context.track! self
@@ -9,7 +9,7 @@ module RubyNext
9
9
  MIN_SUPPORTED_VERSION = Gem::Version.new("2.4.0")
10
10
 
11
11
  def on_send(node)
12
- return super(node) unless node.children[1] == :__dir__
12
+ return super unless node.children[1] == :__dir__
13
13
 
14
14
  context.track! self
15
15
 
@@ -18,7 +18,7 @@ module RubyNext
18
18
  node && (node.type == :rescue || node.type == :ensure)
19
19
  end
20
20
 
21
- return super(block_node) unless exception_node
21
+ return super unless exception_node
22
22
 
23
23
  context.track! self
24
24
 
@@ -5,7 +5,7 @@ module RubyNext
5
5
  module Rewriters
6
6
  class ArgsForward < Base
7
7
  NAME = "args-forward"
8
- SYNTAX_PROBE = "obj = Object.new; def obj.foo(...) super(...); end"
8
+ SYNTAX_PROBE = "Module.new { def foo(...) super(...); end }"
9
9
  MIN_SUPPORTED_VERSION = Gem::Version.new("2.7.0")
10
10
 
11
11
  REST = :__rest__
@@ -17,7 +17,7 @@ module RubyNext
17
17
 
18
18
  context.track! self
19
19
 
20
- node = super(node)
20
+ node = super
21
21
 
22
22
  replace(farg.loc.expression, "*#{REST}, &#{BLOCK}")
23
23
 
@@ -33,14 +33,14 @@ module RubyNext
33
33
 
34
34
  def on_send(node)
35
35
  fargs = extract_fargs(node)
36
- return super(node) unless fargs
36
+ return super unless fargs
37
37
 
38
38
  process_fargs(node, fargs)
39
39
  end
40
40
 
41
41
  def on_super(node)
42
42
  fargs = extract_fargs(node)
43
- return super(node) unless fargs
43
+ return super unless fargs
44
44
 
45
45
  process_fargs(node, fargs)
46
46
  end
@@ -5,7 +5,7 @@ module RubyNext
5
5
  module Rewriters
6
6
  class ArgsForwardLeading < ArgsForward
7
7
  NAME = "args-forward-leading"
8
- SYNTAX_PROBE = "obj = Object.new; def obj.foo(...) super(1, ...); end"
8
+ SYNTAX_PROBE = "Module.new { def foo(...) super(1, ...); end }"
9
9
  MIN_SUPPORTED_VERSION = Gem::Version.new("3.0.0")
10
10
 
11
11
  attr_reader :leading_farg
@@ -11,7 +11,7 @@ module RubyNext
11
11
  def on_def(node)
12
12
  return process_def(node) if endless?(node)
13
13
 
14
- super(node)
14
+ super
15
15
  end
16
16
 
17
17
  def process_def(node)
@@ -34,7 +34,7 @@ module RubyNext
34
34
 
35
35
  def on_defs(node)
36
36
  return process_defs(node) if endless?(node)
37
- super(node)
37
+ super
38
38
  end
39
39
 
40
40
  def process_defs(node)
@@ -30,7 +30,7 @@ module RubyNext
30
30
 
31
31
  def on_find_pattern(node)
32
32
  @has_find_pattern = true
33
- super(node)
33
+ super
34
34
  end
35
35
 
36
36
  private
@@ -11,13 +11,13 @@ module RubyNext
11
11
  def process_def(node)
12
12
  return node unless command?(node)
13
13
 
14
- super(node)
14
+ super
15
15
  end
16
16
 
17
17
  def process_defs(node)
18
18
  return node unless command?(node)
19
19
 
20
- super(node)
20
+ super
21
21
  end
22
22
 
23
23
  private
@@ -30,7 +30,7 @@ module RubyNext
30
30
  insert_before(pattern.loc.expression, left_p)
31
31
  insert_after(pattern.loc.expression, right_p)
32
32
  else
33
- super(node)
33
+ super
34
34
  end
35
35
  end
36
36
 
@@ -38,7 +38,7 @@ module RubyNext
38
38
 
39
39
  def on_pin(node)
40
40
  @has_pin_vars = node.children.first.type != :lvar
41
- super(node)
41
+ super
42
42
  end
43
43
 
44
44
  private
@@ -9,7 +9,7 @@ module RubyNext
9
9
  MIN_SUPPORTED_VERSION = Gem::Version.new("3.1.0")
10
10
 
11
11
  def on_pair(node)
12
- return super(node) unless (node.children[0].loc.last_column == node.children[1].loc.last_column) &&
12
+ return super unless (node.children[0].loc.last_column == node.children[1].loc.last_column) &&
13
13
  (node.children[1].loc.first_line == node.children[1].loc.last_line)
14
14
 
15
15
  context.track! self
@@ -53,7 +53,7 @@ module RubyNext
53
53
  node.is_a?(Parser::AST::Node) && (
54
54
  node.type == :send && node.children[0].nil? && node.children[1] == :it && node.children[2].nil?
55
55
  ) || ( # Prism version
56
- node.type == :lvar && node.children[0] == :"0it"
56
+ node.type == :lvar && node.children[0] == :it
57
57
  )
58
58
  end
59
59
  end
@@ -1,15 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Load edge Ruby features
4
-
5
- require "ruby-next/language/rewriters/edge/it_param"
6
-
7
- # We must add this rewriter before nubmered params rewriter to allow it to transform the source code further
8
-
9
- number_params = RubyNext::Language.rewriters.index(RubyNext::Language::Rewriters::NumberedParams)
10
-
11
- if number_params
12
- RubyNext::Language.rewriters.insert(number_params, RubyNext::Language::Rewriters::ItParam)
13
- else
14
- RubyNext::Language.rewriters << RubyNext::Language::Rewriters::ItParam
15
- end
@@ -41,7 +41,7 @@ module RubyNext
41
41
 
42
42
  def on_match_var(node)
43
43
  @has_vars_pattern = true if node.children[0].is_a?(::Parser::AST::Node)
44
- super(node)
44
+ super
45
45
  end
46
46
 
47
47
  private
@@ -285,6 +285,17 @@ module RubyNext
285
285
  require "ruby-next/language/rewriters/2.6/endless_range"
286
286
  rewriters << Rewriters::EndlessRange
287
287
 
288
+ require "ruby-next/language/rewriters/3.4/it_param"
289
+
290
+ # We must add `it` rewriter before nubmered params rewriter to allow it to transform the source code further
291
+ number_params = rewriters.index(Rewriters::NumberedParams)
292
+
293
+ if number_params
294
+ rewriters.insert(number_params, Rewriters::ItParam)
295
+ else
296
+ rewriters << Rewriters::ItParam
297
+ end
298
+
288
299
  if RubyNext.edge_syntax?
289
300
  require "ruby-next/language/rewriters/edge"
290
301
  end
data/lib/ruby-next/pry.rb CHANGED
@@ -49,7 +49,6 @@ Pry.prepend(Module.new do
49
49
  obj.instance_eval do
50
50
  def eval(code, *args)
51
51
  new_code = ::RubyNext::Language::Runtime.transform(code, using: false)
52
-
53
52
  super(new_code, *args)
54
53
  end
55
54
 
@@ -70,7 +69,7 @@ Pry::Code.singleton_class.prepend(Module.new do
70
69
  true
71
70
  rescue Parser::SyntaxError => ex
72
71
  case ex.message
73
- when /unexpected token \$end/
72
+ when /(unexpected token \$end|unexpected end-of-input)/
74
73
  false
75
74
  else
76
75
  true
@@ -36,7 +36,16 @@ end
36
36
  module RuboCop
37
37
  class ProcessedSource
38
38
  module ParserClassExt
39
- def parser_class(version)
39
+ require "ruby-next/language"
40
+ TEXT_REWRITERS = RubyNext::Language.rewriters.select(&:text?)
41
+
42
+ def parse(src, *args)
43
+ # We must apply text rewriters before parsing
44
+ src = RubyNext::Language.send(:text_rewrite, src, rewriters: TEXT_REWRITERS, using: false, context: RubyNext::Language::TransformContext.new(path: path))
45
+ super
46
+ end
47
+
48
+ def parser_class(version, *)
40
49
  return super unless version == RUBY_NEXT_VERSION
41
50
 
42
51
  require "parser/rubynext"
@@ -166,7 +175,7 @@ module RuboCop
166
175
  def on_pair(node)
167
176
  return if node.children[0].loc.last_column == node.children[1].loc.last_column
168
177
 
169
- super(node)
178
+ super
170
179
  end
171
180
  end)
172
181
  end
@@ -27,11 +27,19 @@ module RubyNext
27
27
 
28
28
  using(Module.new do
29
29
  refine RubyNext::Utils::A do
30
- include(Module.new do
31
- def i_am_refinement
32
- "yes, you are!"
33
- end
34
- end)
30
+ if RUBY_VERSION >= "3.3.0"
31
+ import_methods(Module.new do
32
+ def i_am_refinement
33
+ "yes, you are!"
34
+ end
35
+ end)
36
+ else
37
+ include(Module.new do
38
+ def i_am_refinement
39
+ "yes, you are!"
40
+ end
41
+ end)
42
+ end
35
43
  end
36
44
  end)
37
45
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyNext
4
- VERSION = "1.0.2"
4
+ VERSION = "1.1.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: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-23 00:00:00.000000000 Z
11
+ date: 2025-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: require-hooks
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.2.0
33
+ version: 3.4.0.2
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 3.2.2.0
40
+ version: 3.4.0.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: unparser
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -178,10 +178,10 @@ files:
178
178
  - lib/ruby-next/language/rewriters/3.1/refinement_import_methods.rb
179
179
  - lib/ruby-next/language/rewriters/3.1/shorthand_hash.rb
180
180
  - lib/ruby-next/language/rewriters/3.2/anonymous_restargs.rb
181
+ - lib/ruby-next/language/rewriters/3.4/it_param.rb
181
182
  - lib/ruby-next/language/rewriters/abstract.rb
182
183
  - lib/ruby-next/language/rewriters/base.rb
183
184
  - lib/ruby-next/language/rewriters/edge.rb
184
- - lib/ruby-next/language/rewriters/edge/it_param.rb
185
185
  - lib/ruby-next/language/rewriters/proposed.rb
186
186
  - lib/ruby-next/language/rewriters/proposed/bind_vars_pattern.rb
187
187
  - lib/ruby-next/language/rewriters/proposed/method_reference.rb
@@ -209,7 +209,7 @@ metadata:
209
209
  homepage_uri: https://github.com/ruby-next/ruby-next
210
210
  source_code_uri: https://github.com/ruby-next/ruby-next
211
211
  funding_uri: https://github.com/sponsors/palkan
212
- post_install_message:
212
+ post_install_message:
213
213
  rdoc_options: []
214
214
  require_paths:
215
215
  - lib
@@ -224,8 +224,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  - !ruby/object:Gem::Version
225
225
  version: '0'
226
226
  requirements: []
227
- rubygems_version: 3.4.20
228
- signing_key:
227
+ rubygems_version: 3.4.19
228
+ signing_key:
229
229
  specification_version: 4
230
230
  summary: Ruby Next core functionality
231
231
  test_files: []