/** * @return true, if signature of m1 is more specific than signature of m2 */ private boolean isSignatureMoreSpecific(JavaSymbol m1, JavaSymbol m2) { //TODO handle specific signature with varargs // ((MethodSymbol) m2).isVarArgs() return isArgumentsAcceptable(((JavaType.MethodJavaType) m1.type).argTypes, ((JavaType.MethodJavaType) m2.type).argTypes, false, false); }
/** * @return true, if signature of m1 is more specific than signature of m2 */ private boolean isSignatureMoreSpecific(JavaSymbol m1, JavaSymbol m2, List<JavaType> argTypes, TypeSubstitution m1Substitution, TypeSubstitution m2Substitution) { List<JavaType> m1ArgTypes = ((MethodJavaType) m1.type).argTypes; List<JavaType> m2ArgTypes = ((MethodJavaType) m2.type).argTypes; JavaSymbol.MethodJavaSymbol methodJavaSymbol = (JavaSymbol.MethodJavaSymbol) m1; boolean m1VarArity = methodJavaSymbol.isVarArgs(); boolean m2VarArity = ((JavaSymbol.MethodJavaSymbol) m2).isVarArgs(); if (m1VarArity != m2VarArity) { // last arg is an array boolean lastArgIsArray = !argTypes.isEmpty() && argTypes.get(argTypes.size() -1).isArray() && (argTypes.size() == m2ArgTypes.size() || argTypes.size() == m1ArgTypes.size()); // general case : prefer strict arity invocation over varArity, so if m2 is variadic, m1 is most specific, but not if last arg of invocation is an array return lastArgIsArray ^ m2VarArity; } if (m1VarArity) { m1ArgTypes = expandVarArgsToFitSize(m1ArgTypes, m2ArgTypes.size()); } if(!hasCompatibleArity(m1ArgTypes.size(), m2ArgTypes.size(), m2VarArity)) { return false; } m1ArgTypes = typeSubstitutionSolver.applySubstitutionToFormalParameters(m1ArgTypes, m1Substitution); m2ArgTypes = typeSubstitutionSolver.applySubstitutionToFormalParameters(m2ArgTypes, m2Substitution); return isArgumentsAcceptable(m1ArgTypes, m2ArgTypes, m2VarArity, true); }
/** * @return true, if signature of m1 is more specific than signature of m2 */ private boolean isSignatureMoreSpecific(JavaSymbol m1, JavaSymbol m2, List<JavaType> argTypes, TypeSubstitution m1Substitution, TypeSubstitution m2Substitution) { List<JavaType> m1ArgTypes = ((MethodJavaType) m1.type).argTypes; List<JavaType> m2ArgTypes = ((MethodJavaType) m2.type).argTypes; JavaSymbol.MethodJavaSymbol methodJavaSymbol = (JavaSymbol.MethodJavaSymbol) m1; boolean m1VarArity = methodJavaSymbol.isVarArgs(); boolean m2VarArity = ((JavaSymbol.MethodJavaSymbol) m2).isVarArgs(); if (m1VarArity != m2VarArity) { // last arg is an array boolean lastArgIsArray = !argTypes.isEmpty() && argTypes.get(argTypes.size() -1).isArray() && (argTypes.size() == m2ArgTypes.size() || argTypes.size() == m1ArgTypes.size()); // general case : prefer strict arity invocation over varArity, so if m2 is variadic, m1 is most specific, but not if last arg of invocation is an array return lastArgIsArray ^ m2VarArity; } if (m1VarArity) { m1ArgTypes = expandVarArgsToFitSize(m1ArgTypes, m2ArgTypes.size()); } if(!hasCompatibleArity(m1ArgTypes.size(), m2ArgTypes.size(), m2VarArity)) { return false; } m1ArgTypes = typeSubstitutionSolver.applySubstitutionToFormalParameters(m1ArgTypes, m1Substitution); m2ArgTypes = typeSubstitutionSolver.applySubstitutionToFormalParameters(m2ArgTypes, m2Substitution); return isArgumentsAcceptable(m1ArgTypes, m2ArgTypes, m2VarArity, true); }
/** * @return true, if signature of m1 is more specific than signature of m2 */ private boolean isSignatureMoreSpecific(JavaSymbol m1, JavaSymbol m2) { List<JavaType> m1ArgTypes = ((JavaType.MethodJavaType) m1.type).argTypes; List<JavaType> m2ArgTypes = ((JavaType.MethodJavaType) m2.type).argTypes; JavaSymbol.MethodJavaSymbol methodJavaSymbol = (JavaSymbol.MethodJavaSymbol) m1; if (methodJavaSymbol.isVarArgs()) { m1ArgTypes = expandVarArgsToFitSize(m1ArgTypes, m2ArgTypes.size()); } boolean usesTypeParameter = usesTypeParameter(methodJavaSymbol); return isArgumentsAcceptable(m1ArgTypes, m2ArgTypes, ((JavaSymbol.MethodJavaSymbol) m2).isVarArgs(), false, usesTypeParameter); }
/** * @param symbol candidate * @param bestSoFar previously found best match */ private JavaSymbol selectBest(Env env, JavaSymbol.TypeJavaSymbol site, List<JavaType> argTypes, JavaSymbol symbol, JavaSymbol bestSoFar, boolean autoboxing) { // TODO get rid of null check if (symbol.kind >= JavaSymbol.ERRONEOUS || !isInheritedIn(symbol, site) || symbol.type == null) { return bestSoFar; } boolean isVarArgs = ((JavaSymbol.MethodJavaSymbol) symbol).isVarArgs(); if (!isArgumentsAcceptable(argTypes, ((JavaType.MethodJavaType) symbol.type).argTypes, isVarArgs, autoboxing)) { return bestSoFar; } // TODO ambiguity, errors, ... if (!isAccessible(env, site, symbol)) { return new AccessErrorJavaSymbol(symbol, symbols.unknownType); } JavaSymbol mostSpecific = selectMostSpecific(symbol, bestSoFar, argTypes); if (mostSpecific.isKind(JavaSymbol.AMBIGUOUS)) { //same signature, we keep the first symbol found (overrides the other one). mostSpecific = bestSoFar; } return mostSpecific; }
/** * @param candidate candidate * @param bestSoFar previously found best match */ private JavaSymbol selectBest(Env env, JavaSymbol.TypeJavaSymbol site, List<JavaType> argTypes, JavaSymbol candidate, JavaSymbol bestSoFar, boolean autoboxing) { // TODO get rid of null check if (candidate.kind >= JavaSymbol.ERRONEOUS || !isInheritedIn(candidate, site) || candidate.type == null) { return bestSoFar; } JavaSymbol.MethodJavaSymbol methodJavaSymbol = (JavaSymbol.MethodJavaSymbol) candidate; boolean isVarArgs = methodJavaSymbol.isVarArgs(); boolean usesTypeParameter = usesTypeParameter(methodJavaSymbol); if (!isArgumentsAcceptable(argTypes, ((JavaType.MethodJavaType) candidate.type).argTypes, isVarArgs, autoboxing, usesTypeParameter)) { return bestSoFar; } // TODO ambiguity, errors, ... if (!isAccessible(env, site, candidate)) { return new AccessErrorJavaSymbol(candidate, Symbols.unknownType); } JavaSymbol mostSpecific = selectMostSpecific(candidate, bestSoFar); if (mostSpecific.isKind(JavaSymbol.AMBIGUOUS)) { // same signature, we keep the first symbol found (overrides the other one). mostSpecific = bestSoFar; } return mostSpecific; }
if (!isArgumentsAcceptable(argTypes, formals, methodJavaSymbol.isVarArgs(), looseInvocation)) { return bestSoFar;
if (!isArgumentsAcceptable(argTypes, formals, methodJavaSymbol.isVarArgs(), looseInvocation)) { return bestSoFar;