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) { |