langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Sat Mar 28 10:18:27 2015 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Mon Mar 30 17:09:14 2015 +0530
@@ -26,6 +26,7 @@
package com.sun.tools.javac.comp;
import com.sun.source.tree.LambdaExpressionTree.BodyKind;
+import com.sun.source.tree.NewClassTree;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Type.TypeMapping;
import com.sun.tools.javac.comp.Resolve.ResolveError;
@@ -81,6 +82,8 @@
final Log log;
final Symtab syms;
final TreeMaker make;
+ final TreeCopier<Void> treeCopier;
+ final TypeMapping<Void> deferredCopier;
final Types types;
final Flow flow;
final Names names;
@@ -125,6 +128,35 @@
return "Empty deferred context!";
}
};
+
+ // For speculative attribution, skip the class definition in <>.
+ treeCopier =
+ new TreeCopier<Void>(make) {
+ @Override @DefinedBy(Api.COMPILER_TREE)
+ public JCTree visitNewClass(NewClassTree node, Void p) {
+ JCNewClass t = (JCNewClass) node;
+ if (TreeInfo.isDiamond(t)) {
+ JCExpression encl = copy(t.encl, p);
+ List<JCExpression> typeargs = copy(t.typeargs, p);
+ JCExpression clazz = copy(t.clazz, p);
+ List<JCExpression> args = copy(t.args, p);
+ JCClassDecl def = null;
+ return make.at(t.pos).NewClass(encl, typeargs, clazz, args, def);
+ } else {
+ return super.visitNewClass(node, p);
+ }
+ }
+ };
+ deferredCopier = new TypeMapping<Void> () {
+ @Override
+ public Type visitType(Type t, Void v) {
+ if (t.hasTag(DEFERRED)) {
+ DeferredType dt = (DeferredType) t;
+ return new DeferredType(treeCopier.copy(dt.tree), dt.env);
+ }
+ return t;
+ }
+ };
}
/** shared tree for stuck expressions */
@@ -364,7 +396,7 @@
* disabled during speculative type-checking.
*/
JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) {
- return attribSpeculative(tree, env, resultInfo, new TreeCopier<>(make),
+ return attribSpeculative(tree, env, resultInfo, treeCopier,
(newTree)->new DeferredAttrDiagHandler(log, newTree));
}