@@ -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