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, #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

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

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