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.
def initialize(value:, location:) @value = value @location = location @comments = [] endPublic Instance Methods Source
def ===(other) other.is_a?(VarRef) && value === other.value endSource
def accept(visitor) visitor.visit_var_ref(self) endSource
def child_nodes [value] endSource
def copy(value: nil, location: nil) node = VarRef.new( value: value || self.value, location: location || self.location ) node.comments.concat(comments.map(&:copy)) node endSource
def deconstruct_keys(_keys) { value: value, location: location, comments: comments } endSource
def format(q) q.format(value) endSource
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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4