--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Mar 24 13:04:32 2017 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Mar 24 06:40:28 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -56,6 +56,9 @@
import java.util.WeakHashMap;
import java.util.function.Function;
+import com.sun.source.tree.MemberReferenceTree;
+import com.sun.tools.javac.tree.JCTree.JCMemberReference.OverloadKind;
+
import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
@@ -148,6 +151,27 @@
return super.visitNewClass(node, p);
}
}
+
+ @Override @DefinedBy(Api.COMPILER_TREE)
+ public JCTree visitMemberReference(MemberReferenceTree node, Void p) {
+ JCMemberReference t = (JCMemberReference) node;
+ JCExpression expr = copy(t.expr, p);
+ List<JCExpression> typeargs = copy(t.typeargs, p);
+ /** once the value for overloadKind is determined for a copy, it can be safely forwarded to
+ * the copied tree, we want to profit from that
+ */
+ JCMemberReference result = new JCMemberReference(t.mode, t.name, expr, typeargs) {
+ @Override
+ public void setOverloadKind(OverloadKind overloadKind) {
+ super.setOverloadKind(overloadKind);
+ if (t.getOverloadKind() == null) {
+ t.setOverloadKind(overloadKind);
+ }
+ }
+ };
+ result.pos = t.pos;
+ return result;
+ }
};
deferredCopier = new TypeMapping<Void> () {
@Override
@@ -446,11 +470,17 @@
*/
JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) {
return attribSpeculative(tree, env, resultInfo, treeCopier,
- (newTree)->new DeferredAttrDiagHandler(log, newTree));
+ (newTree)->new DeferredAttrDiagHandler(log, newTree), null);
+ }
+
+ JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo, LocalCacheContext localCache) {
+ return attribSpeculative(tree, env, resultInfo, treeCopier,
+ (newTree)->new DeferredAttrDiagHandler(log, newTree), localCache);
}
<Z> JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo, TreeCopier<Z> deferredCopier,
- Function<JCTree, DeferredDiagnosticHandler> diagHandlerCreator) {
+ Function<JCTree, DeferredDiagnosticHandler> diagHandlerCreator,
+ LocalCacheContext localCache) {
final JCTree newTree = deferredCopier.copy(tree);
Env<AttrContext> speculativeEnv = env.dup(newTree, env.info.dup(env.info.scope.dupUnshared(env.info.scope.owner)));
speculativeEnv.info.isSpeculative = true;
@@ -461,6 +491,9 @@
} finally {
new UnenterScanner(env.toplevel.modle).scan(newTree);
log.popDiagnosticHandler(deferredDiagnosticHandler);
+ if (localCache != null) {
+ localCache.leave();
+ }
}
}
//where
@@ -847,6 +880,7 @@
@Override
public void visitReference(JCMemberReference tree) {
+ Assert.checkNonNull(tree.getOverloadKind());
Check.CheckContext checkContext = resultInfo.checkContext;
Type pt = resultInfo.pt;
if (!inferenceContext.inferencevars.contains(pt)) {
@@ -856,8 +890,9 @@
checkContext.report(null, ex.getDiagnostic());
}
Env<AttrContext> localEnv = env.dup(tree);
- JCExpression exprTree = (JCExpression)attribSpeculative(tree.getQualifierExpression(), localEnv,
- attr.memberReferenceQualifierResult(tree));
+ JCExpression exprTree;
+ exprTree = (JCExpression)attribSpeculative(tree.getQualifierExpression(), localEnv,
+ attr.memberReferenceQualifierResult(tree), argumentAttr.withLocalCacheContext());
ListBuffer<Type> argtypes = new ListBuffer<>();
for (Type t : types.findDescriptorType(pt).getParameterTypes()) {
argtypes.append(Type.noType);
@@ -1125,7 +1160,7 @@
Type descType = types.findDescriptorType(pt);
List<Type> freeArgVars = inferenceContext.freeVarsIn(descType.getParameterTypes());
if (freeArgVars.nonEmpty() &&
- tree.overloadKind == JCMemberReference.OverloadKind.OVERLOADED) {
+ tree.getOverloadKind() == JCMemberReference.OverloadKind.OVERLOADED) {
stuckVars.addAll(freeArgVars);
depVars.addAll(inferenceContext.freeVarsIn(descType.getReturnType()));
}
@@ -1190,7 +1225,7 @@
@Override
public void visitReference(JCMemberReference tree) {
super.visitReference(tree);
- if (tree.overloadKind == JCMemberReference.OverloadKind.OVERLOADED) {
+ if (tree.getOverloadKind() == JCMemberReference.OverloadKind.OVERLOADED) {
stuck = true;
}
}