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

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

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

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