@@ -67,6 +67,15 @@ public RubyNode[] reload(Nodes.ParametersNode parametersNode) {
67
67
sequence .add (parametersNode .rest .accept (this )); // Nodes.RestParameterNode is expected here
68
68
}
69
69
70
+ // ... parameter (so-called "forward arguments") means there is implicit * parameter
71
+ if (parametersNode .keyword_rest instanceof Nodes .ForwardingParameterNode ) {
72
+ restParameterIndex = parametersNode .requireds .length + parametersNode .optionals .length ;
73
+ final var readRestNode = yarpTranslator .getEnvironment ().findLocalVarNode (
74
+ TranslatorEnvironment .FORWARDED_REST_NAME ,
75
+ null );
76
+ sequence .add (readRestNode );
77
+ }
78
+
70
79
int postCount = parametersNode .posts .length ;
71
80
if (postCount > 0 ) {
72
81
index = -postCount ;
@@ -116,11 +125,8 @@ public RubyNode[] reload(Nodes.ParametersNode parametersNode) {
116
125
} else if (parametersNode .keyword_rest instanceof Nodes .NoKeywordsParameterNode ) {
117
126
// do nothing
118
127
} else if (parametersNode .keyword_rest instanceof Nodes .ForwardingParameterNode ) {
119
- // presence of ... means there are no explicit keyword arguments
120
- sequence .add (parametersNode .keyword_rest .accept (this ));
121
-
122
- // but there will be desugared rest parameter
123
- restParameterIndex = parametersNode .requireds .length + parametersNode .optionals .length ;
128
+ // do nothing - it's already handled in the #reload method
129
+ // NOTE: don't handle '&' for now as far as anonymous & isn't supported yet
124
130
} else {
125
131
throw CompilerDirectives .shouldNotReachHere ();
126
132
}
@@ -130,7 +136,14 @@ public RubyNode[] reload(Nodes.ParametersNode parametersNode) {
130
136
sequence .add (kwArgsNode );
131
137
}
132
138
133
- return Translator .flatten (sequence , true ).toArray (RubyNode .EMPTY_ARRAY );
139
+ // ... parameter (so-called "forward arguments") means there is implicit ** parameter
140
+ if (parametersNode .keyword_rest instanceof Nodes .ForwardingParameterNode ) {
141
+ final var readKeyRestNode = yarpTranslator .getEnvironment ()
142
+ .findLocalVarNode (TranslatorEnvironment .FORWARDED_KEYWORD_REST_NAME , null );
143
+ sequence .add (readKeyRestNode );
144
+ }
145
+
146
+ return sequence .toArray (RubyNode .EMPTY_ARRAY );
134
147
}
135
148
136
149
@ Override
@@ -178,19 +191,8 @@ public RubyNode visitNoKeywordsParameterNode(Nodes.NoKeywordsParameterNode node)
178
191
179
192
@ Override
180
193
public RubyNode visitForwardingParameterNode (Nodes .ForwardingParameterNode node ) {
181
- ArrayList <RubyNode > sequence = new ArrayList <>();
182
-
183
- // ... was desugared to *, ** and & parameters
184
- // NOTE: don't handle '&' for now as far as anonymous & isn't supported yet
185
- final var readRest = yarpTranslator .getEnvironment ().findLocalVarNode (TranslatorEnvironment .FORWARDED_REST_NAME ,
186
- null );
187
- final var readKeyRest = yarpTranslator .getEnvironment ()
188
- .findLocalVarNode (TranslatorEnvironment .FORWARDED_KEYWORD_REST_NAME , null );
189
-
190
- sequence .add (readRest );
191
- sequence .add (readKeyRest );
192
-
193
- return YARPTranslator .sequence (sequence );
194
+ // it's handled in the #reload method
195
+ throw CompilerDirectives .shouldNotReachHere ();
194
196
}
195
197
196
198
@ Override
0 commit comments