void (final PsiParameter[] declaredParams, final PsiExpression[] actualArgumentExpressions, final PsiSubstitutor methodResolveSubstitutor, final Evaluator[] argumentEvaluators) { if (declaredParams.length > 0) { final int paramCount = Math.max(declaredParams.length, actualArgumentExpressions.length); PsiType varargType = null; for (int idx = 0; idx < paramCount; idx++) { if (idx >= actualArgumentExpressions.length) { break; // actual arguments count is less than number of declared params } PsiType declaredParamType; if (idx < declaredParams.length) { declaredParamType = methodResolveSubstitutor.substitute(declaredParams[idx].getType()); if (declaredParamType instanceof PsiEllipsisType) { declaredParamType = varargType = ((PsiEllipsisType)declaredParamType).getComponentType(); } } else if (varargType != null) { declaredParamType = varargType; } else { break; } final PsiType actualArgType = actualArgumentExpressions[idx].getType(); if (TypeConversionUtil.boxingConversionApplicable(declaredParamType, actualArgType) || (declaredParamType != null && actualArgType == null)) { final Evaluator argEval = argumentEvaluators[idx]; argumentEvaluators[idx] = declaredParamType instanceof PsiPrimitiveType ? new UnBoxingEvaluator(argEval) : new BoxingEvaluator(argEval); } } } }