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