Class: RubyNext::Language::Rewriters::Base::LocalsTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby-next/language/rewriters/base.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLocalsTracker

Returns a new instance of LocalsTracker.



32
33
34
# File 'lib/ruby-next/language/rewriters/base.rb', line 32

def initialize
  @stacks = []
end

Instance Attribute Details

#stacksObject (readonly)

Returns the value of attribute stacks.



30
31
32
# File 'lib/ruby-next/language/rewriters/base.rb', line 30

def stacks
  @stacks
end

Instance Method Details

#[](name, suffix = nil) ⇒ Object



41
42
43
44
45
46
# File 'lib/ruby-next/language/rewriters/base.rb', line 41

def [](name, suffix = nil)
  fetch(name).then do |name|
    next name unless suffix
    :"#{name}#{suffix.to_index}__"
  end
end

#fetch(name) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ruby-next/language/rewriters/base.rb', line 52

def fetch(name)
  ind = -1

  loop do
    break stacks[ind][name] if stacks[ind].key?(name)
    ind -= 1
    break if stacks[ind].nil?
  end.then do |name|
    next name unless name.nil?

    return yield if block_given?
    raise ArgumentError, "Local var not found in scope: #{name}"
  end
end

#key?(name) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/ruby-next/language/rewriters/base.rb', line 48

def key?(name)
  !!fetch(name) { false } # rubocop:disable Style/RedundantFetchBlock
end

#with(**locals) ⇒ Object



36
37
38
39
# File 'lib/ruby-next/language/rewriters/base.rb', line 36

def with(**locals)
  stacks << locals
  yield.tap { stacks.pop }
end