diff --git a/python/src/com/jetbrains/python/inspections/quickfix/PyChangeSignatureQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/PyChangeSignatureQuickFix.java index 24886a73f171..0f61583d7b46 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/PyChangeSignatureQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/PyChangeSignatureQuickFix.java @@ -187,15 +187,21 @@ public class PyChangeSignatureQuickFix extends LocalQuickFixOnPsiElement { @NotNull PyFunction function, @NotNull Set usedParameterNames, @NotNull TypeEvalContext context) { - PyType type = context.getType(argumentValue); - if (type instanceof PyUnionType) { - type = ContainerUtil.find(((PyUnionType)type).getMembers(), Conditions.instanceOf(PyClassType.class)); + final Collection suggestions = new LinkedHashSet<>(); + final PyCallExpression callExpr = as(argumentValue, PyCallExpression.class); + final PyElement referenceElem = as(callExpr != null ? callExpr.getCallee() : argumentValue, PyReferenceExpression.class); + if (referenceElem != null) { + suggestions.addAll(NameSuggesterUtil.generateNames(referenceElem.getText())); } - final String typeName = type != null && type.getName() != null ? type.getName() : "object"; - - final Collection suggestions = NameSuggesterUtil.generateNamesByType(typeName); - final String shortestName = ContainerUtil.getFirstItem(suggestions); - assert shortestName != null; + if (suggestions.isEmpty()) { + PyType type = context.getType(argumentValue); + if (type instanceof PyUnionType) { + type = ContainerUtil.find(((PyUnionType)type).getMembers(), Conditions.instanceOf(PyClassType.class)); + } + final String typeName = type != null && type.getName() != null ? type.getName() : "object"; + suggestions.addAll(NameSuggesterUtil.generateNamesByType(typeName)); + } + final String shortestName = Collections.min(suggestions, Comparator.comparingInt(String::length)); String result = shortestName; int counter = 1; diff --git a/python/testData/inspections/ChangeSignatureNewParametersNames.py b/python/testData/inspections/ChangeSignatureNewParametersNames.py index 2d7040d78247..1477278aa0db 100644 --- a/python/testData/inspections/ChangeSignatureNewParametersNames.py +++ b/python/testData/inspections/ChangeSignatureNewParametersNames.py @@ -2,5 +2,4 @@ def func(i1): i2 = 'Spam' -x = 42 or 'str' -func(1, 2, x) \ No newline at end of file +func(1, 2, 42 or 'str', get_num()) \ No newline at end of file diff --git a/python/testData/inspections/ChangeSignatureNewParametersNames_after.py b/python/testData/inspections/ChangeSignatureNewParametersNames_after.py index 24912b03b2c8..8281e37a5ed5 100644 --- a/python/testData/inspections/ChangeSignatureNewParametersNames_after.py +++ b/python/testData/inspections/ChangeSignatureNewParametersNames_after.py @@ -1,6 +1,5 @@ -def func(i1, i, i3): +def func(i1, i, i3, num): i2 = 'Spam' -x = 42 or 'str' -func(1, 2, x) \ No newline at end of file +func(1, 2, 42 or 'str', get_num()) \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java index 44d34f955a4b..bf03e83e183d 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java @@ -17,8 +17,10 @@ package com.jetbrains.python; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.ex.InspectionProfileImpl; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.TestDataFile; import com.intellij.testFramework.TestDataPath; +import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.codeInsight.PyCodeInsightSettings; import com.jetbrains.python.documentation.docstrings.DocStringFormat; import com.jetbrains.python.fixtures.PyTestCase; @@ -661,7 +663,7 @@ public class PyQuickFixTest extends PyTestCase { // PY-8174 public void testChangeSignatureNewParametersNames() { - doInspectionTest(PyArgumentListInspection.class, "Change signature of func(i1, i, i3)", true, true); + doInspectionTest(PyArgumentListInspection.class, "Change signature of func(i1, i, i3, num)", true, true); } // PY-8174 @@ -712,7 +714,9 @@ public class PyQuickFixTest extends PyTestCase { final List intentionActions = myFixture.filterAvailableIntentions(quickFixName); if (available) { if (intentionActions.isEmpty()) { - throw new AssertionError("Quickfix \"" + quickFixName + "\" is not available"); + final List intentionNames = ContainerUtil.map(myFixture.getAvailableIntentions(), IntentionAction::getText); + throw new AssertionError("Quickfix starting with \"" + quickFixName + "\" is not available. " + + "Available intentions:\n" + StringUtil.join(intentionNames, "\n")); } if (intentionActions.size() > 1) { throw new AssertionError("There are more than one quickfix with the name \"" + quickFixName + "\"");