--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Sep 25 11:53:18 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Sep 25 11:55:34 2012 +0100
@@ -40,6 +40,8 @@
import com.sun.tools.javac.code.Lint.LintCategory;
import com.sun.tools.javac.code.Type.*;
import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.comp.Infer.InferenceContext;
+import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener;
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Flags.ANNOTATION;
@@ -429,6 +431,8 @@
* Obtain a warner for this check context
*/
public Warner checkWarner(DiagnosticPosition pos, Type found, Type req);
+
+ public Infer.InferenceContext inferenceContext();
}
/**
@@ -455,6 +459,10 @@
public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) {
return enclosingContext.checkWarner(pos, found, req);
}
+
+ public Infer.InferenceContext inferenceContext() {
+ return enclosingContext.inferenceContext();
+ }
}
/**
@@ -471,6 +479,10 @@
public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) {
return convertWarner(pos, found, req);
}
+
+ public InferenceContext inferenceContext() {
+ return infer.emptyContext;
+ }
};
/** Check that a given type is assignable to a given proto-type.
@@ -483,7 +495,16 @@
return checkType(pos, found, req, basicHandler);
}
- Type checkType(final DiagnosticPosition pos, Type found, Type req, CheckContext checkContext) {
+ Type checkType(final DiagnosticPosition pos, final Type found, final Type req, final CheckContext checkContext) {
+ final Infer.InferenceContext inferenceContext = checkContext.inferenceContext();
+ if (inferenceContext.free(req)) {
+ inferenceContext.addFreeTypeListener(List.of(req), new FreeTypeListener() {
+ @Override
+ public void typesInferred(InferenceContext inferenceContext) {
+ checkType(pos, found, inferenceContext.asInstType(req, types), checkContext);
+ }
+ });
+ }
if (req.tag == ERROR)
return req;
if (req.tag == NONE)