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
11421 11422 11423 11424 11425 |
# File 'lib/syntax_tree/node.rb', line 11421 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
11419 11420 11421 |
# File 'lib/syntax_tree/node.rb', line 11419 def comments @comments end |
#value ⇒ Object (readonly)
- Const | CVar | GVar | Ident | IVar | Kw
-
the value of this node
11416 11417 11418 |
# File 'lib/syntax_tree/node.rb', line 11416 def value @value end |
Instance Method Details
#===(other) ⇒ Object
11456 11457 11458 |
# File 'lib/syntax_tree/node.rb', line 11456 def ===(other) other.is_a?(VarRef) && value === other.value end |
#accept(visitor) ⇒ Object
11427 11428 11429 |
# File 'lib/syntax_tree/node.rb', line 11427 def accept(visitor) visitor.visit_var_ref(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
11431 11432 11433 |
# File 'lib/syntax_tree/node.rb', line 11431 def child_nodes [value] end |
#copy(value: nil, location: nil) ⇒ Object
11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 |
# File 'lib/syntax_tree/node.rb', line 11435 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
11448 11449 11450 |
# File 'lib/syntax_tree/node.rb', line 11448 def deconstruct_keys(_keys) { value: value, location: location, comments: comments } end |
#format(q) ⇒ Object
11452 11453 11454 |
# File 'lib/syntax_tree/node.rb', line 11452 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.
11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 |
# File 'lib/syntax_tree/node.rb', line 11467 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 |