Class: RubyNext::Language::Rewriters::ArgsForward

Inherits:
Base
  • Object
show all
Defined in:
lib/ruby-next/language/rewriters/2.7/args_forward.rb

Direct Known Subclasses

ArgsForwardLeading

Constant Summary collapse

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__

Instance Attribute Summary

Attributes inherited from Base

#locals

Instance Method Summary collapse

Methods inherited from Base

ast?, #initialize, #s

Methods inherited from Abstract

ast?, #initialize, text?, unsupported_syntax?, unsupported_version?

Constructor Details

This class inherits a constructor from RubyNext::Language::Rewriters::Base

Instance Method Details

#on_args(node) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/ruby-next/language/rewriters/2.7/args_forward.rb', line 14

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

#on_def(node) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ruby-next/language/rewriters/2.7/args_forward.rb', line 48

def on_def(node)
  return super unless forward_arg?(node.children[1])

  new_node = super

  name = node.children[0]

  insert_after(node.loc.expression, "; respond_to?(:ruby2_keywords, true) && (ruby2_keywords :#{name})")

  s(:begin,
    new_node,
    ruby2_keywords_node(nil, name))
end

#on_defs(node) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ruby-next/language/rewriters/2.7/args_forward.rb', line 62

def on_defs(node)
  return super unless forward_arg?(node.children[2])

  new_node = super

  receiver = node.children[0]
  name = node.children[1]

  # Using self.ruby2_keywords :name results in undefined method error,
  # singleton_class works as expected
  receiver = s(:send, nil, :singleton_class) if receiver.type == :self

  receiver_name =
    case receiver.type
    when :send
      receiver.children[1]
    when :const
      receiver.children[1]
    end

  insert_after(node.loc.expression, "; #{receiver_name}.respond_to?(:ruby2_keywords, true) && (#{receiver_name}.send(:ruby2_keywords, :#{name}))")

  s(:begin,
    new_node,
    ruby2_keywords_node(receiver, name))
end

#on_send(node) ⇒ Object



34
35
36
37
38
39
# File 'lib/ruby-next/language/rewriters/2.7/args_forward.rb', line 34

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

  process_fargs(node, fargs)
end

#on_super(node) ⇒ Object



41
42
43
44
45
46
# File 'lib/ruby-next/language/rewriters/2.7/args_forward.rb', line 41

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

  process_fargs(node, fargs)
end