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

changeset 1581
4ff468de829d
parent 1562
2154ed9ff6c8
child 1596
3a39d123d33a
     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          }

mercurial