class Riml::AST_Rewriter::ClassDefinitionToFunctions::ExtendObjectWithMethods

Public Instance Methods

extend_obj_with_methods(def_node) click to toggle source

Ex: ‘let dogObj.bark = function(’<SNR>‘ . s:SID() . ’_s:Dog_bark’)‘

# File lib/riml/ast_rewriter.rb, line 547
def extend_obj_with_methods(def_node)
  constructor = ast.constructor
  extension =
    AssignNode.new('=',
      DictGetDotNode.new(
        GetVariableNode.new(nil, ast.constructor_obj_name),
        [def_node.original_name]
      ),
      CallNode.new(
        nil, 'function', [
          BinaryOperatorNode.new(
            '.',
            [
              BinaryOperatorNode.new(
                '.',
                [
                  StringNode.new('<SNR>', :s),
                  CallNode.new('s:', 'SID', []),
                ]
              ),
              StringNode.new("_s:#{def_node.name}", :s)
            ]
          )
        ]
      )
    )
  constructor.expressions << extension
  extension.parent = constructor.expressions
end
match?(node) click to toggle source
# File lib/riml/ast_rewriter.rb, line 527
def match?(node)
  node.instance_of?(DefMethodNode)
end
max_recursion_lvl() click to toggle source
# File lib/riml/ast_rewriter.rb, line 577
def max_recursion_lvl
  2
end
replace(node) click to toggle source
# File lib/riml/ast_rewriter.rb, line 531
def replace(node)
  def_node = node.to_def_node
  class_expressions = ast.expressions
  class_expressions.insert_after(class_expressions.nodes.last, def_node)
  def_node.parent = class_expressions
  # to remove it
  node.parent = class_expressions
  node.remove
  def_node.original_name = def_node.name.dup
  def_node.name.insert(0, "#{ast.name}_")
  def_node.sid = SIDNode.new
  reestablish_parents(def_node)
  extend_obj_with_methods(def_node)
end