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)