Skip to content

Commit 61fc796

Browse files
committed
modernize buildAssignment()
1 parent c7d57c5 commit 61fc796

1 file changed

Lines changed: 33 additions & 39 deletions

File tree

src/main/java/org/jruby/prism/builder/IRBuilderPrism.java

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -378,49 +378,43 @@ private Operand buildArray(ArrayNode node) {
378378
return result;
379379
}
380380

381+
private Node[] argumentsFrom(ArgumentsNode node) {
382+
return node == null ? Node.EMPTY_ARRAY : node.arguments;
383+
}
384+
381385
// This method is called to build assignments for a multiple-assignment instruction
382386
protected void buildAssignment(Node node, Operand rhsVal) {
383387
if (node == null) return; // case of 'a, = something'
384388

385-
if (node instanceof CallTargetNode call) {
386-
buildCallTarget(call, build(call.receiver), rhsVal);
387-
} else if (node instanceof IndexTargetNode) {
388-
Node[] arguments = ((IndexTargetNode) node).arguments == null ? Node.EMPTY_ARRAY : ((IndexTargetNode) node).arguments.arguments;
389-
buildAttrAssignAssignment(((IndexTargetNode) node).receiver, symbol("[]="), arguments, rhsVal);
390-
} else if (node instanceof ClassVariableTargetNode) {
391-
addInstr(new PutClassVariableInstr(classVarDefinitionContainer(), ((ClassVariableTargetNode) node).name, rhsVal));
392-
} else if (node instanceof ConstantPathTargetNode) {
393-
Operand parent = buildModuleParent(((ConstantPathTargetNode) node).parent);
394-
RubySymbol name = ((ConstantPathTargetNode) node).name;
395-
addInstr(new PutConstInstr(parent, name, rhsVal));
396-
} else if (node instanceof ConstantTargetNode) {
397-
addInstr(new PutConstInstr(getCurrentModuleVariable(), ((ConstantTargetNode) node).name, rhsVal));
398-
} else if (node instanceof LocalVariableTargetNode) {
399-
LocalVariableTargetNode variable = (LocalVariableTargetNode) node;
400-
copy(getLocalVariable(variable.name, variable.depth), rhsVal);
401-
} else if (node instanceof GlobalVariableTargetNode) {
402-
addInstr(new PutGlobalVarInstr(((GlobalVariableTargetNode) node).name, rhsVal));
403-
} else if (node instanceof InstanceVariableTargetNode) {
404-
addInstr(new PutFieldInstr(buildSelf(), ((InstanceVariableTargetNode) node).name, rhsVal));
405-
} else if (node instanceof MultiTargetNode) {
406-
var multi = (MultiTargetNode) node;
407-
Variable rhs = addResultInstr(new ToAryInstr(temp(), rhsVal));
408-
Map<Node, Operand> reads = new HashMap<>();
409-
final List<Tuple<Node, ResultInstr>> assigns = new ArrayList<>(4);
410-
buildMultiAssignment(multi.lefts, multi.rest, multi.rights, rhs, reads, assigns);
411-
412-
for (Tuple<Node, ResultInstr> assign: assigns) {
413-
addInstr((Instr) assign.b);
414-
}
389+
switch (node) {
390+
case CallTargetNode call -> buildCallTarget(call, build(call.receiver), rhsVal);
391+
case IndexTargetNode index -> buildAttrAssignAssignment(index.receiver, symbol("[]="),
392+
argumentsFrom(index.arguments), rhsVal);
393+
case ClassVariableTargetNode cvar ->
394+
addInstr(new PutClassVariableInstr(classVarDefinitionContainer(), cvar.name, rhsVal));
395+
case ConstantPathTargetNode cpath ->
396+
addInstr(new PutConstInstr(buildModuleParent(cpath.parent), cpath.name, rhsVal));
397+
case ConstantTargetNode constant ->
398+
addInstr(new PutConstInstr(getCurrentModuleVariable(), constant.name, rhsVal));
399+
case LocalVariableTargetNode lvar -> copy(getLocalVariable(lvar.name, lvar.depth), rhsVal);
400+
case GlobalVariableTargetNode gvar -> addInstr(new PutGlobalVarInstr(gvar.name, rhsVal));
401+
case InstanceVariableTargetNode ivar -> addInstr(new PutFieldInstr(buildSelf(), ivar.name, rhsVal));
402+
case MultiTargetNode multi -> {
403+
Variable rhs = addResultInstr(new ToAryInstr(temp(), rhsVal));
415404

416-
buildAssignment(reads, assigns);
417-
} else if (node instanceof RequiredParameterNode) {
418-
RequiredParameterNode variable = (RequiredParameterNode) node;
419-
copy(getLocalVariable(variable.name, 0), rhsVal);
420-
} else if (node instanceof SplatNode) { // FIXME: Audit this...is there really a splat here and it has phatom expression field?
421-
buildSplat(rhsVal);
422-
} else {
423-
throw notCompilable("Can't build assignment node", node);
405+
Map<Node, Operand> reads = new HashMap<>();
406+
final List<Tuple<Node, ResultInstr>> assigns = new ArrayList<>(4);
407+
buildMultiAssignment(multi.lefts, multi.rest, multi.rights, rhs, reads, assigns);
408+
409+
for (Tuple<Node, ResultInstr> assign : assigns) {
410+
addInstr((Instr) assign.b);
411+
}
412+
413+
buildAssignment(reads, assigns);
414+
}
415+
case RequiredParameterNode variable -> copy(getLocalVariable(variable.name, 0), rhsVal);
416+
case SplatNode _splat -> buildSplat(rhsVal);
417+
default -> throw notCompilable("Can't build assignment node", node);
424418
}
425419
}
426420

@@ -1680,7 +1674,7 @@ private void processReads(Variable result, List<Tuple<Node, ResultInstr>> assign
16801674
case CallTargetNode call -> reads.put(call.receiver, build(call.receiver));
16811675
case IndexTargetNode index -> {
16821676
reads.put(index.receiver, build(index.receiver));
1683-
Node[] arguments = index.arguments == null ? Node.EMPTY_ARRAY : index.arguments.arguments;
1677+
Node[] arguments = argumentsFrom(index.arguments);
16841678
int[] flags = new int[] { 0 };
16851679
Operand[] args = buildCallArgsArray(arguments, flags);
16861680
Operand[] hackyArgs = new Operand[args.length + 1];

0 commit comments

Comments
 (0)