Skip to content

Commit 8af86b0

Browse files
authored
+ ruby{33,34}.y: allow blocks inherit anonymous args. (#1010)
This commit tracks upstream commit ruby/ruby@596db9c.
1 parent 570e065 commit 8af86b0

File tree

4 files changed

+83
-18
lines changed

4 files changed

+83
-18
lines changed

lib/parser/ruby33.y

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,7 @@ rule
11011101
end
11021102
11031103
if @context.in_dynamic_block? && context.in_def &&
1104-
@static_env.declared_anonymous_blockarg? && @static_env.parent_has_anonymous_blockarg?
1104+
@static_env.declared_anonymous_blockarg_in_current_scpe? && @static_env.parent_has_anonymous_blockarg?
11051105
diagnostic :error, :ambiguous_anonymous_blockarg, nil, val[0]
11061106
end
11071107
@@ -1142,7 +1142,7 @@ rule
11421142
end
11431143
11441144
if @context.in_dynamic_block? && context.in_def &&
1145-
@static_env.declared_anonymous_restarg? && @static_env.parent_has_anonymous_restarg?
1145+
@static_env.declared_anonymous_restarg_in_current_scope? && @static_env.parent_has_anonymous_restarg?
11461146
diagnostic :error, :ambiguous_anonymous_restarg, nil, val[0]
11471147
end
11481148
@@ -3059,7 +3059,7 @@ f_opt_paren_args: f_paren_args
30593059
end
30603060
30613061
if @context.in_dynamic_block? && context.in_def &&
3062-
@static_env.declared_anonymous_kwrestarg? && @static_env.parent_has_anonymous_kwrestarg?
3062+
@static_env.declared_anonymous_kwrestarg_in_current_scope? && @static_env.parent_has_anonymous_kwrestarg?
30633063
diagnostic :error, :ambiguous_anonymous_kwrestarg, nil, val[0]
30643064
end
30653065

lib/parser/ruby34.y

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,7 @@ rule
11011101
end
11021102
11031103
if @context.in_dynamic_block? && context.in_def &&
1104-
@static_env.declared_anonymous_blockarg? && @static_env.parent_has_anonymous_blockarg?
1104+
@static_env.declared_anonymous_blockarg_in_current_scpe? && @static_env.parent_has_anonymous_blockarg?
11051105
diagnostic :error, :ambiguous_anonymous_blockarg, nil, val[0]
11061106
end
11071107
@@ -1142,7 +1142,7 @@ rule
11421142
end
11431143
11441144
if @context.in_dynamic_block? && context.in_def &&
1145-
@static_env.declared_anonymous_restarg? && @static_env.parent_has_anonymous_restarg?
1145+
@static_env.declared_anonymous_restarg_in_current_scope? && @static_env.parent_has_anonymous_restarg?
11461146
diagnostic :error, :ambiguous_anonymous_restarg, nil, val[0]
11471147
end
11481148
@@ -3059,7 +3059,7 @@ f_opt_paren_args: f_paren_args
30593059
end
30603060
30613061
if @context.in_dynamic_block? && context.in_def &&
3062-
@static_env.declared_anonymous_kwrestarg? && @static_env.parent_has_anonymous_kwrestarg?
3062+
@static_env.declared_anonymous_kwrestarg_in_current_scope? && @static_env.parent_has_anonymous_kwrestarg?
30633063
diagnostic :error, :ambiguous_anonymous_kwrestarg, nil, val[0]
30643064
end
30653065

lib/parser/static_environment.rb

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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?

test/test_parser.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11497,4 +11497,34 @@ def test_parser_bug_989
1149711497
%q{},
1149811498
ALL_VERSIONS)
1149911499
end
11500+
11501+
def test_parser_bug_19370
11502+
refute_diagnoses(
11503+
'def b(&) ->() {c(&)} end',
11504+
SINCE_3_3)
11505+
11506+
refute_diagnoses(
11507+
'def b(*) ->() {c(*)} end',
11508+
SINCE_3_3)
11509+
11510+
refute_diagnoses(
11511+
'def b(a, *) ->() {c(1, *)} end',
11512+
SINCE_3_3)
11513+
11514+
refute_diagnoses(
11515+
'def b(*) ->(a) {c(*)} end',
11516+
SINCE_3_3)
11517+
11518+
refute_diagnoses(
11519+
'def b(**) ->() {c(**)} end',
11520+
SINCE_3_3)
11521+
11522+
refute_diagnoses(
11523+
'def b(k:, **) ->() {c(k: 1, **)} end',
11524+
SINCE_3_3)
11525+
11526+
refute_diagnoses(
11527+
'def b(**) ->(k:) {c(**)} end',
11528+
SINCE_3_3)
11529+
end
1150011530
end

0 commit comments

Comments
 (0)