void (@NotNull PyArgumentList node, @NotNull ProblemsHolder holder, @NotNull List<PyCallExpression.PyArgumentsMapping> mappings, @NotNull TypeEvalContext context) { if (mappings.isEmpty() || mappings.stream().anyMatch(mapping -> mapping.getUnmappedArguments().isEmpty())) return; if (mappings.size() == 1) { // if there is only one mapping, we could suggest quick fixes final Set<String> duplicateKeywords = getDuplicateKeywordArguments(node); final PyCallExpression.PyArgumentsMapping mapping = mappings.get(0); if (holder.isOnTheFly() && !mapping.getUnmappedArguments().isEmpty() && mapping.getUnmappedParameters().isEmpty()) { final PyCallableType callableType = mapping.getCallableType(); if (callableType != null) { final PyCallable callable = callableType.getCallable(); final Project project = node.getProject(); if (callable instanceof PyFunction && !PyPsiIndexUtil.isNotUnderSourceRoot(project, callable.getContainingFile())) { final String message = PyPsiBundle.message("INSP.unexpected.arg(s)"); holder.registerProblem(node, message, ProblemHighlightType.INFORMATION, PythonUiService.getInstance().createPyChangeSignatureQuickFixForMismatchedCall(mapping)); } } } for (PyExpression argument : mapping.getUnmappedArguments()) { final List<LocalQuickFix> quickFixes = Lists.newArrayList(new PyRemoveArgumentQuickFix()); if (argument instanceof PyKeywordArgument) { if (duplicateKeywords.contains(((PyKeywordArgument)argument).getKeyword())) { continue; } quickFixes.add(new PyRenameArgumentQuickFix()); } holder.registerProblem(argument, PyPsiBundle.message("INSP.unexpected.arg"), quickFixes.toArray(new LocalQuickFix[quickFixes.size() - 1])); } } else { // all mappings have unmapped arguments so we couldn't determine desired argument list and suggest appropriate quick fixes holder.registerProblem( node, addPossibleCalleesRepresentation(PyPsiBundle.message("INSP.unexpected.arg(s)"), mappings, context, holder.isOnTheFly()) ); } }