private TypeSubstitution inferTypeSubstitution(MethodJavaSymbol method, TypeSubstitution substitution, JavaType formalType, JavaType argumentType, boolean variableArity, List<JavaType> remainingArgTypes) { if(handledFormals.get(formalType).contains(argumentType)) { return substitution; } JavaType argType = argumentType; if (argType.isTagged(JavaType.DEFERRED)) { argType = ((DeferredType) argType).getUninferedType(); } handledFormals.put(formalType, argType); TypeSubstitution result = substitution; if (formalType.isTagged(JavaType.TYPEVAR)) { result = inferTypeSubstitutionInTypeVariable(method, substitution, (TypeVariableJavaType) formalType, argType, variableArity, remainingArgTypes); } else if (formalType.isArray()) { result = inferTypeSubstitutionInArrayType(method, substitution, (ArrayJavaType) formalType, argType, variableArity, remainingArgTypes); } else if (formalType.isParameterized()) { result = inferTypeSubstitutionInParameterizedType(method, substitution, (ParametrizedTypeJavaType) formalType, argType, variableArity, remainingArgTypes); } else if (formalType.isTagged(JavaType.WILDCARD)) { result = inferTypeSubstitutionInWildcardType(method, substitution, (WildCardType) formalType, argType, variableArity, remainingArgTypes); } else { // nothing to infer for simple class types or primitive types } return result; }
private TypeSubstitution inferTypeSubstitution(MethodJavaSymbol method, TypeSubstitution substitution, JavaType formalType, JavaType argumentType, boolean variableArity, List<JavaType> remainingArgTypes) { if(handledFormals.get(formalType).contains(argumentType)) { return substitution; } JavaType argType = argumentType; if (argType.isTagged(JavaType.DEFERRED)) { argType = ((DeferredType) argType).getUninferedType(); } handledFormals.put(formalType, argType); TypeSubstitution result = substitution; if (formalType.isTagged(JavaType.TYPEVAR)) { result = inferTypeSubstitutionInTypeVariable(method, substitution, (TypeVariableJavaType) formalType, argType, variableArity, remainingArgTypes); } else if (formalType.isArray()) { result = inferTypeSubstitutionInArrayType(method, substitution, (ArrayJavaType) formalType, argType, variableArity, remainingArgTypes); } else if (formalType.isParameterized()) { result = inferTypeSubstitutionInParameterizedType(method, substitution, (ParametrizedTypeJavaType) formalType, argType, variableArity, remainingArgTypes); } else if (formalType.isTagged(JavaType.WILDCARD)) { result = inferTypeSubstitutionInWildcardType(method, substitution, (WildCardType) formalType, argType, variableArity, remainingArgTypes); } else { // nothing to infer for simple class types or primitive types } return result; }