diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java index cd5e845536f4..5315a6ca17b0 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java @@ -77,7 +77,7 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { final PyExpression firstArgument = ArrayUtil.getFirstElement(call.getArguments()); final String firstArgumentValue = PyStringLiteralUtil.getStringValue(firstArgument); if (firstArgumentValue != null && - PyNames.isIdentifierString(firstArgumentValue) && + PyNames.isIdentifier(firstArgumentValue) && (caretInParameterList || PsiTreeUtil.isAncestor(call, element, true))) { return true; } @@ -87,7 +87,7 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { final PyExpression indexExpression = subscription.getIndexExpression(); final String indexValue = PyStringLiteralUtil.getStringValue(indexExpression); if (indexValue != null && - PyNames.isIdentifierString(indexValue) && + PyNames.isIdentifier(indexValue) && (caretInParameterList || PsiTreeUtil.isAncestor(subscription, element, true))) { return true; } @@ -137,6 +137,7 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { .ofNullable(subscription.getIndexExpression()) .map(indexExpression -> PyUtil.as(indexExpression, PyStringLiteralExpression.class)) .map(PyStringLiteralExpression::getStringValue) + .filter(PyNames::isIdentifier) .map(indexValue -> elementGenerator.createExpressionFromText(LanguageLevel.forElement(function), indexValue)) .ifPresent( parameter -> { @@ -161,9 +162,10 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { .map(ArrayUtil::getFirstElement) .map(firstArgument -> PyUtil.as(firstArgument, PyStringLiteralExpression.class)) .map(PyStringLiteralExpression::getStringValue) + .filter(PyNames::isIdentifier) .ifPresent( indexValue -> { - final PyNamedParameter parameterWithDefaultValue = getParameterWithDefaultValue(elementGenerator, call, indexValue); + final PyNamedParameter parameterWithDefaultValue = createParameterWithDefaultValue(elementGenerator, call, indexValue); final PyExpression parameter = elementGenerator.createExpressionFromText(LanguageLevel.forElement(function), indexValue); final PyParameter keywordContainer = getKeywordContainer(function); @@ -239,9 +241,9 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { } @Nullable - private static PyNamedParameter getParameterWithDefaultValue(@NotNull PyElementGenerator elementGenerator, - @NotNull PyCallExpression call, - @NotNull String parameterName) { + private static PyNamedParameter createParameterWithDefaultValue(@NotNull PyElementGenerator elementGenerator, + @NotNull PyCallExpression call, + @NotNull String parameterName) { final PyExpression[] arguments = call.getArguments(); if (arguments.length > 1) { return elementGenerator.createParameter(parameterName + "=" + arguments[1].getText()); diff --git a/python/testData/intentions/convertVariadicParamInvalidIdentifiers.py b/python/testData/intentions/convertVariadicParamInvalidIdentifiers.py new file mode 100644 index 000000000000..767eb24595ea --- /dev/null +++ b/python/testData/intentions/convertVariadicParamInvalidIdentifiers.py @@ -0,0 +1,2 @@ +def foo(**kwargs): + return kwargs["bar"] + kwargs["&"] + kwargs.get("|") + kwargs["not"] \ No newline at end of file diff --git a/python/testData/intentions/convertVariadicParamInvalidIdentifiers_after.py b/python/testData/intentions/convertVariadicParamInvalidIdentifiers_after.py new file mode 100644 index 000000000000..b96a5b1dbd0b --- /dev/null +++ b/python/testData/intentions/convertVariadicParamInvalidIdentifiers_after.py @@ -0,0 +1,2 @@ +def foo(bar, **kwargs): + return bar + kwargs["&"] + kwargs.get("|") + kwargs["not"] \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java index 6e02c8c69a0c..f33a9239f6dc 100644 --- a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java @@ -227,6 +227,10 @@ public class PyIntentionTest extends PyTestCase { doNegativeTest(PyBundle.message("INTN.convert.variadic.param")); } + public void testConvertVariadicParamInvalidIdentifiers() { + doTest(PyBundle.message("INTN.convert.variadic.param")); + } + public void testConvertTripleQuotedString() { //PY-2697 doTest(PyBundle.message("INTN.triple.quoted.string")); }