--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jul 11 10:13:57 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jul 11 14:07:39 2013 +0100
@@ -2334,13 +2334,12 @@
if (pt() != Type.recoveryType) {
target = targetChecker.visit(target, that);
lambdaType = types.findDescriptorType(target);
- chk.checkFunctionalInterface(that, target);
} else {
target = Type.recoveryType;
lambdaType = fallbackDescriptorType(that);
}
- setFunctionalInfo(that, pt(), lambdaType, target, resultInfo.checkContext.inferenceContext());
+ setFunctionalInfo(localEnv, that, pt(), lambdaType, target, resultInfo.checkContext);
if (lambdaType.hasTag(FORALL)) {
//lambda expression target desc cannot be a generic method
@@ -2682,13 +2681,12 @@
if (pt() != Type.recoveryType) {
target = targetChecker.visit(pt(), that);
desc = types.findDescriptorType(target);
- chk.checkFunctionalInterface(that, target);
} else {
target = Type.recoveryType;
desc = fallbackDescriptorType(that);
}
- setFunctionalInfo(that, pt(), desc, target, resultInfo.checkContext.inferenceContext());
+ setFunctionalInfo(localEnv, that, pt(), desc, target, resultInfo.checkContext);
List<Type> argtypes = desc.getParameterTypes();
Pair<Symbol, Resolve.ReferenceLookupHelper> refResult =
@@ -2890,31 +2888,37 @@
* might contain inference variables, we might need to register an hook in the
* current inference context.
*/
- private void setFunctionalInfo(final JCFunctionalExpression fExpr, final Type pt,
- final Type descriptorType, final Type primaryTarget, InferenceContext inferenceContext) {
- if (inferenceContext.free(descriptorType)) {
- inferenceContext.addFreeTypeListener(List.of(pt, descriptorType), new FreeTypeListener() {
+ private void setFunctionalInfo(final Env<AttrContext> env, final JCFunctionalExpression fExpr,
+ final Type pt, final Type descriptorType, final Type primaryTarget, final CheckContext checkContext) {
+ if (checkContext.inferenceContext().free(descriptorType)) {
+ checkContext.inferenceContext().addFreeTypeListener(List.of(pt, descriptorType), new FreeTypeListener() {
public void typesInferred(InferenceContext inferenceContext) {
- setFunctionalInfo(fExpr, pt, inferenceContext.asInstType(descriptorType),
- inferenceContext.asInstType(primaryTarget), inferenceContext);
+ setFunctionalInfo(env, fExpr, pt, inferenceContext.asInstType(descriptorType),
+ inferenceContext.asInstType(primaryTarget), checkContext);
}
});
} else {
- ListBuffer<TypeSymbol> targets = ListBuffer.lb();
+ ListBuffer<Type> targets = ListBuffer.lb();
if (pt.hasTag(CLASS)) {
if (pt.isCompound()) {
- targets.append(primaryTarget.tsym); //this goes first
+ targets.append(types.removeWildcards(primaryTarget)); //this goes first
for (Type t : ((IntersectionClassType)pt()).interfaces_field) {
if (t != primaryTarget) {
- targets.append(t.tsym);
+ targets.append(types.removeWildcards(t));
}
}
} else {
- targets.append(pt.tsym);
+ targets.append(types.removeWildcards(primaryTarget));
}
}
fExpr.targets = targets.toList();
- fExpr.descriptorType = descriptorType;
+ if (checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.CHECK &&
+ pt != Type.recoveryType) {
+ //check that functional interface class is well-formed
+ ClassSymbol csym = types.makeFunctionalInterfaceClass(env,
+ names.empty, List.of(fExpr.targets.head), ABSTRACT);
+ chk.checkImplementations(env.tree, csym, csym);
+ }
}
}
@@ -4579,9 +4583,6 @@
@Override
public void visitLambda(JCLambda that) {
super.visitLambda(that);
- if (that.descriptorType == null) {
- that.descriptorType = syms.unknownType;
- }
if (that.targets == null) {
that.targets = List.nil();
}
@@ -4593,9 +4594,6 @@
if (that.sym == null) {
that.sym = new MethodSymbol(0, names.empty, syms.unknownType, syms.noSymbol);
}
- if (that.descriptorType == null) {
- that.descriptorType = syms.unknownType;
- }
if (that.targets == null) {
that.targets = List.nil();
}