diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/PyCallExpression.java b/python/python-psi-api/src/com/jetbrains/python/psi/PyCallExpression.java index 5e58591cb991..3118638c16cb 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/PyCallExpression.java +++ b/python/python-psi-api/src/com/jetbrains/python/psi/PyCallExpression.java @@ -207,5 +207,12 @@ public interface PyCallExpression extends PyAstCallExpression, PyCallSiteExpress public Map getMappedTupleParameters() { return myMappedTupleParameters; } + + /** + * @return true if there are no unmapped parameters and no unmapped arguments, false otherwise + */ + public boolean isComplete() { + return getUnmappedParameters().isEmpty() && getUnmappedArguments().isEmpty(); + } } } diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java index a42f262cbc63..97fea5c1db92 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java +++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java @@ -262,7 +262,7 @@ public class PyTypeCheckerInspection extends PyInspection { private void checkCallSite(@NotNull PyCallSiteExpression callSite) { final List calleesResults = StreamEx .of(mapArguments(callSite, getResolveContext())) - .filter(mapping -> mapping.getUnmappedArguments().isEmpty() && mapping.getUnmappedParameters().isEmpty()) + .filter(mapping -> mapping.isComplete()) .map(mapping -> analyzeCallee(callSite, mapping)) .nonNull() .toList(); diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeHintsInspection.kt b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeHintsInspection.kt index c28b428db1e2..63998ef100a3 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeHintsInspection.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyTypeHintsInspection.kt @@ -399,7 +399,7 @@ class PyTypeHintsInspection : PyInspection() { val resolveContext = PyResolveContext.defaultContext(myTypeEvalContext) call .multiMapArguments(resolveContext) - .firstOrNull { it.unmappedArguments.isEmpty() && it.unmappedParameters.isEmpty() } + .firstOrNull { it.isComplete } ?.let { mapping -> mapping.mappedParameters.entries.forEach { val name = it.value.name diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java index 141f206ec87f..5b573a3a2fcb 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java @@ -1243,9 +1243,7 @@ public final class PyCallExpressionHelper { @NotNull PyCallSiteExpression callSite, @NotNull TypeEvalContext context) { final PyCallExpression.PyArgumentsMapping fullMapping = mapArguments(callSite, callable, context); - if (!fullMapping.getUnmappedArguments().isEmpty() || !fullMapping.getUnmappedParameters().isEmpty()) { - return false; - } + if (!fullMapping.isComplete()) return false; // TODO properly handle bidirectional operator methods, such as __eq__ and __neq__. // Based only on its name, it's impossible to which operand is the receiver and which one is the argument.