< prev index next >

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

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


1469 
1470     private void handleSwitch(JCTree switchTree,
1471                               JCExpression selector,
1472                               List<JCCase> cases,
1473                               BiConsumer<JCCase, Env<AttrContext>> attribCase) {
1474         Type seltype = attribExpr(selector, env);
1475 
1476         Env<AttrContext> switchEnv =
1477             env.dup(switchTree, env.info.dup(env.info.scope.dup()));
1478 
1479         try {
1480             boolean enumSwitch = (seltype.tsym.flags() & Flags.ENUM) != 0;
1481             boolean stringSwitch = types.isSameType(seltype, syms.stringType);
1482             if (!enumSwitch && !stringSwitch)
1483                 seltype = chk.checkType(selector.pos(), seltype, syms.intType);
1484 
1485             // Attribute all cases and
1486             // check that there are no duplicate case labels or default clauses.
1487             Set<Object> labels = new HashSet<>(); // The set of case labels.
1488             boolean hasDefault = false;      // Is there a default label?
1489             @SuppressWarnings("preview")
1490             CaseTree.CaseKind caseKind = null;
1491             boolean wasError = false;
1492             for (List<JCCase> l = cases; l.nonEmpty(); l = l.tail) {
1493                 JCCase c = l.head;
1494                 if (caseKind == null) {
1495                     caseKind = c.caseKind;
1496                 } else if (caseKind != c.caseKind && !wasError) {
1497                     log.error(c.pos(),
1498                               Errors.SwitchMixingCaseTypes);
1499                     wasError = true;
1500                 }
1501                 if (c.getExpressions().nonEmpty()) {
1502                     for (JCExpression pat : c.getExpressions()) {
1503                         if (TreeInfo.isNull(pat)) {
1504                             log.error(pat.pos(),
1505                                       Errors.SwitchNullNotAllowed);
1506                         } else if (enumSwitch) {
1507                             Symbol sym = enumConstant(pat, seltype);
1508                             if (sym == null) {
1509                                 log.error(pat.pos(), Errors.EnumLabelMustBeUnqualifiedEnum);




1469 
1470     private void handleSwitch(JCTree switchTree,
1471                               JCExpression selector,
1472                               List<JCCase> cases,
1473                               BiConsumer<JCCase, Env<AttrContext>> attribCase) {
1474         Type seltype = attribExpr(selector, env);
1475 
1476         Env<AttrContext> switchEnv =
1477             env.dup(switchTree, env.info.dup(env.info.scope.dup()));
1478 
1479         try {
1480             boolean enumSwitch = (seltype.tsym.flags() & Flags.ENUM) != 0;
1481             boolean stringSwitch = types.isSameType(seltype, syms.stringType);
1482             if (!enumSwitch && !stringSwitch)
1483                 seltype = chk.checkType(selector.pos(), seltype, syms.intType);
1484 
1485             // Attribute all cases and
1486             // check that there are no duplicate case labels or default clauses.
1487             Set<Object> labels = new HashSet<>(); // The set of case labels.
1488             boolean hasDefault = false;      // Is there a default label?

1489             CaseTree.CaseKind caseKind = null;
1490             boolean wasError = false;
1491             for (List<JCCase> l = cases; l.nonEmpty(); l = l.tail) {
1492                 JCCase c = l.head;
1493                 if (caseKind == null) {
1494                     caseKind = c.caseKind;
1495                 } else if (caseKind != c.caseKind && !wasError) {
1496                     log.error(c.pos(),
1497                               Errors.SwitchMixingCaseTypes);
1498                     wasError = true;
1499                 }
1500                 if (c.getExpressions().nonEmpty()) {
1501                     for (JCExpression pat : c.getExpressions()) {
1502                         if (TreeInfo.isNull(pat)) {
1503                             log.error(pat.pos(),
1504                                       Errors.SwitchNullNotAllowed);
1505                         } else if (enumSwitch) {
1506                             Symbol sym = enumConstant(pat, seltype);
1507                             if (sym == null) {
1508                                 log.error(pat.pos(), Errors.EnumLabelMustBeUnqualifiedEnum);


< prev index next >