class Riml::AST_Rewriter::ClassDefinitionToFunctions::InitializeSuperToObjectExtension

Attributes

class_node[R]

Public Class Methods

new(constructor, classes, class_node) click to toggle source
Calls superclass method Riml::AST_Rewriter::new
# File lib/riml/ast_rewriter.rb, line 664
def initialize(constructor, classes, class_node)
  super(constructor, classes)
  @class_node = class_node
end

Public Instance Methods

match?(constructor) click to toggle source
# File lib/riml/ast_rewriter.rb, line 669
def match?(constructor)
  DefNode === constructor && constructor.super_node
end
max_recursion_lvl() click to toggle source
# File lib/riml/ast_rewriter.rb, line 715
def max_recursion_lvl
  1
end
replace(constructor) click to toggle source
# File lib/riml/ast_rewriter.rb, line 673
def replace(constructor)
  unless class_node.superclass?
    error_msg "class #{class_node.full_name.inspect} called super in its " \
      " initialize function, but it has no superclass."
    error = InvalidSuper.new(error_msg, constructor)
    raise error
  end

  superclass = classes.superclass(class_node.full_name)
  super_constructor = superclass.constructor

  set_var_node = AssignNode.new('=', GetVariableNode.new(nil, superclass.constructor_obj_name),
    CallNode.new(
      super_constructor.scope_modifier,
      super_constructor.name,
      super_arguments(constructor.super_node)
    )
  )

  constructor.super_node.replace_with(set_var_node)
  constructor.expressions.insert_after(set_var_node,
    ExplicitCallNode.new(
      nil,
      "extend",
      [
        GetVariableNode.new(nil, class_node.constructor_obj_name),
        GetVariableNode.new(nil, superclass.constructor_obj_name)
      ]
    )
  )
  reestablish_parents(constructor)
end
super_arguments(super_node) click to toggle source
# File lib/riml/ast_rewriter.rb, line 706
def super_arguments(super_node)
  if super_node.use_all_arguments?
    # here, ast is 'constructor'
    ast.parameters.map {|p| GetVariableNode.new(nil, p)}
  else
    super_node.arguments
  end
end