Skip to content

Commit 13e4bb0

Browse files
committed
Refactor YARPReloadArgumentsTranslato and handling of Nodes.ForwardingParameterNode
1 parent e56d197 commit 13e4bb0

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

src/main/java/org/truffleruby/parser/YARPReloadArgumentsTranslator.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ public RubyNode[] reload(Nodes.ParametersNode parametersNode) {
6767
sequence.add(parametersNode.rest.accept(this)); // Nodes.RestParameterNode is expected here
6868
}
6969

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+
7079
int postCount = parametersNode.posts.length;
7180
if (postCount > 0) {
7281
index = -postCount;
@@ -116,11 +125,8 @@ public RubyNode[] reload(Nodes.ParametersNode parametersNode) {
116125
} else if (parametersNode.keyword_rest instanceof Nodes.NoKeywordsParameterNode) {
117126
// do nothing
118127
} 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
124130
} else {
125131
throw CompilerDirectives.shouldNotReachHere();
126132
}
@@ -130,7 +136,14 @@ public RubyNode[] reload(Nodes.ParametersNode parametersNode) {
130136
sequence.add(kwArgsNode);
131137
}
132138

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);
134147
}
135148

136149
@Override
@@ -178,19 +191,8 @@ public RubyNode visitNoKeywordsParameterNode(Nodes.NoKeywordsParameterNode node)
178191

179192
@Override
180193
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();
194196
}
195197

196198
@Override

0 commit comments

Comments
 (0)