@@ -4,9 +4,15 @@ module Parser
44
55 class StaticEnvironment
66 FORWARD_ARGS = :FORWARD_ARGS
7- ANONYMOUS_BLOCKARG = :ANONYMOUS_BLOCKARG
8- ANONYMOUS_RESTARG = :ANONYMOUS_RESTARG
9- ANONYMOUS_KWRESTARG = :ANONYMOUS_KWRESTARG
7+
8+ ANONYMOUS_RESTARG_IN_CURRENT_SCOPE = :ANONYMOUS_RESTARG_IN_CURRENT_SCOPE
9+ ANONYMOUS_RESTARG_INHERITED = :ANONYMOUS_RESTARG_INHERITED
10+
11+ ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE = :ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE
12+ ANONYMOUS_KWRESTARG_INHERITED = :ANONYMOUS_KWRESTARG_INHERITED
13+
14+ ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE = :ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE
15+ ANONYMOUS_BLOCKARG_INHERITED = :ANONYMOUS_BLOCKARG_INHERITED
1016
1117 def initialize
1218 reset
@@ -27,6 +33,15 @@ def extend_static
2733 def extend_dynamic
2834 @stack . push ( @variables )
2935 @variables = @variables . dup
36+ if @variables . delete ( ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE )
37+ @variables . add ( ANONYMOUS_BLOCKARG_INHERITED )
38+ end
39+ if @variables . delete ( ANONYMOUS_RESTARG_IN_CURRENT_SCOPE )
40+ @variables . add ( ANONYMOUS_RESTARG_INHERITED )
41+ end
42+ if @variables . delete ( ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE )
43+ @variables . add ( ANONYMOUS_KWRESTARG_INHERITED )
44+ end
3045
3146 self
3247 end
@@ -47,6 +62,8 @@ def declared?(name)
4762 @variables . include? ( name . to_sym )
4863 end
4964
65+ # Forward args
66+
5067 def declare_forward_args
5168 declare ( FORWARD_ARGS )
5269 end
@@ -55,40 +72,58 @@ def declared_forward_args?
5572 declared? ( FORWARD_ARGS )
5673 end
5774
75+ # Anonymous blockarg
76+
5877 def declare_anonymous_blockarg
59- declare ( ANONYMOUS_BLOCKARG )
78+ declare ( ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE )
6079 end
6180
6281 def declared_anonymous_blockarg?
63- declared? ( ANONYMOUS_BLOCKARG )
82+ declared? ( ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE ) || declared? ( ANONYMOUS_BLOCKARG_INHERITED )
83+ end
84+
85+ def declared_anonymous_blockarg_in_current_scpe?
86+ declared? ( ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE )
6487 end
6588
6689 def parent_has_anonymous_blockarg?
67- @stack . any? { |variables | variables . include? ( ANONYMOUS_BLOCKARG ) }
90+ @stack . any? { |variables | variables . include? ( ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE ) }
6891 end
6992
93+ # Anonymous restarg
94+
7095 def declare_anonymous_restarg
71- declare ( ANONYMOUS_RESTARG )
96+ declare ( ANONYMOUS_RESTARG_IN_CURRENT_SCOPE )
7297 end
7398
7499 def declared_anonymous_restarg?
75- declared? ( ANONYMOUS_RESTARG )
100+ declared? ( ANONYMOUS_RESTARG_IN_CURRENT_SCOPE ) || declared? ( ANONYMOUS_RESTARG_INHERITED )
101+ end
102+
103+ def declared_anonymous_restarg_in_current_scope?
104+ declared? ( ANONYMOUS_RESTARG_IN_CURRENT_SCOPE )
76105 end
77106
78107 def parent_has_anonymous_restarg?
79- @stack . any? { |variables | variables . include? ( ANONYMOUS_RESTARG ) }
108+ @stack . any? { |variables | variables . include? ( ANONYMOUS_RESTARG_IN_CURRENT_SCOPE ) }
80109 end
81110
111+ # Anonymous kwresarg
112+
82113 def declare_anonymous_kwrestarg
83- declare ( ANONYMOUS_KWRESTARG )
114+ declare ( ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE )
84115 end
85116
86117 def declared_anonymous_kwrestarg?
87- declared? ( ANONYMOUS_KWRESTARG )
118+ declared? ( ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE ) || declared? ( ANONYMOUS_KWRESTARG_INHERITED )
119+ end
120+
121+ def declared_anonymous_kwrestarg_in_current_scope?
122+ declared? ( ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE )
88123 end
89124
90125 def parent_has_anonymous_kwrestarg?
91- @stack . any? { |variables | variables . include? ( ANONYMOUS_KWRESTARG ) }
126+ @stack . any? { |variables | variables . include? ( ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE ) }
92127 end
93128
94129 def empty?
0 commit comments