1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
# frozen_string_literal: true
module Parser
class StaticEnvironment
FORWARD_ARGS = :FORWARD_ARGS
ANONYMOUS_RESTARG_IN_CURRENT_SCOPE = :ANONYMOUS_RESTARG_IN_CURRENT_SCOPE
ANONYMOUS_RESTARG_INHERITED = :ANONYMOUS_RESTARG_INHERITED
ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE = :ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE
ANONYMOUS_KWRESTARG_INHERITED = :ANONYMOUS_KWRESTARG_INHERITED
ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE = :ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE
ANONYMOUS_BLOCKARG_INHERITED = :ANONYMOUS_BLOCKARG_INHERITED
def initialize
reset
end
def reset
@variables = Set[]
@stack = []
end
def extend_static
@stack.push(@variables)
@variables = Set[]
self
end
def extend_dynamic
@stack.push(@variables)
@variables = @variables.dup
if @variables.delete(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE)
@variables.add(ANONYMOUS_BLOCKARG_INHERITED)
end
if @variables.delete(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE)
@variables.add(ANONYMOUS_RESTARG_INHERITED)
end
if @variables.delete(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE)
@variables.add(ANONYMOUS_KWRESTARG_INHERITED)
end
self
end
def unextend
@variables = @stack.pop
self
end
def declare(name)
@variables.add(name.to_sym)
self
end
def declared?(name)
@variables.include?(name.to_sym)
end
# Forward args
def declare_forward_args
declare(FORWARD_ARGS)
end
def declared_forward_args?
declared?(FORWARD_ARGS)
end
# Anonymous blockarg
def declare_anonymous_blockarg
declare(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE)
end
def declared_anonymous_blockarg?
declared?(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE) || declared?(ANONYMOUS_BLOCKARG_INHERITED)
end
def declared_anonymous_blockarg_in_current_scpe?
declared?(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE)
end
def parent_has_anonymous_blockarg?
@stack.any? { |variables| variables.include?(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE) }
end
# Anonymous restarg
def declare_anonymous_restarg
declare(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE)
end
def declared_anonymous_restarg?
declared?(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE) || declared?(ANONYMOUS_RESTARG_INHERITED)
end
def declared_anonymous_restarg_in_current_scope?
declared?(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE)
end
def parent_has_anonymous_restarg?
@stack.any? { |variables| variables.include?(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE) }
end
# Anonymous kwresarg
def declare_anonymous_kwrestarg
declare(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE)
end
def declared_anonymous_kwrestarg?
declared?(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE) || declared?(ANONYMOUS_KWRESTARG_INHERITED)
end
def declared_anonymous_kwrestarg_in_current_scope?
declared?(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE)
end
def parent_has_anonymous_kwrestarg?
@stack.any? { |variables| variables.include?(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE) }
end
def empty?
@stack.empty?
end
end
end
|