Class: RubyNext::Language::Rewriters::Base::LocalsTracker
- Inherits:
-
Object
- Object
- RubyNext::Language::Rewriters::Base::LocalsTracker
- Defined in:
- lib/ruby-next/language/rewriters/base.rb
Instance Attribute Summary collapse
-
#stacks ⇒ Object
readonly
Returns the value of attribute stacks.
Instance Method Summary collapse
- #[](name, suffix = nil) ⇒ Object
- #fetch(name) ⇒ Object
-
#initialize ⇒ LocalsTracker
constructor
A new instance of LocalsTracker.
- #key?(name) ⇒ Boolean
- #with(**locals) ⇒ Object
Constructor Details
#initialize ⇒ LocalsTracker
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
#stacks ⇒ Object (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
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 |