463 }
464
465 /**
466 * Argument type for switch expressions.
467 */
468 class SwitchExpressionType extends ArgumentType<JCSwitchExpression> {
469 /** List of break expressions (lazily populated). */
470 Optional<List<JCBreak>> breakExpressions = Optional.empty();
471
472 SwitchExpressionType(JCExpression tree, Env<AttrContext> env, JCSwitchExpression speculativeCond) {
473 this(tree, env, speculativeCond, new HashMap<>());
474 }
475
476 SwitchExpressionType(JCExpression tree, Env<AttrContext> env, JCSwitchExpression speculativeCond, Map<ResultInfo, Type> speculativeTypes) {
477 super(tree, env, speculativeCond, speculativeTypes);
478 }
479
480 @Override
481 Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
482 ResultInfo localInfo = resultInfo.dup(attr.conditionalContext(resultInfo.checkContext));
483 if (speculativeTree.isStandalone()) {
484 return localInfo.check(speculativeTree, speculativeTree.type);
485 } else if (resultInfo.pt.hasTag(VOID)) {
486 //this means we are returning a poly switch expression from void-compatible lambda expression
487 resultInfo.checkContext.report(tree, attr.diags.fragment(Fragments.SwitchExpressionTargetCantBeVoid));
488 return attr.types.createErrorType(resultInfo.pt);
489 } else {
490 //poly
491 for (JCBreak brk : breakExpressions()) {
492 checkSpeculative(brk.value, brk.value.type, resultInfo);
493 }
494 return localInfo.pt;
495 }
496 }
497
498 /** Compute return expressions (if needed). */
499 List<JCBreak> breakExpressions() {
500 return breakExpressions.orElseGet(() -> {
501 final List<JCBreak> res;
502 ListBuffer<JCBreak> buf = new ListBuffer<>();
503 new SwitchExpressionScanner() {
504 @Override
505 public void visitBreak(JCBreak tree) {
|
463 }
464
465 /**
466 * Argument type for switch expressions.
467 */
468 class SwitchExpressionType extends ArgumentType<JCSwitchExpression> {
469 /** List of break expressions (lazily populated). */
470 Optional<List<JCBreak>> breakExpressions = Optional.empty();
471
472 SwitchExpressionType(JCExpression tree, Env<AttrContext> env, JCSwitchExpression speculativeCond) {
473 this(tree, env, speculativeCond, new HashMap<>());
474 }
475
476 SwitchExpressionType(JCExpression tree, Env<AttrContext> env, JCSwitchExpression speculativeCond, Map<ResultInfo, Type> speculativeTypes) {
477 super(tree, env, speculativeCond, speculativeTypes);
478 }
479
480 @Override
481 Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
482 ResultInfo localInfo = resultInfo.dup(attr.conditionalContext(resultInfo.checkContext));
483 if (resultInfo.pt.hasTag(VOID)) {
484 //this means we are returning a poly switch expression from void-compatible lambda expression
485 resultInfo.checkContext.report(tree, attr.diags.fragment(Fragments.SwitchExpressionTargetCantBeVoid));
486 return attr.types.createErrorType(resultInfo.pt);
487 } else {
488 //poly
489 for (JCBreak brk : breakExpressions()) {
490 checkSpeculative(brk.value, brk.value.type, resultInfo);
491 }
492 return localInfo.pt;
493 }
494 }
495
496 /** Compute return expressions (if needed). */
497 List<JCBreak> breakExpressions() {
498 return breakExpressions.orElseGet(() -> {
499 final List<JCBreak> res;
500 ListBuffer<JCBreak> buf = new ListBuffer<>();
501 new SwitchExpressionScanner() {
502 @Override
503 public void visitBreak(JCBreak tree) {
|