src/share/classes/com/sun/tools/javac/comp/Attr.java

changeset 1897
866c87c01285
parent 1890
bfbedbfc522a
child 1898
a204cf7aab7e
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jul 17 14:04:01 2013 +0100
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jul 17 14:09:46 2013 +0100
     1.3 @@ -2708,10 +2708,21 @@
     1.4  
     1.5              setFunctionalInfo(that, pt(), desc, target, resultInfo.checkContext.inferenceContext());
     1.6              List<Type> argtypes = desc.getParameterTypes();
     1.7 -
     1.8 -            Pair<Symbol, Resolve.ReferenceLookupHelper> refResult =
     1.9 -                    rs.resolveMemberReference(that.pos(), localEnv, that,
    1.10 -                        that.expr.type, that.name, argtypes, typeargtypes, true, rs.resolveMethodCheck);
    1.11 +            Resolve.MethodCheck referenceCheck = rs.resolveMethodCheck;
    1.12 +
    1.13 +            if (resultInfo.checkContext.inferenceContext().free(argtypes)) {
    1.14 +                referenceCheck = rs.new MethodReferenceCheck(resultInfo.checkContext.inferenceContext());
    1.15 +            }
    1.16 +
    1.17 +            Pair<Symbol, Resolve.ReferenceLookupHelper> refResult = null;
    1.18 +            List<Type> saved_undet = resultInfo.checkContext.inferenceContext().save();
    1.19 +            try {
    1.20 +                refResult = rs.resolveMemberReference(that.pos(), localEnv, that, that.expr.type,
    1.21 +                        that.name, argtypes, typeargtypes, true, referenceCheck,
    1.22 +                        resultInfo.checkContext.inferenceContext());
    1.23 +            } finally {
    1.24 +                resultInfo.checkContext.inferenceContext().rollback(saved_undet);
    1.25 +            }
    1.26  
    1.27              Symbol refSym = refResult.fst;
    1.28              Resolve.ReferenceLookupHelper lookupHelper = refResult.snd;
    1.29 @@ -2823,17 +2834,24 @@
    1.30                  }
    1.31              }
    1.32  
    1.33 -            that.sym = refSym.baseSymbol();
    1.34 -            that.kind = lookupHelper.referenceKind(that.sym);
    1.35 -
    1.36              ResultInfo checkInfo =
    1.37                      resultInfo.dup(newMethodTemplate(
    1.38                          desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(),
    1.39 -                        lookupHelper.argtypes,
    1.40 -                        typeargtypes));
    1.41 +                        that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes));
    1.42  
    1.43              Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo);
    1.44  
    1.45 +            if (that.kind.isUnbound() &&
    1.46 +                    resultInfo.checkContext.inferenceContext().free(argtypes.head)) {
    1.47 +                //re-generate inference constraints for unbound receiver
    1.48 +                if (!types.isSubtype(resultInfo.checkContext.inferenceContext().asFree(argtypes.head), exprType)) {
    1.49 +                    //cannot happen as this has already been checked - we just need
    1.50 +                    //to regenerate the inference constraints, as that has been lost
    1.51 +                    //as a result of the call to inferenceContext.save()
    1.52 +                    Assert.error("Can't get here");
    1.53 +                }
    1.54 +            }
    1.55 +
    1.56              if (!refType.isErroneous()) {
    1.57                  refType = types.createMethodTypeWithReturn(refType,
    1.58                          adjustMethodReturnType(lookupHelper.site, that.name, checkInfo.pt.getParameterTypes(), refType.getReturnType()));

mercurial