Sha256: c648d12414be8b7e170712cf4829855d05f4c6fe231ea54167ffb76b90629c26

Contents?: true

Size: 1.35 KB

Versions: 6

Compression:

Stored size: 1.35 KB

Contents

# frozen_string_literal: true

module RubyNext
  module Language
    module Rewriters
      class ArgsForward < Base
        SYNTAX_PROBE = "obj = Object.new; def obj.foo(...) super(...); end"
        MIN_SUPPORTED_VERSION = Gem::Version.new("2.7.0")

        REST = :__rest__
        BLOCK = :__block__

        def on_forward_args(node)
          context.track! self

          replace(node.loc.expression, "(*#{REST}, &#{BLOCK})")

          node.updated(
            :args,
            [
              s(:restarg, REST),
              s(:blockarg, BLOCK)
            ]
          )
        end

        def on_send(node)
          return unless node.children[2]&.type == :forwarded_args

          replace(node.children[2].loc.expression, "*#{REST}, &#{BLOCK}")

          node.updated(
            nil,
            [
              *node.children[0..1],
              *forwarded_args
            ]
          )
        end

        def on_super(node)
          return unless node.children[0]&.type == :forwarded_args

          replace(node.children[0].loc.expression, "*#{REST}, &#{BLOCK}")

          node.updated(
            nil,
            forwarded_args
          )
        end

        private

        def forwarded_args
          [
            s(:splat, s(:lvar, REST)),
            s(:block_pass, s(:lvar, BLOCK))
          ]
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ruby-next-core-0.7.0 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.6.0 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.5.3 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.5.2 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.5.1 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.5.0 lib/ruby-next/language/rewriters/args_forward.rb