--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Oct 17 20:27:44 2019 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Oct 17 20:53:35 2019 +0100
@@ -77,6 +77,8 @@
import com.sun.tools.javac.comp.Analyzer.AnalyzerMode;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
+import com.sun.tools.javac.util.Log.DeferredDiagnosticHandler;
+import com.sun.tools.javac.util.Log.DiscardDiagnosticHandler;
/** This is the main context-dependent analysis phase in GJC. It
* encompasses name resolution, type checking and constant folding as
@@ -358,7 +360,7 @@
Name name = (Name)node.getIdentifier();
if (site.kind == PCK) {
env.toplevel.packge = (PackageSymbol)site;
- return rs.findIdentInPackage(env, (TypeSymbol)site, name,
+ return rs.findIdentInPackage(null, env, (TypeSymbol)site, name,
KindSelector.TYP_PCK);
} else {
env.enclClass.sym = (ClassSymbol)site;
@@ -368,7 +370,7 @@
@Override @DefinedBy(Api.COMPILER_TREE)
public Symbol visitIdentifier(IdentifierTree node, Env<AttrContext> env) {
- return rs.findIdent(env, (Name)node.getName(), KindSelector.TYP_PCK);
+ return rs.findIdent(null, env, (Name)node.getName(), KindSelector.TYP_PCK);
}
}
@@ -441,7 +443,7 @@
private static class BreakAttr extends RuntimeException {
static final long serialVersionUID = -6924771130405446405L;
- private Env<AttrContext> env;
+ private transient Env<AttrContext> env;
private BreakAttr(Env<AttrContext> env) {
this.env = env;
}
@@ -733,11 +735,9 @@
*/
public Type attribStat(JCTree tree, Env<AttrContext> env) {
Env<AttrContext> analyzeEnv = analyzer.copyEnvIfNeeded(tree, env);
- try {
- return attribTree(tree, env, statInfo);
- } finally {
- analyzer.analyzeIfNeeded(tree, analyzeEnv);
- }
+ Type result = attribTree(tree, env, statInfo);
+ analyzer.analyzeIfNeeded(tree, analyzeEnv);
+ return result;
}
/** Attribute a list of expressions, returning a list of types.
@@ -931,7 +931,7 @@
public void visitClassDef(JCClassDecl tree) {
Optional<ArgumentAttr.LocalCacheContext> localCacheContext =
- Optional.ofNullable(env.info.isSpeculative ?
+ Optional.ofNullable(env.info.attributionMode.isSpeculative ?
argumentAttr.withLocalCacheContext() : null);
try {
// Local and anonymous classes have not been entered yet, so we need to
@@ -1425,16 +1425,16 @@
ListBuffer<Type> caseTypes = new ListBuffer<>();
handleSwitch(tree, tree.selector, tree.cases, (c, caseEnv) -> {
- caseEnv.info.breakResult = condInfo;
+ caseEnv.info.yieldResult = condInfo;
attribStats(c.stats, caseEnv);
new TreeScanner() {
@Override
- public void visitBreak(JCBreak brk) {
+ public void visitYield(JCYield brk) {
if (brk.target == tree) {
caseTypePositions.append(brk.value != null ? brk.value.pos() : brk.pos());
caseTypes.append(brk.value != null ? brk.value.type : syms.errType);
}
- super.visitBreak(brk);
+ super.visitYield(brk);
}
@Override public void visitClassDef(JCClassDecl tree) {}
@@ -1445,6 +1445,9 @@
if (tree.cases.isEmpty()) {
log.error(tree.pos(),
Errors.SwitchExpressionEmpty);
+ } else if (caseTypes.isEmpty()) {
+ log.error(tree.pos(),
+ Errors.SwitchExpressionNoResultExpressions);
}
Type owntype = (tree.polyKind == PolyKind.STANDALONE) ? condType(caseTypePositions.toList(), caseTypes.toList()) : pt();
@@ -1864,67 +1867,19 @@
}
public void visitBreak(JCBreak tree) {
- if (env.info.breakResult != null) {
- if (tree.value == null) {
- tree.target = findJumpTarget(tree.pos(), tree.getTag(), null, env);
- if (tree.target.hasTag(SWITCH_EXPRESSION)) {
- log.error(tree.pos(), Errors.BreakMissingValue);
- }
- } else {
- if (env.info.breakResult.pt.hasTag(VOID)) {
- //can happen?
- env.info.breakResult.checkContext.report(tree.value.pos(),
- diags.fragment(Fragments.UnexpectedRetVal));
- }
- boolean attribute = true;
- if (tree.value.hasTag(IDENT)) {
- //disambiguate break <LABEL> and break <ident-as-an-expression>:
- Name label = ((JCIdent) tree.value).name;
- Pair<JCTree, Error> jumpTarget = findJumpTargetNoError(tree.getTag(), label, env);
-
- if (jumpTarget.fst != null) {
- JCTree speculative = deferredAttr.attribSpeculative(tree.value, env, unknownExprInfo);
- if (!speculative.type.hasTag(ERROR)) {
- log.error(tree.pos(), Errors.BreakAmbiguousTarget(label));
- if (jumpTarget.snd == null) {
- tree.target = jumpTarget.fst;
- attribute = false;
- } else {
- //nothing
- }
- } else {
- if (jumpTarget.snd != null) {
- log.error(tree.pos(), jumpTarget.snd);
- }
- tree.target = jumpTarget.fst;
- attribute = false;
- }
- }
- }
- if (attribute) {
- attribTree(tree.value, env, env.info.breakResult);
- JCTree immediateTarget = findJumpTarget(tree.pos(), tree.getTag(), null, env);
- if (immediateTarget.getTag() != SWITCH_EXPRESSION) {
- log.error(tree.pos(), Errors.BreakExprNotImmediate(immediateTarget.getTag()));
- Env<AttrContext> env1 = env;
- while (env1 != null && env1.tree.getTag() != SWITCH_EXPRESSION) {
- env1 = env1.next;
- }
- Assert.checkNonNull(env1);
- tree.target = env1.tree;
- } else {
- tree.target = immediateTarget;
- }
- }
- }
+ tree.target = findJumpTarget(tree.pos(), tree.getTag(), tree.label, env);
+ result = null;
+ }
+
+ public void visitYield(JCYield tree) {
+ if (env.info.yieldResult != null) {
+ attribTree(tree.value, env, env.info.yieldResult);
+ tree.target = findJumpTarget(tree.pos(), tree.getTag(), names.empty, env);
} else {
- if (tree.value == null || tree.value.hasTag(IDENT)) {
- Name label = tree.value != null ? ((JCIdent) tree.value).name : null;
- tree.target = findJumpTarget(tree.pos(), tree.getTag(), label, env);
- } else {
- log.error(tree.pos(), Errors.BreakComplexValueNoSwitchExpression);
- attribTree(tree.value, env, unknownExprInfo);
- }
+ log.error(tree.pos(), tree.value.hasTag(PARENS)
+ ? Errors.NoSwitchExpressionQualify
+ : Errors.NoSwitchExpression);
+ attribTree(tree.value, env, unknownExprInfo);
}
result = null;
}
@@ -1934,8 +1889,8 @@
result = null;
}
//where
- /** Return the target of a break or continue statement, if it exists,
- * report an error if not.
+ /** Return the target of a break, continue or yield statement,
+ * if it exists, report an error if not.
* Note: The target of a labelled break or continue is the
* (non-labelled) statement tree referred to by the label,
* not the tree representing the labelled statement itself.
@@ -2009,12 +1964,10 @@
if (label == null && tag == BREAK) return Pair.of(env1.tree, null);
break;
case SWITCH_EXPRESSION:
- if (tag == BREAK) {
- if (label == null) {
- return Pair.of(env1.tree, null);
- } else {
- pendingError = Errors.BreakOutsideSwitchExpression;
- }
+ if (tag == YIELD) {
+ return Pair.of(env1.tree, null);
+ } else if (tag == BREAK) {
+ pendingError = Errors.BreakOutsideSwitchExpression;
} else {
pendingError = Errors.ContinueOutsideSwitchExpression;
}
@@ -2029,6 +1982,8 @@
}
if (label != null)
return Pair.of(null, Errors.UndefLabel(label));
+ else if (pendingError != null)
+ return Pair.of(null, pendingError);
else if (tag == CONTINUE)
return Pair.of(null, Errors.ContOutsideLoop);
else
@@ -2040,7 +1995,7 @@
// nested within than the enclosing class.
if (env.info.returnResult == null) {
log.error(tree.pos(), Errors.RetOutsideMeth);
- } else if (env.info.breakResult != null) {
+ } else if (env.info.yieldResult != null) {
log.error(tree.pos(), Errors.ReturnOutsideSwitchExpression);
} else {
// Attribute return expression, if it exists, and check that
@@ -2819,6 +2774,8 @@
resultInfo.checkContext.report(that, cause);
result = that.type = types.createErrorType(pt());
return;
+ } catch (CompletionFailure cf) {
+ chk.completionError(that.pos(), cf);
} catch (Throwable t) {
//when an unexpected exception happens, avoid attempts to attribute the same tree again
//as that would likely cause the same exception again.
@@ -3136,7 +3093,7 @@
} else {
lambdaEnv = env.dup(that, env.info.dup(env.info.scope.dup()));
}
- lambdaEnv.info.breakResult = null;
+ lambdaEnv.info.yieldResult = null;
return lambdaEnv;
}
@@ -3275,7 +3232,7 @@
return;
}
- if (!env.info.isSpeculative && that.getMode() == JCMemberReference.ReferenceMode.NEW) {
+ if (!env.info.attributionMode.isSpeculative && that.getMode() == JCMemberReference.ReferenceMode.NEW) {
Type enclosingType = exprType.getEnclosingType();
if (enclosingType != null && enclosingType.hasTag(CLASS)) {
// Check for the existence of an apropriate outer instance
@@ -3916,7 +3873,7 @@
switch (site.getTag()) {
case PACKAGE:
return rs.accessBase(
- rs.findIdentInPackage(env, site.tsym, name, resultInfo.pkind),
+ rs.findIdentInPackage(pos, env, site.tsym, name, resultInfo.pkind),
pos, location, site, name, true);
case ARRAY:
case CLASS:
@@ -3931,7 +3888,7 @@
return syms.getClassField(site, types);
} else {
// We are seeing a plain identifier as selector.
- Symbol sym = rs.findIdentInType(env, site, name, resultInfo.pkind);
+ Symbol sym = rs.findIdentInType(pos, env, site, name, resultInfo.pkind);
sym = rs.accessBase(sym, pos, location, site, name, true);
return sym;
}