class RipperPlus::ScopeStack

internal class that manages the current scopes.

Constants

SCOPE_BLOCKER_9000

Public Class Methods

new() click to toggle source
# File lib/ripper-plus/scope_stack.rb, line 6
def initialize
  # simplifies algorithm to have the scope blocker be the stack base
  @stack = [SCOPE_BLOCKER_9000, Set.new]
  @in_method = false
end

Public Instance Methods

add_variable(var, allow_duplicates=true) click to toggle source
# File lib/ripper-plus/scope_stack.rb, line 28
def add_variable(var, allow_duplicates=true)
  if !allow_duplicates && @stack.last.include?(var)
    raise DuplicateArgumentError.new("duplicated argument name (#{var})")
  end
  @stack.last << var
end
has_variable?(var) click to toggle source

Checks if the given variable is in scope.

# File lib/ripper-plus/scope_stack.rb, line 57
def has_variable?(var)
  @stack.reverse_each do |scope|
    if SCOPE_BLOCKER_9000 == scope
      return false
    elsif scope.include?(var)
      return true
    end
  end
end
in_method?() click to toggle source
# File lib/ripper-plus/scope_stack.rb, line 12
def in_method?
  @in_method
end
inspect() click to toggle source

For debugging purposes

# File lib/ripper-plus/scope_stack.rb, line 17
def inspect
  middle = @stack.map do |scope|
    if SCOPE_BLOCKER_9000 == scope
      '||'
    else
      "[ #{scope.to_a.sort.join(', ')} ]"
    end
  end.join(' ')
  "< #{middle} >"
end
with_closed_scope(is_method = false) { || ... } click to toggle source

An open scope denies reference to local variables in enclosing scopes.

# File lib/ripper-plus/scope_stack.rb, line 44
def with_closed_scope(is_method = false)
  old_in_method = @in_method
  @in_method ||= is_method
  @stack.push(SCOPE_BLOCKER_9000)
  @stack.push(Set.new)
  yield
ensure
  @stack.pop  # pop closed scope
  @stack.pop  # pop scope blocker
  @in_method = old_in_method
end
with_open_scope() { || ... } click to toggle source

An open scope permits reference to local variables in enclosing scopes.

# File lib/ripper-plus/scope_stack.rb, line 36
def with_open_scope
  @stack.push(Set.new)
  yield
ensure
  @stack.pop  # pops open scope
end