< prev index next >

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

Print this page
rev 56806 : 8232684: Make switch expressions final
Reviewed-by: TBD


1450 
1451     private void handleSwitch(JCTree switchTree,
1452                               JCExpression selector,
1453                               List<JCCase> cases,
1454                               BiConsumer<JCCase, Env<AttrContext>> attribCase) {
1455         Type seltype = attribExpr(selector, env);
1456 
1457         Env<AttrContext> switchEnv =
1458             env.dup(switchTree, env.info.dup(env.info.scope.dup()));
1459 
1460         try {
1461             boolean enumSwitch = (seltype.tsym.flags() & Flags.ENUM) != 0;
1462             boolean stringSwitch = types.isSameType(seltype, syms.stringType);
1463             if (!enumSwitch && !stringSwitch)
1464                 seltype = chk.checkType(selector.pos(), seltype, syms.intType);
1465 
1466             // Attribute all cases and
1467             // check that there are no duplicate case labels or default clauses.
1468             Set<Object> labels = new HashSet<>(); // The set of case labels.
1469             boolean hasDefault = false;      // Is there a default label?
1470             @SuppressWarnings("preview")
1471             CaseTree.CaseKind caseKind = null;
1472             boolean wasError = false;
1473             for (List<JCCase> l = cases; l.nonEmpty(); l = l.tail) {
1474                 JCCase c = l.head;
1475                 if (caseKind == null) {
1476                     caseKind = c.caseKind;
1477                 } else if (caseKind != c.caseKind && !wasError) {
1478                     log.error(c.pos(),
1479                               Errors.SwitchMixingCaseTypes);
1480                     wasError = true;
1481                 }
1482                 if (c.getExpressions().nonEmpty()) {
1483                     for (JCExpression pat : c.getExpressions()) {
1484                         if (TreeInfo.isNull(pat)) {
1485                             log.error(pat.pos(),
1486                                       Errors.SwitchNullNotAllowed);
1487                         } else if (enumSwitch) {
1488                             Symbol sym = enumConstant(pat, seltype);
1489                             if (sym == null) {
1490                                 log.error(pat.pos(), Errors.EnumLabelMustBeUnqualifiedEnum);




1450 
1451     private void handleSwitch(JCTree switchTree,
1452                               JCExpression selector,
1453                               List<JCCase> cases,
1454                               BiConsumer<JCCase, Env<AttrContext>> attribCase) {
1455         Type seltype = attribExpr(selector, env);
1456 
1457         Env<AttrContext> switchEnv =
1458             env.dup(switchTree, env.info.dup(env.info.scope.dup()));
1459 
1460         try {
1461             boolean enumSwitch = (seltype.tsym.flags() & Flags.ENUM) != 0;
1462             boolean stringSwitch = types.isSameType(seltype, syms.stringType);
1463             if (!enumSwitch && !stringSwitch)
1464                 seltype = chk.checkType(selector.pos(), seltype, syms.intType);
1465 
1466             // Attribute all cases and
1467             // check that there are no duplicate case labels or default clauses.
1468             Set<Object> labels = new HashSet<>(); // The set of case labels.
1469             boolean hasDefault = false;      // Is there a default label?

1470             CaseTree.CaseKind caseKind = null;
1471             boolean wasError = false;
1472             for (List<JCCase> l = cases; l.nonEmpty(); l = l.tail) {
1473                 JCCase c = l.head;
1474                 if (caseKind == null) {
1475                     caseKind = c.caseKind;
1476                 } else if (caseKind != c.caseKind && !wasError) {
1477                     log.error(c.pos(),
1478                               Errors.SwitchMixingCaseTypes);
1479                     wasError = true;
1480                 }
1481                 if (c.getExpressions().nonEmpty()) {
1482                     for (JCExpression pat : c.getExpressions()) {
1483                         if (TreeInfo.isNull(pat)) {
1484                             log.error(pat.pos(),
1485                                       Errors.SwitchNullNotAllowed);
1486                         } else if (enumSwitch) {
1487                             Symbol sym = enumConstant(pat, seltype);
1488                             if (sym == null) {
1489                                 log.error(pat.pos(), Errors.EnumLabelMustBeUnqualifiedEnum);


< prev index next >