void (@NotNull PyParamSpecType paramSpec, @NotNull List<PyExpression> arguments, @NotNull PyTypeChecker.GenericSubstitutions substitutions, @NotNull List<AnalyzeArgumentResult> result, @NotNull List<UnexpectedArgumentForParamSpec> unexpectedArgumentForParamSpecs, @NotNull List<UnfilledParameterFromParamSpec> unfilledParameterFromParamSpecs) { paramSpec = Objects.requireNonNullElse(substitutions.getParamSpecs().get(paramSpec), paramSpec); List<PyCallableParameter> parameters = paramSpec.getParameters(); if (parameters == null) return; var mapping = analyzeArguments(arguments, parameters, myTypeEvalContext); for (var item: mapping.getMappedParameters().entrySet()) { PyExpression argument = item.getKey(); PyCallableParameter parameter = item.getValue(); PyType argType = myTypeEvalContext.getType(argument); PyType paramType = parameter.getType(myTypeEvalContext); boolean matched = matchParameterAndArgument(paramType, argType, argument, substitutions); result.add(new AnalyzeArgumentResult(argument, paramType, substituteGenerics(paramType, substitutions), argType, matched)); } if (!mapping.getUnmappedArguments().isEmpty()) { for (var argument: mapping.getUnmappedArguments()) { unexpectedArgumentForParamSpecs.add(new UnexpectedArgumentForParamSpec(argument, paramSpec)); } } var unmappedParameters = mapping.getUnmappedParameters(); if (!unmappedParameters.isEmpty()) { unfilledParameterFromParamSpecs.add(new UnfilledParameterFromParamSpec(unmappedParameters.get(0), paramSpec)); } }