Class: SyntaxTree::VarRef
Overview
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.
Instance Attribute Summary collapse
-
#comments ⇒ Object
readonly
- Array[ Comment | EmbDoc ]
-
the comments attached to this node.
-
#value ⇒ Object
readonly
- Const | CVar | GVar | Ident | IVar | Kw
-
the value of this node.
Attributes inherited from Node
Instance Method Summary collapse
- #===(other) ⇒ Object
- #accept(visitor) ⇒ Object
- #child_nodes ⇒ Object (also: #deconstruct)
- #copy(value: nil, location: nil) ⇒ Object
- #deconstruct_keys(_keys) ⇒ Object
- #format(q) ⇒ Object
-
#initialize(value:, location:) ⇒ VarRef
constructor
A new instance of VarRef.
-
#pin(parent, pin) ⇒ Object
Oh man I hate this so much.
Methods inherited from Node
#construct_keys, #end_char, #pretty_print, #start_char, #to_json, #to_mermaid
Constructor Details
#initialize(value:, location:) ⇒ VarRef
Returns a new instance of VarRef.
11540 11541 11542 11543 11544 |
# File 'lib/syntax_tree/node.rb', line 11540 def initialize(value:, location:) @value = value @location = location @comments = [] end |
Instance Attribute Details
#comments ⇒ Object (readonly)
- Array[ Comment | EmbDoc ]
-
the comments attached to this node
11538 11539 11540 |
# File 'lib/syntax_tree/node.rb', line 11538 def comments @comments end |
#value ⇒ Object (readonly)
- Const | CVar | GVar | Ident | IVar | Kw
-
the value of this node
11535 11536 11537 |
# File 'lib/syntax_tree/node.rb', line 11535 def value @value end |
Instance Method Details
#===(other) ⇒ Object
11575 11576 11577 |
# File 'lib/syntax_tree/node.rb', line 11575 def ===(other) other.is_a?(VarRef) && value === other.value end |
#accept(visitor) ⇒ Object
11546 11547 11548 |
# File 'lib/syntax_tree/node.rb', line 11546 def accept(visitor) visitor.visit_var_ref(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
11550 11551 11552 |
# File 'lib/syntax_tree/node.rb', line 11550 def child_nodes [value] end |
#copy(value: nil, location: nil) ⇒ Object
11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 |
# File 'lib/syntax_tree/node.rb', line 11554 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_keys(_keys) ⇒ Object
11567 11568 11569 |
# File 'lib/syntax_tree/node.rb', line 11567 def deconstruct_keys(_keys) { value: value, location: location, comments: comments } end |
#format(q) ⇒ Object
11571 11572 11573 |
# File 'lib/syntax_tree/node.rb', line 11571 def format(q) q.format(value) end |
#pin(parent, pin) ⇒ Object
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.
11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 |
# File 'lib/syntax_tree/node.rb', line 11586 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 |