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) ⇒ Object
Oh man I hate this so much.
Methods inherited from Node
#construct_keys, #pretty_print, #to_json
Constructor Details
#initialize(value:, location:) ⇒ VarRef
11447 11448 11449 11450 11451 |
# File 'lib/syntax_tree/node.rb', line 11447 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
11445 11446 11447 |
# File 'lib/syntax_tree/node.rb', line 11445 def comments @comments end |
#value ⇒ Object (readonly)
- Const | CVar | GVar | Ident | IVar | Kw
-
the value of this node
11442 11443 11444 |
# File 'lib/syntax_tree/node.rb', line 11442 def value @value end |
Instance Method Details
#===(other) ⇒ Object
11482 11483 11484 |
# File 'lib/syntax_tree/node.rb', line 11482 def ===(other) other.is_a?(VarRef) && value === other.value end |
#accept(visitor) ⇒ Object
11453 11454 11455 |
# File 'lib/syntax_tree/node.rb', line 11453 def accept(visitor) visitor.visit_var_ref(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
11457 11458 11459 |
# File 'lib/syntax_tree/node.rb', line 11457 def child_nodes [value] end |
#copy(value: nil, location: nil) ⇒ Object
11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 |
# File 'lib/syntax_tree/node.rb', line 11461 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
11474 11475 11476 |
# File 'lib/syntax_tree/node.rb', line 11474 def deconstruct_keys(_keys) { value: value, location: location, comments: comments } end |
#format(q) ⇒ Object
11478 11479 11480 |
# File 'lib/syntax_tree/node.rb', line 11478 def format(q) q.format(value) end |
#pin(parent) ⇒ 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.
11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 |
# File 'lib/syntax_tree/node.rb', line 11493 def pin(parent) replace = PinnedVarRef.new(value: value, location: 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 |