< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java

Print this page
rev 51291 : imported patch switch
rev 51292 : [mq]: switch.02


3349 
3350     public void visitReturn(JCReturn tree) {
3351         if (tree.expr != null)
3352             tree.expr = translate(tree.expr,
3353                                   types.erasure(currentMethodDef
3354                                                 .restype.type));
3355         result = tree;
3356     }
3357 
3358     public void visitSwitch(JCSwitch tree) {
3359         //expand multiple label cases:
3360         ListBuffer<JCCase> cases = new ListBuffer<>();
3361 
3362         for (JCCase c : tree.cases) {
3363             switch (c.pats.size()) {
3364                 case 0: //default
3365                 case 1: //single label
3366                     cases.append(c);
3367                     break;
3368                 default: //multiple labels, expand:





3369                     List<JCExpression> patterns = c.pats;
3370                     while (patterns.tail.nonEmpty()) {
3371                         cases.append(make_at(c.pos()).Case(JCCase.STATEMENT,
3372                                                            List.of(patterns.head),
3373                                                            List.nil(),
3374                                                            null));
3375                         patterns = patterns.tail;
3376                     }
3377                     c.pats = patterns;
3378                     cases.append(c);
3379                     break;
3380             }
3381         }
3382 
3383         for (JCCase c : cases) {
3384             if (c.caseKind == JCCase.RULE && c.completesNormally) {
3385                 JCBreak b = make_at(c.pos()).Break(null);
3386                 b.target = tree;
3387                 c.stats = c.stats.append(b);
3388             }


3601                 if (isDefault)
3602                     caseExpr = null;
3603                 else {
3604                     caseExpr = make.Literal(caseLabelToPosition.get((String)TreeInfo.skipParens(oneCase.pats.head).
3605                                                                     type.constValue()));
3606                 }
3607 
3608                 lb.append(make.Case(JCCase.STATEMENT, caseExpr == null ? List.nil() : List.of(caseExpr),
3609                                     oneCase.getStatements(), null));
3610             }
3611 
3612             switch2.cases = lb.toList();
3613             stmtList.append(switch2);
3614 
3615             return make.Block(0L, stmtList.toList());
3616         }
3617     }
3618 
3619     @Override
3620     public void visitSwitchExpression(JCSwitchExpression tree) {












3621         VarSymbol dollar_switchexpr = new VarSymbol(Flags.FINAL|Flags.SYNTHETIC,
3622                            names.fromString("exprswitch" + tree.pos + target.syntheticNameChar()),
3623                            tree.type,
3624                            currentMethodSym);
3625 
3626         ListBuffer<JCStatement> stmtList = new ListBuffer<>();
3627 
3628         stmtList.append(make.at(tree.pos()).VarDef(dollar_switchexpr, null).setType(dollar_switchexpr.type));
3629         JCSwitch switchStatement = make.Switch(tree.selector, null);
3630         switchStatement.cases =
3631                 tree.cases.stream()
3632                           .map(c -> convertCase(dollar_switchexpr, switchStatement, tree, c))
3633                           .collect(List.collector());
3634         if (tree.cases.stream().noneMatch(c -> c.pats.isEmpty())) {
3635             JCThrow thr = make.Throw(makeNewClass(syms.incompatibleClassChangeErrorType,
3636                                                   List.nil()));
3637             JCCase c = make.Case(JCCase.STATEMENT, List.nil(), List.of(thr), null);
3638             switchStatement.cases = switchStatement.cases.append(c);
3639         }
3640 




3349 
3350     public void visitReturn(JCReturn tree) {
3351         if (tree.expr != null)
3352             tree.expr = translate(tree.expr,
3353                                   types.erasure(currentMethodDef
3354                                                 .restype.type));
3355         result = tree;
3356     }
3357 
3358     public void visitSwitch(JCSwitch tree) {
3359         //expand multiple label cases:
3360         ListBuffer<JCCase> cases = new ListBuffer<>();
3361 
3362         for (JCCase c : tree.cases) {
3363             switch (c.pats.size()) {
3364                 case 0: //default
3365                 case 1: //single label
3366                     cases.append(c);
3367                     break;
3368                 default: //multiple labels, expand:
3369                     //case C1, C2, C3: ...
3370                     //=>
3371                     //case C1:
3372                     //case C2:
3373                     //case C3: ...
3374                     List<JCExpression> patterns = c.pats;
3375                     while (patterns.tail.nonEmpty()) {
3376                         cases.append(make_at(c.pos()).Case(JCCase.STATEMENT,
3377                                                            List.of(patterns.head),
3378                                                            List.nil(),
3379                                                            null));
3380                         patterns = patterns.tail;
3381                     }
3382                     c.pats = patterns;
3383                     cases.append(c);
3384                     break;
3385             }
3386         }
3387 
3388         for (JCCase c : cases) {
3389             if (c.caseKind == JCCase.RULE && c.completesNormally) {
3390                 JCBreak b = make_at(c.pos()).Break(null);
3391                 b.target = tree;
3392                 c.stats = c.stats.append(b);
3393             }


3606                 if (isDefault)
3607                     caseExpr = null;
3608                 else {
3609                     caseExpr = make.Literal(caseLabelToPosition.get((String)TreeInfo.skipParens(oneCase.pats.head).
3610                                                                     type.constValue()));
3611                 }
3612 
3613                 lb.append(make.Case(JCCase.STATEMENT, caseExpr == null ? List.nil() : List.of(caseExpr),
3614                                     oneCase.getStatements(), null));
3615             }
3616 
3617             switch2.cases = lb.toList();
3618             stmtList.append(switch2);
3619 
3620             return make.Block(0L, stmtList.toList());
3621         }
3622     }
3623 
3624     @Override
3625     public void visitSwitchExpression(JCSwitchExpression tree) {
3626         //translates switch expression to statement switch:
3627         //switch (selector) {
3628         //    case C: break value;
3629         //    ...
3630         //}
3631         //=>
3632         //(letexpr T exprswitch$;
3633         //         switch (selector) {
3634         //             case C: { exprswitch$ = value; break; }
3635         //         }
3636         //         exprswitch$
3637         //)
3638         VarSymbol dollar_switchexpr = new VarSymbol(Flags.FINAL|Flags.SYNTHETIC,
3639                            names.fromString("exprswitch" + tree.pos + target.syntheticNameChar()),
3640                            tree.type,
3641                            currentMethodSym);
3642 
3643         ListBuffer<JCStatement> stmtList = new ListBuffer<>();
3644 
3645         stmtList.append(make.at(tree.pos()).VarDef(dollar_switchexpr, null).setType(dollar_switchexpr.type));
3646         JCSwitch switchStatement = make.Switch(tree.selector, null);
3647         switchStatement.cases =
3648                 tree.cases.stream()
3649                           .map(c -> convertCase(dollar_switchexpr, switchStatement, tree, c))
3650                           .collect(List.collector());
3651         if (tree.cases.stream().noneMatch(c -> c.pats.isEmpty())) {
3652             JCThrow thr = make.Throw(makeNewClass(syms.incompatibleClassChangeErrorType,
3653                                                   List.nil()));
3654             JCCase c = make.Case(JCCase.STATEMENT, List.nil(), List.of(thr), null);
3655             switchStatement.cases = switchStatement.cases.append(c);
3656         }
3657 


< prev index next >