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

changeset 1496
f785dcac17b7
parent 1480
db91d860156a
child 1498
1afdf1f1472b
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Tue Jan 15 13:03:11 2013 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Wed Jan 16 16:27:01 2013 +0000
     1.3 @@ -2386,10 +2386,23 @@
     1.4                                    List<Type> typeargtypes,
     1.5                                    boolean boxingAllowed) {
     1.6          MethodResolutionPhase maxPhase = boxingAllowed ? VARARITY : BASIC;
     1.7 +
     1.8 +        ReferenceLookupHelper boundLookupHelper;
     1.9 +        if (!name.equals(names.init)) {
    1.10 +            //method reference
    1.11 +            boundLookupHelper =
    1.12 +                    new MethodReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase);
    1.13 +        } else if (site.hasTag(ARRAY)) {
    1.14 +            //array constructor reference
    1.15 +            boundLookupHelper =
    1.16 +                    new ArrayConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase);
    1.17 +        } else {
    1.18 +            //class constructor reference
    1.19 +            boundLookupHelper =
    1.20 +                    new ConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase);
    1.21 +        }
    1.22 +
    1.23          //step 1 - bound lookup
    1.24 -        ReferenceLookupHelper boundLookupHelper = name.equals(names.init) ?
    1.25 -                new ConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase) :
    1.26 -                new MethodReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase);
    1.27          Env<AttrContext> boundEnv = env.dup(env.tree, env.info.dup());
    1.28          Symbol boundSym = lookupMethod(boundEnv, env.tree.pos(), site.tsym, boundLookupHelper);
    1.29  
    1.30 @@ -2627,6 +2640,33 @@
    1.31      }
    1.32  
    1.33      /**
    1.34 +     * Helper class for array constructor lookup; an array constructor lookup
    1.35 +     * is simulated by looking up a method that returns the array type specified
    1.36 +     * as qualifier, and that accepts a single int parameter (size of the array).
    1.37 +     */
    1.38 +    class ArrayConstructorReferenceLookupHelper extends ReferenceLookupHelper {
    1.39 +
    1.40 +        ArrayConstructorReferenceLookupHelper(JCMemberReference referenceTree, Type site, List<Type> argtypes,
    1.41 +                List<Type> typeargtypes, MethodResolutionPhase maxPhase) {
    1.42 +            super(referenceTree, names.init, site, argtypes, typeargtypes, maxPhase);
    1.43 +        }
    1.44 +
    1.45 +        @Override
    1.46 +        protected Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase) {
    1.47 +            Scope sc = new Scope(syms.arrayClass);
    1.48 +            MethodSymbol arrayConstr = new MethodSymbol(PUBLIC, name, null, site.tsym);
    1.49 +            arrayConstr.type = new MethodType(List.of(syms.intType), site, List.<Type>nil(), syms.methodClass);
    1.50 +            sc.enter(arrayConstr);
    1.51 +            return findMethodInScope(env, site, name, argtypes, typeargtypes, sc, methodNotFound, phase.isBoxingRequired(), phase.isVarargsRequired(), false, false);
    1.52 +        }
    1.53 +
    1.54 +        @Override
    1.55 +        ReferenceKind referenceKind(Symbol sym) {
    1.56 +            return ReferenceKind.ARRAY_CTOR;
    1.57 +        }
    1.58 +    }
    1.59 +
    1.60 +    /**
    1.61       * Helper class for constructor reference lookup. The lookup logic is based
    1.62       * upon either Resolve.findMethod or Resolve.findDiamond - depending on
    1.63       * whether the constructor reference needs diamond inference (this is the case

mercurial