class TypeProf::Core::AST::LocalVariableReadNode::LocalVariableWriteNode::InstanceVariableReadNode::InstanceVariableWriteNode

Attributes

rhs[R]
var[R]
var_code_range[R]

Public Class Methods

new(raw_node, rhs, lenv) click to toggle source
Calls superclass method TypeProf::Core::AST::Node::new
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 79
def initialize(raw_node, rhs, lenv)
  super(raw_node, lenv)
  @var = raw_node.name
  @var_code_range = TypeProf::CodeRange.from_node(raw_node.respond_to?(:name_loc) ? raw_node.name_loc : raw_node)
  @rhs = rhs
end

Public Instance Methods

attrs(= { var: }) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 89
  def attrs = { var: }

  def define0(genv)
    @rhs.define(genv) if @rhs
    case @lenv.cref.scope_level
    when :class, :instance
      val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val.add_def(self)
      val
    else
      # TODO: warn
      nil
    end
  end

  def define_copy(genv)
    case @lenv.cref.scope_level
    when :class, :instance
      val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val.add_def(self)
      val.remove_def(@prev_node)
    end
    super(genv)
  end

  def undefine0(genv)
    case @lenv.cref.scope_level
    when :class, :instance
      val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val.remove_def(self)
    end
    @rhs.undefine(genv) if @rhs
  end

  def install0(genv)
    val = @rhs.install(genv)
    case @lenv.cref.scope_level
    when :class, :instance
      @changes.add_ivar_read_box(genv, @lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val = val.new_vertex(genv, self) # avoid multi-edge from val to static_ret.vtx
      @changes.add_edge(genv, val, @static_ret.vtx)
    end
    val
  end

  def retrieve_at(pos, &blk)
    yield self if @var_code_range && @var_code_range.include?(pos)
    super(pos, &blk)
  end
end
define0(genv) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 91
def define0(genv)
  @rhs.define(genv) if @rhs
  case @lenv.cref.scope_level
  when :class, :instance
    val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
    val.add_def(self)
    val
  else
    # TODO: warn
    nil
  end
end
define_copy(genv) click to toggle source
Calls superclass method TypeProf::Core::AST::Node#define_copy
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 104
def define_copy(genv)
  case @lenv.cref.scope_level
  when :class, :instance
    val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
    val.add_def(self)
    val.remove_def(@prev_node)
  end
  super(genv)
end
install0(genv) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 123
def install0(genv)
  val = @rhs.install(genv)
  case @lenv.cref.scope_level
  when :class, :instance
    @changes.add_ivar_read_box(genv, @lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
    val = val.new_vertex(genv, self) # avoid multi-edge from val to static_ret.vtx
    @changes.add_edge(genv, val, @static_ret.vtx)
  end
  val
end
retrieve_at(pos) { |self| ... } click to toggle source
Calls superclass method TypeProf::Core::AST::Node#retrieve_at
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 134
def retrieve_at(pos, &blk)
  yield self if @var_code_range && @var_code_range.include?(pos)
  super(pos, &blk)
end
subnodes(= { rhs: }) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 88
  def subnodes = { rhs: }
  def attrs = { var: }

  def define0(genv)
    @rhs.define(genv) if @rhs
    case @lenv.cref.scope_level
    when :class, :instance
      val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val.add_def(self)
      val
    else
      # TODO: warn
      nil
    end
  end

  def define_copy(genv)
    case @lenv.cref.scope_level
    when :class, :instance
      val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val.add_def(self)
      val.remove_def(@prev_node)
    end
    super(genv)
  end

  def undefine0(genv)
    case @lenv.cref.scope_level
    when :class, :instance
      val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val.remove_def(self)
    end
    @rhs.undefine(genv) if @rhs
  end

  def install0(genv)
    val = @rhs.install(genv)
    case @lenv.cref.scope_level
    when :class, :instance
      @changes.add_ivar_read_box(genv, @lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
      val = val.new_vertex(genv, self) # avoid multi-edge from val to static_ret.vtx
      @changes.add_edge(genv, val, @static_ret.vtx)
    end
    val
  end

  def retrieve_at(pos, &blk)
    yield self if @var_code_range && @var_code_range.include?(pos)
    super(pos, &blk)
  end
end

class GlobalVariableReadNode < Node
  def initialize(raw_node, lenv)
    super(raw_node, lenv)
    @var = raw_node.name
  end

  attr_reader :var

  def attrs = { var: }

  def install0(genv)
    box = @changes.add_gvar_read_box(genv, @var)
    box.ret
  end

  def retrieve_at(pos)
    yield self if code_range.include?(pos)
  end
end

class GlobalVariableWriteNode < Node
  def initialize(raw_node, rhs, lenv)
    super(raw_node, lenv)
    @var = raw_node.name
    @var_code_range = TypeProf::CodeRange.from_node(raw_node.respond_to?(:name_loc) ? raw_node.name_loc : raw_node)
    @rhs = rhs
  end

  attr_reader :var, :var_code_range, :rhs

  def subnodes = { rhs: }
  def attrs = { var: }

  def define0(genv)
    @rhs.define(genv) if @rhs
    val = genv.resolve_gvar(@var)
    val.add_def(self)
    val
  end

  def define_copy(genv)
    val = genv.resolve_gvar(@var)
    val.add_def(self)
    val.remove_def(@prev_node)
    super(genv)
  end

  def undefine0(genv)
    val = genv.resolve_gvar(@var)
    val.remove_def(self)
    @rhs.undefine(genv) if @rhs
  end

  def install0(genv)
    val = @rhs.install(genv)
    val = val.new_vertex(genv, self) # avoid multi-edge from val to static_ret.vtx
    @changes.add_edge(genv, val, @static_ret.vtx)
    val
  end

  def retrieve_at(pos, &blk)
    yield self if @var_code_range && @var_code_range.include?(pos)
    super(pos, &blk)
  end
end

class AliasGlobalVariableNode < Node
  def initialize(raw_node, lenv)
    super(raw_node, lenv)
    # XXX: Who use this? I want to hard-code English.rb
  end

  def install0(genv)
    Source.new(genv.nil_type)
  end
end

class PostExecutionNode < Node
  def initialize(raw_node, lenv)
    super(raw_node, lenv)
    @body = raw_node.statements ? AST.create_node(raw_node.statements, lenv) : DummyNilNode.new(TypeProf::CodeRange.new(code_range.last, code_range.last), lenv)
  end

  attr_reader :body

  def subnodes = { body: }

  def install0(genv)
    @body.install(genv)
    Source.new(genv.nil_type)
  end
end

class ClassVariableWriteNode < Node
  def initialize(raw_node, rhs, lenv)
    super(raw_node, lenv)
    @var = raw_node.name
    @var_code_range = TypeProf::CodeRange.from_node(raw_node.respond_to?(:name_loc) ? raw_node.name_loc : raw_node)
    @rhs = rhs
  end

  attr_reader :var, :var_code_range, :rhs

  def subnodes = { rhs: }
  def attrs = { var: }

  def define0(genv)
    @rhs.define(genv) if @rhs
    mod = genv.resolve_cvar(@lenv.cref.cpath, @var)
    mod.add_def(self)
    mod
  end

  def define_copy(genv)
    mod = genv.resolve_cvar(@lenv.cref.cpath, @var)
    mod.add_def(self)
    mod.remove_def(@prev_node)
    super(genv)
  end

  def undefine0(genv)
    mod = genv.resolve_cvar(@lenv.cref.cpath, @var)
    mod.remove_def(self)
    @rhs.undefine(genv) if @rhs
  end

  def install0(genv)
    @changes.add_cvar_read_box(genv, @lenv.cref.cpath, @var)
    val = @rhs.install(genv)
    val = val.new_vertex(genv, self) # avoid multi-edge from val to static_ret.vtx
    @changes.add_edge(genv, val, @static_ret.vtx)
    val
  end

  def retrieve_at(pos, &blk)
    yield self if @var_code_range && @var_code_range.include?(pos)
    super(pos, &blk)
  end
end

class ClassVariableReadNode < Node
  def initialize(raw_node, lenv)
    super(raw_node, lenv)
    @var = raw_node.name
  end

  attr_reader :var

  def attrs = { var: }

  def install0(genv)
    box = @changes.add_cvar_read_box(genv, lenv.cref.cpath, @var)
    @lenv.apply_read_filter(genv, self, @var, box.ret)
  end

  def retrieve_at(pos)
    yield self if code_range.include?(pos)
  end
end

class RegexpReferenceReadNode < Node
  def initialize(raw_node, lenv)
    super(raw_node, lenv)
    @var = raw_node.type == :back_reference_read_node ? :"$&" : :"$#{raw_node.number}"
  end

  attr_reader :var

  def attrs = { var: }

  def install0(genv)
    Source.new(genv
undefine0(genv) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/variable.rb, line 114
def undefine0(genv)
  case @lenv.cref.scope_level
  when :class, :instance
    val = genv.resolve_ivar(@lenv.cref.cpath, @lenv.cref.scope_level == :class, @var)
    val.remove_def(self)
  end
  @rhs.undefine(genv) if @rhs
end