Sha256: bc4a9930453929c3f77bfffe1610b479df333e1c1b8f94741123f81931afefb0

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 KB

Contents

# frozen_string_literal: true

module RubyNext
  module Language
    module Rewriters
      class ArgsForward < Base
        NAME = "args-forward"
        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 super(node) unless node.children[2]&.type == :forwarded_args

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

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

        def on_super(node)
          return super(node) 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

1 entries across 1 versions & 1 rubygems

Version Path
ruby-next-core-0.9.2 lib/ruby-next/language/rewriters/args_forward.rb