Sha256: f1c6f095d3cba8a4a049e81f88a7323635fcf8341624ea29a9e11f1c84502517

Contents?: true

Size: 1.61 KB

Versions: 2

Compression:

Stored size: 1.61 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(1, ...); end"
        MIN_SUPPORTED_VERSION = Gem::Version.new("2.7.2")

        REST = :__rest__
        BLOCK = :__block__

        def on_forward_arg(node)
          context.track! self

          node = super(node)

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

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

        def on_send(node)
          fargs = node.children.find { |child| child.is_a?(::Parser::AST::Node) && child.type == :forwarded_args }
          return super(node) unless fargs

          process_fargs(node, fargs)
        end

        def on_super(node)
          fargs = node.children.find { |child| child.is_a?(::Parser::AST::Node) && child.type == :forwarded_args }
          return super(node) unless fargs

          process_fargs(node, fargs)
        end

        private

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

          process(
            node.updated(
              nil,
              [
                *node.children.take(node.children.index(fargs)),
                *forwarded_args
              ]
            )
          )
        end

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

Version data entries

2 entries across 2 versions & 1 rubygems

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