class SyntaxTree::VarRef

VarRef represents a variable reference.

true

This can be a plain local variable like the example above. It can also be a constant, a class variable, a global variable, an instance variable, a keyword (like self, nil, true, or false), or a numbered block variable.

Attributes

comments[R]
Array[ Comment | EmbDoc ]

the comments attached to this node

value[R]
Const | CVar | GVar | Ident | IVar | Kw

the value of this node

Public Class Methods

new(value:, location:) click to toggle source
# File lib/syntax_tree/node.rb, line 11588
def initialize(value:, location:)
  @value = value
  @location = location
  @comments = []
end

Public Instance Methods

===(other) click to toggle source
# File lib/syntax_tree/node.rb, line 11623
def ===(other)
  other.is_a?(VarRef) && value === other.value
end
accept(visitor) click to toggle source
# File lib/syntax_tree/node.rb, line 11594
def accept(visitor)
  visitor.visit_var_ref(self)
end
child_nodes() click to toggle source
# File lib/syntax_tree/node.rb, line 11598
def child_nodes
  [value]
end
Also aliased as: deconstruct
copy(value: nil, location: nil) click to toggle source
# File lib/syntax_tree/node.rb, line 11602
def copy(value: nil, location: nil)
  node =
    VarRef.new(
      value: value || self.value,
      location: location || self.location
    )

  node.comments.concat(comments.map(&:copy))
  node
end
deconstruct()
Alias for: child_nodes
deconstruct_keys(_keys) click to toggle source
# File lib/syntax_tree/node.rb, line 11615
def deconstruct_keys(_keys)
  { value: value, location: location, comments: comments }
end
format(q) click to toggle source
# File lib/syntax_tree/node.rb, line 11619
def format(q)
  q.format(value)
end
pin(parent, pin) click to toggle source

Oh man I hate this so much. Basically, ripper doesn’t provide enough functionality to actually know where pins are within an expression. So we have to walk the tree ourselves and insert more information. In doing so, we have to replace this node by a pinned node when necessary.

To be clear, this method should just not exist. It’s not good. It’s a place of shame. But it’s necessary for now, so I’m keeping it.

# File lib/syntax_tree/node.rb, line 11634
def pin(parent, pin)
  replace =
    PinnedVarRef.new(value: value, location: pin.location.to(location))

  parent
    .deconstruct_keys([])
    .each do |key, value|
      if value == self
        parent.instance_variable_set(:"@#{key}", replace)
        break
      elsif value.is_a?(Array) && (index = value.index(self))
        parent.public_send(key)[index] = replace
        break
      end
    end
end