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



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

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

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