1.1 --- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Feb 15 16:28:57 2013 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Feb 15 16:29:58 2013 +0000 1.3 @@ -68,6 +68,7 @@ 1.4 final JCDiagnostic.Factory diags; 1.5 final Enter enter; 1.6 final Infer infer; 1.7 + final Resolve rs; 1.8 final Log log; 1.9 final Symtab syms; 1.10 final TreeMaker make; 1.11 @@ -87,6 +88,7 @@ 1.12 diags = JCDiagnostic.Factory.instance(context); 1.13 enter = Enter.instance(context); 1.14 infer = Infer.instance(context); 1.15 + rs = Resolve.instance(context); 1.16 log = Log.instance(context); 1.17 syms = Symtab.instance(context); 1.18 make = TreeMaker.instance(context); 1.19 @@ -463,10 +465,12 @@ 1.20 1.21 ResultInfo resultInfo; 1.22 InferenceContext inferenceContext; 1.23 + Env<AttrContext> env; 1.24 1.25 public Type complete(DeferredType dt, ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) { 1.26 this.resultInfo = resultInfo; 1.27 this.inferenceContext = deferredAttrContext.inferenceContext; 1.28 + this.env = dt.env.dup(dt.tree, dt.env.info.dup()); 1.29 dt.tree.accept(this); 1.30 dt.speculativeCache.put(deferredAttrContext.msym, stuckTree, deferredAttrContext.phase); 1.31 return Type.noType; 1.32 @@ -511,12 +515,30 @@ 1.33 return; 1.34 } else { 1.35 try { 1.36 - //TODO: we should speculative determine if there's a match 1.37 - //based on arity - if yes, method is applicable. 1.38 types.findDescriptorType(pt); 1.39 } catch (Types.FunctionDescriptorLookupError ex) { 1.40 checkContext.report(null, ex.getDiagnostic()); 1.41 } 1.42 + JCExpression exprTree = (JCExpression)attribSpeculative(tree.getQualifierExpression(), env, 1.43 + attr.memberReferenceQualifierResult(tree)); 1.44 + ListBuffer<Type> argtypes = ListBuffer.lb(); 1.45 + for (Type t : types.findDescriptorType(pt).getParameterTypes()) { 1.46 + argtypes.append(syms.errType); 1.47 + } 1.48 + JCMemberReference mref2 = new TreeCopier<Void>(make).copy(tree); 1.49 + mref2.expr = exprTree; 1.50 + Pair<Symbol, ?> lookupRes = 1.51 + rs.resolveMemberReference(tree, env, mref2, exprTree.type, tree.name, argtypes.toList(), null, true); 1.52 + switch (lookupRes.fst.kind) { 1.53 + //note: as argtypes are erroneous types, type-errors must 1.54 + //have been caused by arity mismatch 1.55 + case Kinds.ABSENT_MTH: 1.56 + case Kinds.WRONG_MTH: 1.57 + case Kinds.WRONG_MTHS: 1.58 + case Kinds.STATICERR: 1.59 + case Kinds.MISSING_ENCL: 1.60 + checkContext.report(null, diags.fragment("incompatible.arg.types.in.mref")); 1.61 + } 1.62 } 1.63 } 1.64 }