void (@NotNull final GrParameterList parameterList) { PsiElement parent = parameterList.getParent(); if (!(parent instanceof GrFunctionalExpression)) return; GrParameter[] parameters = parameterList.getParameters(); if (parameters.length > 0) { List<PsiType[]> signatures = ClosureParamsEnhancer.findFittingSignatures((GrFunctionalExpression)parent); // TODO: suspicious method call final List<PsiType> paramTypes = ContainerUtil.map(parameters, parameter -> parameter.getType()); if (signatures.size() > 1) { final PsiType[] fittingSignature = ContainerUtil.find(signatures, types -> { for (int i = 0; i < types.length; i++) { if (!TypesUtil.isAssignableByMethodCallConversion(paramTypes.get(i), types[i], parameterList)) { return false; } } return true; }); if (fittingSignature == null) { registerError( parameterList, GroovyBundle.message("no.applicable.signature.found"), null, ProblemHighlightType.GENERIC_ERROR ); } } else if (signatures.size() == 1) { PsiType[] types = signatures.get(0); for (int i = 0; i < types.length; i++) { GrTypeElement typeElement = parameters[i].getTypeElementGroovy(); if (typeElement == null) continue; PsiType expected = types[i]; PsiType actual = paramTypes.get(i); if (!TypesUtil.isAssignableByMethodCallConversion(actual, expected, parameterList)) { registerError( typeElement, GroovyBundle.message("expected.type.0", expected.getCanonicalText(false), actual.getCanonicalText(false)), null, ProblemHighlightType.GENERIC_ERROR ); } } } } }