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