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
Returns a new instance of VarRef.
11412 11413 11414 11415 11416 |
# File 'lib/syntax_tree/node.rb', line 11412 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
11410 11411 11412 |
# File 'lib/syntax_tree/node.rb', line 11410 def comments @comments end |
#value ⇒ Object (readonly)
- Const | CVar | GVar | Ident | IVar | Kw
-
the value of this node
11407 11408 11409 |
# File 'lib/syntax_tree/node.rb', line 11407 def value @value end |
Instance Method Details
#===(other) ⇒ Object
11447 11448 11449 |
# File 'lib/syntax_tree/node.rb', line 11447 def ===(other) other.is_a?(VarRef) && value === other.value end |
#accept(visitor) ⇒ Object
11418 11419 11420 |
# File 'lib/syntax_tree/node.rb', line 11418 def accept(visitor) visitor.visit_var_ref(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
11422 11423 11424 |
# File 'lib/syntax_tree/node.rb', line 11422 def child_nodes [value] end |
#copy(value: nil, location: nil) ⇒ Object
11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 |
# File 'lib/syntax_tree/node.rb', line 11426 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
11439 11440 11441 |
# File 'lib/syntax_tree/node.rb', line 11439 def deconstruct_keys(_keys) { value: value, location: location, comments: comments } end |
#format(q) ⇒ Object
11443 11444 11445 |
# File 'lib/syntax_tree/node.rb', line 11443 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.
11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 |
# File 'lib/syntax_tree/node.rb', line 11458 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 |