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
Public Class Methods
Source
# File lib/syntax_tree/node.rb, line 11603 def initialize(value:, location:) @value = value @location = location @comments = [] end
Public Instance Methods
Source
# File lib/syntax_tree/node.rb, line 11638 def ===(other) other.is_a?(VarRef) && value === other.value end
Source
# File lib/syntax_tree/node.rb, line 11609 def accept(visitor) visitor.visit_var_ref(self) end
Source
# File lib/syntax_tree/node.rb, line 11613 def child_nodes [value] end
Also aliased as: deconstruct
Source
# File lib/syntax_tree/node.rb, line 11617 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
Source
# File lib/syntax_tree/node.rb, line 11630 def deconstruct_keys(_keys) { value: value, location: location, comments: comments } end
Source
# File lib/syntax_tree/node.rb, line 11649 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 elsif value.is_a?(Array) && (index = value.index { |(_k, v)| v == self }) parent.public_send(key)[index][1] = replace break end end end
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.