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
|