diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 6417e740ad8e..7280fdf76bdb 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -508,6 +508,7 @@ + diff --git a/python/src/com/jetbrains/python/actions/ConvertDocstringQuickFix.java b/python/src/com/jetbrains/python/actions/ConvertDocstringQuickFix.java index f08fd2900e4c..aaa01a0b881e 100644 --- a/python/src/com/jetbrains/python/actions/ConvertDocstringQuickFix.java +++ b/python/src/com/jetbrains/python/actions/ConvertDocstringQuickFix.java @@ -5,7 +5,9 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.jetbrains.python.PyBundle; -import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.PyElementGenerator; +import com.jetbrains.python.psi.PyExpression; +import com.jetbrains.python.psi.PyStringLiteralExpression; import com.jetbrains.python.psi.impl.PyStringLiteralExpressionImpl; import org.jetbrains.annotations.NotNull; @@ -41,7 +43,9 @@ public class ConvertDocstringQuickFix implements LocalQuickFix { String content = expression.getText().substring(prefixLength); if (content.startsWith("'''") ) { content = content.substring(3, content.length()-3); - } else { + } else if (content.startsWith("\"\"\"")) + return; + else { content = content.length() == 1 ? "" : content.substring(1, content.length()-1); } diff --git a/python/src/com/jetbrains/python/actions/RemoveArgumentEqualDefaultQuickFix.java b/python/src/com/jetbrains/python/actions/RemoveArgumentEqualDefaultQuickFix.java index dd3c22c4fd73..ca0d8e2115f6 100644 --- a/python/src/com/jetbrains/python/actions/RemoveArgumentEqualDefaultQuickFix.java +++ b/python/src/com/jetbrains/python/actions/RemoveArgumentEqualDefaultQuickFix.java @@ -3,14 +3,15 @@ package com.jetbrains.python.actions; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.PyBundle; -import com.jetbrains.python.psi.PyArgumentList; -import com.jetbrains.python.psi.PyExpression; -import com.jetbrains.python.psi.PyKeywordArgument; +import com.jetbrains.python.psi.*; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; import java.util.Set; /** @@ -36,14 +37,23 @@ public class RemoveArgumentEqualDefaultQuickFix implements LocalQuickFix { public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement element = descriptor.getPsiElement(); - PyExpression[] arguments = PsiTreeUtil.getParentOfType(element, PyArgumentList.class).getArguments(); - boolean canDelete = true; - for (int i = arguments.length-1; i != -1; --i) { - if (myProblemElements.contains(arguments[i])) { - if (canDelete) - arguments[i].delete(); + + PyArgumentList argumentList = PsiTreeUtil.getParentOfType(element, PyArgumentList.class); + if (argumentList == null) return; + StringBuilder newArgumentList = new StringBuilder("foo("); + + PyExpression[] arguments = argumentList.getArguments(); + List newArgs = new ArrayList(); + for (int i = 0; i != arguments.length; ++i) { + if (!myProblemElements.contains(arguments[i])) { + newArgs.add(arguments[i].getText()); } - else if (!(arguments[i] instanceof PyKeywordArgument)) canDelete = false; } + + newArgumentList.append(StringUtil.join(newArgs, ", ")).append(")"); + PyExpression expression = PyElementGenerator.getInstance(project).createFromText( + LanguageLevel.forElement(argumentList), PyExpressionStatement.class, newArgumentList.toString()).getExpression(); + if (expression instanceof PyCallExpression) + argumentList.replace(((PyCallExpression)expression).getArgumentList()); } } diff --git a/python/src/com/jetbrains/python/inspections/PyRedundantParenthesesInspection.java b/python/src/com/jetbrains/python/inspections/PyRedundantParenthesesInspection.java index e81287e52f25..2321395c7445 100644 --- a/python/src/com/jetbrains/python/inspections/PyRedundantParenthesesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyRedundantParenthesesInspection.java @@ -69,6 +69,8 @@ public class PyRedundantParenthesesInspection extends PyInspection { registerProblem(node, "Remove redundant parentheses", new RedundantParenthesesQuickFix()); } else if (expression instanceof PyBinaryExpression) { + if (node.getParent() instanceof PyPrefixExpression) + return; if (((PyBinaryExpression)expression).getOperator() == PyTokenTypes.AND_KEYWORD || ((PyBinaryExpression)expression).getOperator() == PyTokenTypes.OR_KEYWORD) { if (((PyBinaryExpression)expression).getLeftExpression() instanceof PyParenthesizedExpression && diff --git a/python/src/com/jetbrains/python/run/AbstractPyCommonOptionsForm.java b/python/src/com/jetbrains/python/run/AbstractPyCommonOptionsForm.java index ec967f54b346..8f700b8f9520 100644 --- a/python/src/com/jetbrains/python/run/AbstractPyCommonOptionsForm.java +++ b/python/src/com/jetbrains/python/run/AbstractPyCommonOptionsForm.java @@ -1,12 +1,12 @@ package com.jetbrains.python.run; -import com.intellij.ui.ComponentWithAnchor; +import com.intellij.ui.PanelWithAnchor; import javax.swing.*; /** * @author yole */ -public interface AbstractPyCommonOptionsForm extends AbstractPythonRunConfigurationParams, ComponentWithAnchor { +public interface AbstractPyCommonOptionsForm extends AbstractPythonRunConfigurationParams, PanelWithAnchor { JComponent getMainPanel(); } diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java index d20512529a09..b72b83ff3553 100644 --- a/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java +++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java @@ -8,7 +8,7 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.ui.ComponentWithAnchor; +import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.RawCommandLineEditor; import com.intellij.ui.components.JBLabel; @@ -18,7 +18,7 @@ import java.awt.*; /** * @author yole */ -public class PythonRunConfigurationForm implements PythonRunConfigurationParams, ComponentWithAnchor { +public class PythonRunConfigurationForm implements PythonRunConfigurationParams, PanelWithAnchor { private JPanel myRootPanel; private TextFieldWithBrowseButton myScriptTextField; private RawCommandLineEditor myScriptParametersTextField; diff --git a/python/src/com/jetbrains/python/testing/PythonTestRunConfigurationForm.java b/python/src/com/jetbrains/python/testing/PythonTestRunConfigurationForm.java index 742f18a17138..974a3a82739f 100644 --- a/python/src/com/jetbrains/python/testing/PythonTestRunConfigurationForm.java +++ b/python/src/com/jetbrains/python/testing/PythonTestRunConfigurationForm.java @@ -5,7 +5,7 @@ import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.ui.ComponentWithAnchor; +import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.components.JBLabel; import com.jetbrains.python.PyBundle; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; @@ -24,7 +24,7 @@ import static com.jetbrains.python.testing.unittest.PythonUnitTestRunConfigurati /** * @author Leonid Shalupov */ -public class PythonTestRunConfigurationForm implements AbstractPythonTestRunConfigurationParams, ComponentWithAnchor { +public class PythonTestRunConfigurationForm implements AbstractPythonTestRunConfigurationParams, PanelWithAnchor { private JPanel myRootPanel; private LabeledComponent myTestClassComponent; private LabeledComponent myTestMethodComponent; diff --git a/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationEditor.java b/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationEditor.java index e2eb2a47c356..513f8f78ce57 100644 --- a/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationEditor.java +++ b/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationEditor.java @@ -6,7 +6,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.TextFieldWithBrowseButton; -import com.intellij.ui.ComponentWithAnchor; +import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.components.JBLabel; import com.jetbrains.python.PyBundle; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; @@ -16,12 +16,10 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; -import static com.intellij.openapi.util.io.FileUtil.toSystemIndependentName; - /** * @author yole */ -public class PyTestConfigurationEditor extends SettingsEditor implements ComponentWithAnchor { +public class PyTestConfigurationEditor extends SettingsEditor implements PanelWithAnchor { private JPanel myMainPanel; private JPanel myCommonOptionsPlaceholder; private JTextField myKeywordsTextField; @@ -51,13 +49,13 @@ public class PyTestConfigurationEditor extends SettingsEditor345, c=22) \ No newline at end of file +foo(1, +345, c=22) \ No newline at end of file diff --git a/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py b/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py index f7f0da3a04e6..f95271a0abba 100644 --- a/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py +++ b/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py @@ -58,3 +58,12 @@ def bar(a = "qwer"): bar(a = 'qwer') getattr(bar, "__doc__", None) # None is not highlighted + +class a: + def get(self, a, b = None): + pass + +kw = a() + +kw['customerPaymentProfileId'] = kw.get("customerPaymentProfileId", + None)