From 28156d540dbc643a5a605564bdc3ed1c8bd5a235 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Wed, 3 Aug 2016 15:32:06 +0300 Subject: [PATCH] Simplify ConvertVariadicParamIntention.isAvailable, annotate PyNames.isIdentifierString and link PyIntentionTest.testConvertVariadicParamEmptySubscription with issue --- .../src/com/jetbrains/python/PyNames.java | 2 +- .../ConvertVariadicParamIntention.java | 46 ++++++++++--------- .../python/intentions/PyIntentionTest.java | 1 + 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/PyNames.java b/python/psi-api/src/com/jetbrains/python/PyNames.java index 25bf044e8796..623096171a8d 100644 --- a/python/psi-api/src/com/jetbrains/python/PyNames.java +++ b/python/psi-api/src/com/jetbrains/python/PyNames.java @@ -552,7 +552,7 @@ public class PyNames { return !isReserved(name) && isIdentifierString(name); } - public static boolean isIdentifierString(String name) { + public static boolean isIdentifierString(@NotNull @NonNls String name) { return IDENTIFIER_PATTERN.matcher(name).matches(); } diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertVariadicParamIntention.java index 99bb88dc136e..d71a4c76159f 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-2014 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.Stack; import com.jetbrains.python.PyBundle; @@ -60,38 +61,39 @@ public class ConvertVariadicParamIntention extends BaseIntentionAction { return PyBundle.message("INTN.convert.variadic.param"); } + @Override public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { if (!(file instanceof PyFile)) { return false; } - PyFunction function = - PsiTreeUtil.getParentOfType(file.findElementAt(editor.getCaretModel().getOffset()), PyFunction.class); + final PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); + final PyFunction function = PsiTreeUtil.getParentOfType(element, PyFunction.class); + if (function != null) { - PyParameter[] parameterList = function.getParameterList().getParameters(); - for (PyParameter parameter : parameterList) { - if (parameter instanceof PyNamedParameter) { - if (((PyNamedParameter)parameter).isKeywordContainer()) { - List subscriptions = fillSubscriptions(function); - List callElements = fillCallExpressions(function); - if ((subscriptions.size() + callElements.size()) != 0) { - for (PyCallExpression element : callElements) { - final PyExpression[] arguments = element.getArguments(); - if (arguments.length < 1) return false; - if (!PyNames.isIdentifierString(PythonStringUtil.getStringValue(arguments[0]))) - return false; - } - for (PySubscriptionExpression subscription : subscriptions) { - final PyExpression expression = subscription.getIndexExpression(); - if (expression == null || !PyNames.isIdentifierString(PythonStringUtil.getStringValue(expression))) - return false; - } + for (PyParameter parameter : function.getParameterList().getParameters()) { + if (parameter instanceof PyNamedParameter && ((PyNamedParameter)parameter).isKeywordContainer()) { + for (PyCallExpression call : fillCallExpressions(function)) { + final PyExpression firstArgument = ArrayUtil.getFirstElement(call.getArguments()); + final String firstArgumentValue = PythonStringUtil.getStringValue(firstArgument); + if (firstArgumentValue == null || !PyNames.isIdentifierString(firstArgumentValue)) { + return false; } - return true; } + + for (PySubscriptionExpression subscription : fillSubscriptions(function)) { + final PyExpression indexExpression = subscription.getIndexExpression(); + final String indexValue = PythonStringUtil.getStringValue(indexExpression); + if (indexValue == null || !PyNames.isIdentifierString(indexValue)) { + return false; + } + } + + return true; } } } + return false; } diff --git a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java index 9cc021579039..53d2dc40c315 100644 --- a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java @@ -228,6 +228,7 @@ public class PyIntentionTest extends PyTestCase { doTest(PyBundle.message("INTN.convert.variadic.param")); } + // PY-20254 public void testConvertVariadicParamEmptySubscription() { doNegativeTest(PyBundle.message("INTN.convert.variadic.param")); }