From fbdcd38462083f84bd532126e7135c00e8663814 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Tue, 3 Oct 2017 18:30:58 +0300 Subject: [PATCH] Update ConvertVariadicParamIntention.isAvailable (PY-25035) Display the intention only on parameter list and references to variadic parameters (not anywhere inside a function) and only if there are corresponding subscriptions / get() calls in function's body. --- .../ConvertVariadicParamIntention.java | 22 +++++++++++-------- .../convertVariadicParamNoUsages.py | 2 ++ .../convertVariadicParamUnrelatedCaret.py | 3 +++ .../python/intentions/PyIntentionTest.java | 10 +++++++++ 4 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 python/testData/intentions/convertVariadicParamNoUsages.py create mode 100644 python/testData/intentions/convertVariadicParamUnrelatedCaret.py diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java index bbea96bc765d..cd5e845536f4 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,23 +71,27 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { final PyFunction function = PsiTreeUtil.getParentOfType(element, PyFunction.class); if (function != null) { + final boolean caretInParameterList = PsiTreeUtil.isAncestor(function.getParameterList(), element, true); + for (PyCallExpression call : findKeywordContainerCalls(function)) { final PyExpression firstArgument = ArrayUtil.getFirstElement(call.getArguments()); final String firstArgumentValue = PyStringLiteralUtil.getStringValue(firstArgument); - if (firstArgumentValue == null || !PyNames.isIdentifierString(firstArgumentValue)) { - return false; + if (firstArgumentValue != null && + PyNames.isIdentifierString(firstArgumentValue) && + (caretInParameterList || PsiTreeUtil.isAncestor(call, element, true))) { + return true; } } for (PySubscriptionExpression subscription : findKeywordContainerSubscriptions(function)) { final PyExpression indexExpression = subscription.getIndexExpression(); final String indexValue = PyStringLiteralUtil.getStringValue(indexExpression); - if (indexValue == null || !PyNames.isIdentifierString(indexValue)) { - return false; + if (indexValue != null && + PyNames.isIdentifierString(indexValue) && + (caretInParameterList || PsiTreeUtil.isAncestor(subscription, element, true))) { + return true; } } - - return getKeywordContainer(function) != null; } return false; @@ -186,8 +190,8 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction { final String keywordContainerName = keywordContainer == null ? null : keywordContainer.getName(); if (keywordContainerName != null) { - final List result = new ArrayList(); - final Stack stack = new Stack(); + final List result = new ArrayList<>(); + final Stack stack = new Stack<>(); for (PyStatement statement : function.getStatementList().getStatements()) { stack.push(statement); diff --git a/python/testData/intentions/convertVariadicParamNoUsages.py b/python/testData/intentions/convertVariadicParamNoUsages.py new file mode 100644 index 000000000000..248b62f09509 --- /dev/null +++ b/python/testData/intentions/convertVariadicParamNoUsages.py @@ -0,0 +1,2 @@ +def foo(**kwargs): + print("ok") \ No newline at end of file diff --git a/python/testData/intentions/convertVariadicParamUnrelatedCaret.py b/python/testData/intentions/convertVariadicParamUnrelatedCaret.py new file mode 100644 index 000000000000..42d69ef09b20 --- /dev/null +++ b/python/testData/intentions/convertVariadicParamUnrelatedCaret.py @@ -0,0 +1,3 @@ +def foo(**kwargs): + print("ok") + print(kwargs["foo"]) \ 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 de2b1dfbc5dd..6e02c8c69a0c 100644 --- a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java @@ -217,6 +217,16 @@ public class PyIntentionTest extends PyTestCase { doNegativeTest(PyBundle.message("INTN.convert.variadic.param")); } + // PY-25035 + public void testConvertVariadicParamNoUsages() { + doNegativeTest(PyBundle.message("INTN.convert.variadic.param")); + } + + // PY-25035 + public void testConvertVariadicParamUnrelatedCaret() { + doNegativeTest(PyBundle.message("INTN.convert.variadic.param")); + } + public void testConvertTripleQuotedString() { //PY-2697 doTest(PyBundle.message("INTN.triple.quoted.string")); }