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.
11588 11589 11590 11591 11592 |
# File 'lib/syntax_tree/node.rb', line 11588 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
11586 11587 11588 |
# File 'lib/syntax_tree/node.rb', line 11586 def comments @comments end |
#value ⇒ Object (readonly)
- Const | CVar | GVar | Ident | IVar | Kw
-
the value of this node
11583 11584 11585 |
# File 'lib/syntax_tree/node.rb', line 11583 def value @value end |
Instance Method Details
#===(other) ⇒ Object
11623 11624 11625 |
# File 'lib/syntax_tree/node.rb', line 11623 def ===(other) other.is_a?(VarRef) && value === other.value end |
#accept(visitor) ⇒ Object
11594 11595 11596 |
# File 'lib/syntax_tree/node.rb', line 11594 def accept(visitor) visitor.visit_var_ref(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
11598 11599 11600 |
# File 'lib/syntax_tree/node.rb', line 11598 def child_nodes [value] end |
#copy(value: nil, location: nil) ⇒ Object
11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 |
# 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_keys(_keys) ⇒ Object
11615 11616 11617 |
# File 'lib/syntax_tree/node.rb', line 11615 def deconstruct_keys(_keys) { value: value, location: location, comments: comments } end |
#format(q) ⇒ Object
11619 11620 11621 |
# File 'lib/syntax_tree/node.rb', line 11619 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.
11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 |
# 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 |