Sha256: 5c747766cb1dcf23da100431378151a481a95efebe9745e268327c9907e7beed

Contents?: true

Size: 1.8 KB

Versions: 8

Compression:

Stored size: 1.8 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_args(node)
          farg = node.children.find { |child| child.is_a?(::Parser::AST::Node) && child.type == :forward_arg }
          return unless farg

          context.track! self

          node = super(node)

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

          node.updated(
            :args,
            [
              *node.children.slice(0, node.children.index(farg)),
              s(:restarg, REST),
              s(:blockarg, BLOCK)
            ]
          )
        end

        def on_send(node)
          fargs = extract_fargs(node)
          return super(node) unless fargs

          process_fargs(node, fargs)
        end

        def on_super(node)
          fargs = extract_fargs(node)
          return super(node) unless fargs

          process_fargs(node, fargs)
        end

        private

        def extract_fargs(node)
          node.children.find { |child| child.is_a?(::Parser::AST::Node) && child.type == :forwarded_args }
        end

        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

8 entries across 8 versions & 1 rubygems

Version Path
ruby-next-core-0.15.1 lib/ruby-next/language/rewriters/2.7/args_forward.rb
ruby-next-core-0.15.0 lib/ruby-next/language/rewriters/2.7/args_forward.rb
ruby-next-core-0.14.1 lib/ruby-next/language/rewriters/2.7/args_forward.rb
ruby-next-core-0.14.0 lib/ruby-next/language/rewriters/2.7/args_forward.rb
ruby-next-core-0.13.3 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.13.2 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.13.1 lib/ruby-next/language/rewriters/args_forward.rb
ruby-next-core-0.13.0 lib/ruby-next/language/rewriters/args_forward.rb