< prev index next >

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

Print this page
rev 51258 : imported patch switch
rev 51259 : imported patch switch.01


 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) {


< prev index next >