langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
changeset 29292 c10d63c667cd
parent 29146 7115a5967ed1
child 29554 6d7957bd6866
equal deleted inserted replaced
29291:076c277565f7 29292:c10d63c667cd
  1789                     TypeSymbol symbolFor(Type t) {
  1789                     TypeSymbol symbolFor(Type t) {
  1790                         if (!t.hasTag(CLASS) &&
  1790                         if (!t.hasTag(CLASS) &&
  1791                                 !t.hasTag(TYPEVAR)) {
  1791                                 !t.hasTag(TYPEVAR)) {
  1792                             return null;
  1792                             return null;
  1793                         }
  1793                         }
  1794                         while (t.hasTag(TYPEVAR))
  1794                         t = types.skipTypeVars(t, false);
  1795                             t = t.getUpperBound();
       
  1796                         if (seen.contains(t.tsym)) {
  1795                         if (seen.contains(t.tsym)) {
  1797                             //degenerate case in which we have a circular
  1796                             //degenerate case in which we have a circular
  1798                             //class hierarchy - because of ill-formed classfiles
  1797                             //class hierarchy - because of ill-formed classfiles
  1799                             return null;
  1798                             return null;
  1800                         }
  1799                         }
  2654                                   List<Type> typeargtypes,
  2653                                   List<Type> typeargtypes,
  2655                                   MethodCheck methodCheck,
  2654                                   MethodCheck methodCheck,
  2656                                   InferenceContext inferenceContext,
  2655                                   InferenceContext inferenceContext,
  2657                                   ReferenceChooser referenceChooser) {
  2656                                   ReferenceChooser referenceChooser) {
  2658 
  2657 
  2659         site = types.capture(site);
  2658         //step 1 - bound lookup
  2660         ReferenceLookupHelper boundLookupHelper = makeReferenceLookupHelper(
  2659         ReferenceLookupHelper boundLookupHelper = makeReferenceLookupHelper(
  2661                 referenceTree, site, name, argtypes, typeargtypes, VARARITY);
  2660                 referenceTree, site, name, argtypes, typeargtypes, VARARITY);
  2662 
       
  2663         //step 1 - bound lookup
       
  2664         Env<AttrContext> boundEnv = env.dup(env.tree, env.info.dup());
  2661         Env<AttrContext> boundEnv = env.dup(env.tree, env.info.dup());
  2665         MethodResolutionContext boundSearchResolveContext = new MethodResolutionContext();
  2662         MethodResolutionContext boundSearchResolveContext = new MethodResolutionContext();
  2666         boundSearchResolveContext.methodCheck = methodCheck;
  2663         boundSearchResolveContext.methodCheck = methodCheck;
  2667         Symbol boundSym = lookupMethod(boundEnv, env.tree.pos(),
  2664         Symbol boundSym = lookupMethod(boundEnv, env.tree.pos(),
  2668                 site.tsym, boundSearchResolveContext, boundLookupHelper);
  2665                 site.tsym, boundSearchResolveContext, boundLookupHelper);
  3042      * corresponding unbound helper class (see UnboundMethodReferenceLookupHelper).
  3039      * corresponding unbound helper class (see UnboundMethodReferenceLookupHelper).
  3043      * In such cases, non-static lookup results are thrown away.
  3040      * In such cases, non-static lookup results are thrown away.
  3044      */
  3041      */
  3045     class MethodReferenceLookupHelper extends ReferenceLookupHelper {
  3042     class MethodReferenceLookupHelper extends ReferenceLookupHelper {
  3046 
  3043 
       
  3044         /** The original method reference lookup site. */
       
  3045         Type originalSite;
       
  3046 
  3047         MethodReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
  3047         MethodReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
  3048                 List<Type> argtypes, List<Type> typeargtypes, MethodResolutionPhase maxPhase) {
  3048                 List<Type> argtypes, List<Type> typeargtypes, MethodResolutionPhase maxPhase) {
  3049             super(referenceTree, name, site, argtypes, typeargtypes, maxPhase);
  3049             super(referenceTree, name, types.skipTypeVars(site, true), argtypes, typeargtypes, maxPhase);
       
  3050             this.originalSite = site;
  3050         }
  3051         }
  3051 
  3052 
  3052         @Override
  3053         @Override
  3053         final Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase) {
  3054         final Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase) {
  3054             return findMethod(env, site, name, argtypes, typeargtypes,
  3055             return findMethod(env, site, name, argtypes, typeargtypes,
  3060             if (TreeInfo.isStaticSelector(referenceTree.expr, names)) {
  3061             if (TreeInfo.isStaticSelector(referenceTree.expr, names)) {
  3061                 if (argtypes.nonEmpty() &&
  3062                 if (argtypes.nonEmpty() &&
  3062                         (argtypes.head.hasTag(NONE) ||
  3063                         (argtypes.head.hasTag(NONE) ||
  3063                         types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), site))) {
  3064                         types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), site))) {
  3064                     return new UnboundMethodReferenceLookupHelper(referenceTree, name,
  3065                     return new UnboundMethodReferenceLookupHelper(referenceTree, name,
  3065                             site, argtypes, typeargtypes, maxPhase);
  3066                             originalSite, argtypes, typeargtypes, maxPhase);
  3066                 } else {
  3067                 } else {
  3067                     return new ReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase) {
  3068                     return new ReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase) {
  3068                         @Override
  3069                         @Override
  3069                         ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
  3070                         ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
  3070                             return this;
  3071                             return this;
  3112         UnboundMethodReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
  3113         UnboundMethodReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
  3113                 List<Type> argtypes, List<Type> typeargtypes, MethodResolutionPhase maxPhase) {
  3114                 List<Type> argtypes, List<Type> typeargtypes, MethodResolutionPhase maxPhase) {
  3114             super(referenceTree, name, site, argtypes.tail, typeargtypes, maxPhase);
  3115             super(referenceTree, name, site, argtypes.tail, typeargtypes, maxPhase);
  3115             if (site.isRaw() && !argtypes.head.hasTag(NONE)) {
  3116             if (site.isRaw() && !argtypes.head.hasTag(NONE)) {
  3116                 Type asSuperSite = types.asSuper(argtypes.head, site.tsym);
  3117                 Type asSuperSite = types.asSuper(argtypes.head, site.tsym);
  3117                 this.site = types.capture(asSuperSite);
  3118                 this.site = types.skipTypeVars(asSuperSite, true);
  3118             }
  3119             }
  3119         }
  3120         }
  3120 
  3121 
  3121         @Override
  3122         @Override
  3122         ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
  3123         ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {