ValidationInfo (final PsiType[] arguments, final PsiType methodReturnType, final @Nullable PsiSubstitutor methodSubstitutor, final PsiElement context) { int lambdaPosition = -1; int defaultValuePosition = -1; int iterablePosition = -1; if (!myAcceptDefaultValue) { if (arguments.length != 2) { return null; } } else { if (arguments.length != 2 && arguments.length != 3) { return null; } } for (int i = 0; i < arguments.length; i++) { PsiType type = arguments[i]; if (type == null) { return null; } if (isFunction(type, methodReturnType, methodSubstitutor, context)) { if (lambdaPosition == -1) { lambdaPosition = i; continue; } else { return null; } } if (isIterableOrArray(type)) { if (iterablePosition == -1) { iterablePosition = i; continue; } else { return null; } } if (myAcceptDefaultValue && methodReturnType.isAssignableFrom(type)) { if (defaultValuePosition == -1) { defaultValuePosition = i; } else { return null; } } } if (lambdaPosition == -1 || iterablePosition == -1) { return null; } if (myAcceptDefaultValue) { if (defaultValuePosition == -1 && arguments.length == 3) { return null; } } return new ValidationInfo(lambdaPosition, iterablePosition, defaultValuePosition); }