langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
changeset 37003 12ece14d32e0
parent 36995 e19153419efd
child 38516 b643c42e9d25
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java	Thu Apr 07 11:03:13 2016 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java	Fri Apr 08 10:52:26 2016 +0100
@@ -716,6 +716,8 @@
             this.t = t;
         }
 
+        public abstract IncorporationAction dup(UndetVar that);
+
         /**
          * Incorporation action entry-point. Subclasses should define the logic associated with
          * this incorporation action.
@@ -765,6 +767,11 @@
         }
 
         @Override
+        public IncorporationAction dup(UndetVar that) {
+            return new CheckBounds(that, t, typeFunc, optFilter, from);
+        }
+
+        @Override
         void apply(InferenceContext inferenceContext, Warner warn) {
             t = typeFunc.apply(inferenceContext, t);
             if (optFilter != null && optFilter.test(inferenceContext, t)) return;
@@ -832,6 +839,11 @@
         }
 
         @Override
+        public IncorporationAction dup(UndetVar that) {
+            return new EqCheckLegacy(that, t, from);
+        }
+
+        @Override
         EnumSet<InferenceBound> boundsToCheck() {
             return (from == InferenceBound.EQ) ?
                             EnumSet.allOf(InferenceBound.class) :
@@ -847,8 +859,17 @@
         EnumSet<InferenceBound> to;
 
         CheckInst(UndetVar uv, InferenceBound ib, InferenceBound... rest) {
+            this(uv, EnumSet.of(ib, rest));
+        }
+
+        CheckInst(UndetVar uv, EnumSet<InferenceBound> to) {
             super(uv, uv.getInst(), InferenceBound.EQ);
-            this.to = EnumSet.of(ib, rest);
+            this.to = to;
+        }
+
+        @Override
+        public IncorporationAction dup(UndetVar that) {
+            return new CheckInst(that, to);
         }
 
         @Override
@@ -871,6 +892,11 @@
         }
 
         @Override
+        public IncorporationAction dup(UndetVar that) {
+            return new SubstBounds(that);
+        }
+
+        @Override
         void apply(InferenceContext inferenceContext, Warner warn) {
             for (Type undet : inferenceContext.undetvars) {
                 //we could filter out variables not mentioning uv2...
@@ -910,6 +936,11 @@
         }
 
         @Override
+        public IncorporationAction dup(UndetVar that) {
+            return new CheckUpperBounds(that, t);
+        }
+
+        @Override
         void apply(InferenceContext inferenceContext, Warner warn) {
             List<Type> boundList = uv.getBounds(InferenceBound.UPPER).stream()
                     .collect(types.closureCollector(true, types::isSameType));
@@ -958,6 +989,11 @@
             this.ib = ib;
         }
 
+        @Override
+        public IncorporationAction dup(UndetVar that) {
+            return new PropagateBounds(that, t, ib);
+        }
+
         void apply(InferenceContext inferenceContext, Warner warner) {
             Type undetT = inferenceContext.asUndetVar(t);
             if (undetT.hasTag(UNDETVAR) && !((UndetVar)undetT).isCaptured()) {