diff --git a/python/python-ast/src/com/jetbrains/python/ast/PyAstBinaryExpression.java b/python/python-ast/src/com/jetbrains/python/ast/PyAstBinaryExpression.java index 351b42582a75..211083b45208 100644 --- a/python/python-ast/src/com/jetbrains/python/ast/PyAstBinaryExpression.java +++ b/python/python-ast/src/com/jetbrains/python/ast/PyAstBinaryExpression.java @@ -8,6 +8,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.QualifiedName; import com.intellij.util.ObjectUtils; +import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.ast.impl.PyPsiUtilsCore; @@ -17,7 +18,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collections; import java.util.List; @@ -109,8 +109,9 @@ public interface PyAstBinaryExpression extends PyAstQualifiedExpression, PyAstCa } @Override - default @NotNull List getArguments(@Nullable PyAstCallable resolvedCallee) { - return Collections.singletonList(isRightOperator(resolvedCallee) ? getChainedComparisonAwareLeftExpression() : getRightExpression()); + default @NotNull List<@NotNull PyAstExpression> getArguments(@Nullable PyAstCallable resolvedCallee) { + PyAstExpression operand = isRightOperator(resolvedCallee) ? getChainedComparisonAwareLeftExpression() : getRightExpression(); + return ContainerUtil.createMaybeSingletonList(operand); } private @Nullable PyAstExpression getChainedComparisonAwareLeftExpression() { diff --git a/python/python-ast/src/com/jetbrains/python/ast/PyAstCallExpression.java b/python/python-ast/src/com/jetbrains/python/ast/PyAstCallExpression.java index 1d6284ef2299..48aa26bf6de7 100644 --- a/python/python-ast/src/com/jetbrains/python/ast/PyAstCallExpression.java +++ b/python/python-ast/src/com/jetbrains/python/ast/PyAstCallExpression.java @@ -50,7 +50,7 @@ public interface PyAstCallExpression extends PyAstCallSiteExpression { } @Override - default @NotNull List getArguments(@Nullable PyAstCallable resolvedCallee) { + default @NotNull List<@NotNull PyAstExpression> getArguments(@Nullable PyAstCallable resolvedCallee) { return Arrays.asList(getArguments()); } diff --git a/python/python-ast/src/com/jetbrains/python/ast/PyAstCallSiteExpression.java b/python/python-ast/src/com/jetbrains/python/ast/PyAstCallSiteExpression.java index bccf9b27c549..0449d4aa7d34 100644 --- a/python/python-ast/src/com/jetbrains/python/ast/PyAstCallSiteExpression.java +++ b/python/python-ast/src/com/jetbrains/python/ast/PyAstCallSiteExpression.java @@ -42,5 +42,5 @@ public interface PyAstCallSiteExpression extends PyAstExpression { PyAstExpression getReceiver(@Nullable PyAstCallable resolvedCallee); @NotNull - List getArguments(@Nullable PyAstCallable resolvedCallee); + List getArguments(@Nullable PyAstCallable resolvedCallee); } diff --git a/python/python-ast/src/com/jetbrains/python/ast/PyAstPrefixExpression.java b/python/python-ast/src/com/jetbrains/python/ast/PyAstPrefixExpression.java index d90ad3d89e1d..fad94d769762 100644 --- a/python/python-ast/src/com/jetbrains/python/ast/PyAstPrefixExpression.java +++ b/python/python-ast/src/com/jetbrains/python/ast/PyAstPrefixExpression.java @@ -25,7 +25,7 @@ public interface PyAstPrefixExpression extends PyAstQualifiedExpression, PyAstRe } @Override - default @NotNull List getArguments(@Nullable PyAstCallable resolvedCallee) { + default @NotNull List<@NotNull PyAstExpression> getArguments(@Nullable PyAstCallable resolvedCallee) { return Collections.emptyList(); } diff --git a/python/python-ast/src/com/jetbrains/python/ast/PyAstSubscriptionExpression.java b/python/python-ast/src/com/jetbrains/python/ast/PyAstSubscriptionExpression.java index 6e9a61c7c313..44f5c3a8c9d3 100644 --- a/python/python-ast/src/com/jetbrains/python/ast/PyAstSubscriptionExpression.java +++ b/python/python-ast/src/com/jetbrains/python/ast/PyAstSubscriptionExpression.java @@ -2,8 +2,8 @@ package com.jetbrains.python.ast; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; import com.intellij.psi.util.QualifiedName; +import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.PythonDialectsTokenSetProvider; @@ -13,7 +13,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -27,14 +27,13 @@ public interface PyAstSubscriptionExpression extends PyAstQualifiedExpression, P } @Override - default @NotNull List getArguments(@Nullable PyAstCallable resolvedCallee) { - if (AccessDirection.of(this) == AccessDirection.WRITE) { - final PsiElement parent = getParent(); - if (parent instanceof PyAstAssignmentStatement) { - return Arrays.asList(getIndexExpression(), ((PyAstAssignmentStatement)parent).getAssignedValue()); - } + default @NotNull List<@NotNull PyAstExpression> getArguments(@Nullable PyAstCallable resolvedCallee) { + List result = new ArrayList<>(); + ContainerUtil.addIfNotNull(result, getIndexExpression()); + if (AccessDirection.of(this) == AccessDirection.WRITE && getParent() instanceof PyAstAssignmentStatement assignment) { + ContainerUtil.addIfNotNull(result, assignment.getAssignedValue()); } - return Collections.singletonList(getIndexExpression()); + return Collections.unmodifiableList(result); } /** diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/PyCallSiteExpression.java b/python/python-psi-api/src/com/jetbrains/python/psi/PyCallSiteExpression.java index 48374fa13ed4..e1592a7208ba 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/PyCallSiteExpression.java +++ b/python/python-psi-api/src/com/jetbrains/python/psi/PyCallSiteExpression.java @@ -28,8 +28,8 @@ public interface PyCallSiteExpression extends PyAstCallSiteExpression, PyExpress return (PyExpression)getReceiver((PyAstCallable)resolvedCallee); } - default @NotNull List getArguments(@Nullable PyCallable resolvedCallee) { + default @NotNull List<@NotNull PyExpression> getArguments(@Nullable PyCallable resolvedCallee) { //noinspection unchecked - return (List)getArguments((PyAstCallable)resolvedCallee); + return (List<@NotNull PyExpression>)getArguments((PyAstCallable)resolvedCallee); } } diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.kt b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.kt index 3a2d808155cf..60d965483b0d 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.kt @@ -1025,14 +1025,10 @@ fun analyzeArguments( } else if (!allPositionalArguments.isEmpty()) { val positionalArgument = allPositionalArguments.next() - if (positionalArgument != null) { - mappedParameters.put(positionalArgument, parameter) - if (positionalComponentsOfVariadicArguments.contains(positionalArgument)) { - parametersMappedToVariadicPositionalArguments.add(parameter) - } - } - else if (!parameter.hasDefaultValue()) { - unmappedParameters.add(parameter) + assert(positionalArgument != null) + mappedParameters.put(positionalArgument, parameter) + if (positionalComponentsOfVariadicArguments.contains(positionalArgument)) { + parametersMappedToVariadicPositionalArguments.add(parameter) } } else {