Class: SyntaxTree::VarRef

Inherits:
Node
  • Object
show all
Defined in:
lib/syntax_tree/node.rb

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

Attributes inherited from Node

#location

Instance Method Summary collapse

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

#commentsObject (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

#valueObject (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_nodesObject 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