summaryrefslogtreecommitdiff
path: root/python/src/com/jetbrains/python/inspections
diff options
context:
space:
mode:
Diffstat (limited to 'python/src/com/jetbrains/python/inspections')
-rw-r--r--python/src/com/jetbrains/python/inspections/PyCompatibilityInspection.java4
-rw-r--r--python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java3
-rw-r--r--python/src/com/jetbrains/python/inspections/quickfix/PyDefaultArgumentQuickFix.java39
-rw-r--r--python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java96
-rw-r--r--python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java3
5 files changed, 112 insertions, 33 deletions
diff --git a/python/src/com/jetbrains/python/inspections/PyCompatibilityInspection.java b/python/src/com/jetbrains/python/inspections/PyCompatibilityInspection.java
index c8a40a095134..0f69f4f72a56 100644
--- a/python/src/com/jetbrains/python/inspections/PyCompatibilityInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyCompatibilityInspection.java
@@ -200,9 +200,7 @@ public class PyCompatibilityInspection extends PyInspection {
}
for (int i = 0; i != myVersionsToProcess.size(); ++i) {
LanguageLevel languageLevel = myVersionsToProcess.get(i);
- PsiFile file = resolved.getContainingFile();
- VirtualFile virtualFile = file.getVirtualFile();
- if (virtualFile != null && ind.isInLibraryClasses(virtualFile)) {
+ if (PyBuiltinCache.getInstance(resolved).isBuiltin(resolved)) {
if (!"print".equals(name) && !myUsedImports.contains(name) && UnsupportedFeaturesUtil.BUILTINS.get(languageLevel).contains(name)) {
len = appendLanguageLevel(message, len, languageLevel);
}
diff --git a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java
index 0cc7a4abd140..a521ed76d92f 100644
--- a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java
@@ -72,9 +72,6 @@ public class PyStatementEffectInspection extends PyInspection {
final PyTryPart tryPart = PsiTreeUtil.getParentOfType(node, PyTryPart.class);
if (tryPart != null) {
final PyStatementList statementList = tryPart.getStatementList();
- if (statementList == null) {
- return;
- }
if (statementList.getStatements().length == 1 && statementList.getStatements()[0] == node) {
return;
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/PyDefaultArgumentQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/PyDefaultArgumentQuickFix.java
index 31723d3aab4e..db47f17f8ea8 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/PyDefaultArgumentQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/PyDefaultArgumentQuickFix.java
@@ -61,29 +61,36 @@ public class PyDefaultArgumentQuickFix implements LocalQuickFix {
PyStatementList list = function.getStatementList();
PyParameterList paramList = function.getParameterList();
- StringBuilder str = new StringBuilder("def foo(");
+ final StringBuilder functionText = new StringBuilder("def foo(");
int size = paramList.getParameters().length;
for (int i = 0; i != size; ++i) {
PyParameter p = paramList.getParameters()[i];
if (p == param)
- str.append(defName).append("=None");
+ functionText.append(defName).append("=None");
else
- str.append(p.getText());
+ functionText.append(p.getText());
if (i != size-1)
- str.append(", ");
+ functionText.append(", ");
+ }
+ functionText.append("):\n\tif not ").append(defName).append(":\n\t\t").append(defName).append(" = ").append(defaultValue.getText());
+ final PyStatement[] statements = list.getStatements();
+ PyStatement firstStatement = statements.length > 0 ? statements[0] : null;
+ PyFunction newFunction = elementGenerator.createFromText(LanguageLevel.forElement(function), PyFunction.class,
+ functionText.toString());
+ if (firstStatement == null) {
+ function.replace(newFunction);
+ }
+ else {
+ final PyStatement ifStatement = newFunction.getStatementList().getStatements()[0];
+ PyStringLiteralExpression docString = function.getDocStringExpression();
+ if (docString != null)
+ list.addAfter(ifStatement, firstStatement);
+ else {
+ list.addBefore(ifStatement, firstStatement);
+ }
+ paramList.replace(elementGenerator.createFromText(LanguageLevel.forElement(defaultValue),
+ PyFunction.class, functionText.toString()).getParameterList());
}
- str.append("):\n\tpass");
- PyIfStatement ifStatement = elementGenerator.createFromText(LanguageLevel.forElement(function), PyIfStatement.class,
- "if not " + defName + ": " + defName + " = " + defaultValue.getText());
-
- PyStatement firstStatement = list.getStatements()[0];
- PyStringLiteralExpression docString = function.getDocStringExpression();
- if (docString != null)
- list.addAfter(ifStatement, firstStatement);
- else
- list.addBefore(ifStatement, firstStatement);
- paramList.replace(elementGenerator.createFromText(LanguageLevel.forElement(defaultValue),
- PyFunction.class, str.toString()).getParameterList());
}
}
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java
index 95daf466172e..43f4f0394015 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java
@@ -18,14 +18,14 @@ package com.jetbrains.python.inspections.quickfix;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiWhiteSpace;
+import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
-import com.jetbrains.python.psi.LanguageLevel;
-import com.jetbrains.python.psi.PyElementGenerator;
-import com.jetbrains.python.psi.PyExpression;
-import com.jetbrains.python.psi.PyReferenceExpression;
+import com.jetbrains.python.PyTokenTypes;
+import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NotNull;
/**
@@ -48,15 +48,17 @@ public class StatementEffectFunctionCallQuickFix implements LocalQuickFix {
PsiElement expression = descriptor.getPsiElement();
if (expression != null && expression.isWritable() && expression instanceof PyReferenceExpression) {
final String expressionText = expression.getText();
- if (PyNames.PRINT.equals(expressionText) || PyNames.EXEC.equals(expressionText))
- replacePrintExec(expression);
+ if (PyNames.PRINT.equals(expressionText))
+ replacePrint(expression);
+ else if (PyNames.EXEC.equals(expressionText))
+ replaceExec(expression);
else
expression.replace(PyElementGenerator.getInstance(project).createCallExpression(LanguageLevel.forElement(expression),
expressionText));
}
}
- private static void replacePrintExec(@NotNull final PsiElement expression) {
+ private static void replaceExec(@NotNull final PsiElement expression) {
final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(expression.getProject());
final String expressionText = expression.getText();
final StringBuilder stringBuilder = new StringBuilder(expressionText + " (");
@@ -77,14 +79,88 @@ public class StatementEffectFunctionCallQuickFix implements LocalQuickFix {
RemoveUnnecessaryBackslashQuickFix.removeBackSlash(next);
if (whiteSpace != null) whiteSpace.delete();
+ if (next == null) {
+ stringBuilder.append(")");
+ expression.replace(elementGenerator.createFromText(LanguageLevel.forElement(expression), PyExpression.class,
+ stringBuilder.toString()));
+ return;
+ }
+ if (next instanceof PyExpressionStatement) {
+ final PyExpression expr = ((PyExpressionStatement)next).getExpression();
+ if (expr instanceof PyBinaryExpression) {
+ addInArguments(stringBuilder, (PyBinaryExpression)expr);
+ }
+ else if (expr instanceof PyTupleExpression) {
+ final PyExpression[] elements = ((PyTupleExpression)expr).getElements();
+ if (elements.length > 1) {
+ if (elements[0] instanceof PyBinaryExpression) {
+ addInArguments(stringBuilder, (PyBinaryExpression)elements[0]);
+ }
+ stringBuilder.append(", ");
+ stringBuilder.append(elements[1].getText());
+ }
+ }
+ else {
+ stringBuilder.append(next.getText());
+ }
+ }
+ else {
+ stringBuilder.append(next.getText());
+ }
+ next.delete();
+ stringBuilder.append(")");
+ expression.replace(elementGenerator.createFromText(LanguageLevel.forElement(expression), PyExpression.class,
+ stringBuilder.toString()));
+ }
+
+ private static void addInArguments(@NotNull final StringBuilder stringBuilder, @NotNull final PyBinaryExpression binaryExpression) {
+ final PsiElement operator = binaryExpression.getPsiOperator();
+ if (operator instanceof LeafPsiElement && ((LeafPsiElement)operator).getElementType() == PyTokenTypes.IN_KEYWORD) {
+ stringBuilder.append(binaryExpression.getLeftExpression().getText());
+ stringBuilder.append(", ");
+ final PyExpression rightExpression = binaryExpression.getRightExpression();
+ if (rightExpression != null)
+ stringBuilder.append(rightExpression.getText());
+ }
+ }
+
+ private static void replacePrint(@NotNull final PsiElement expression) {
+ final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(expression.getProject());
+ final String expressionText = expression.getText();
+ final StringBuilder stringBuilder = new StringBuilder(expressionText + " (");
+
+ final PsiElement whiteSpace = expression.getContainingFile().findElementAt(expression.getTextOffset() + expression.getTextLength());
+ PsiElement next = null;
+ if (whiteSpace instanceof PsiWhiteSpace) {
+ final String whiteSpaceText = whiteSpace.getText();
+ if (!whiteSpaceText.contains("\n")) {
+ next = whiteSpace.getNextSibling();
+ while (next instanceof PsiWhiteSpace && whiteSpaceText.contains("\\")) {
+ next = next.getNextSibling();
+ }
+ }
+ }
+ else
+ next = whiteSpace;
+
+ RemoveUnnecessaryBackslashQuickFix.removeBackSlash(next);
+ if (whiteSpace != null) whiteSpace.delete();
+ String commentText = null;
if (next != null) {
- final String text = next.getText();
+ final PsiElement lastChild = next.getLastChild();
+ if (lastChild instanceof PsiComment) {
+ commentText = lastChild.getText();
+ }
+ final String text = next instanceof PyExpressionStatement ? ((PyExpressionStatement)next).getExpression().getText() : next.getText();
+
stringBuilder.append(text);
- if (text.endsWith(",") && PyNames.PRINT.equals(expressionText))
- stringBuilder.append(" end=' '");
+ if (text.endsWith(",")) stringBuilder.append(" end=' '");
next.delete();
}
stringBuilder.append(")");
+ if (commentText != null) {
+ stringBuilder.append(commentText);
+ }
expression.replace(elementGenerator.createFromText(LanguageLevel.forElement(expression), PyExpression.class,
stringBuilder.toString()));
}
diff --git a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java
index 4fd58629c516..b7523caf90e7 100644
--- a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java
+++ b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java
@@ -755,7 +755,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
return false;
}
- private static void addCreateMemberFromUsageFixes(PyType type, PsiReference reference, String refText, List<LocalQuickFix> actions) {
+ private void addCreateMemberFromUsageFixes(PyType type, PsiReference reference, String refText, List<LocalQuickFix> actions) {
PsiElement element = reference.getElement();
if (type instanceof PyClassTypeImpl) {
PyClass cls = ((PyClassType)type).getPyClass();
@@ -771,6 +771,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
else if (type instanceof PyModuleType) {
PyFile file = ((PyModuleType)type).getModule();
actions.add(new AddFunctionQuickFix(refText, file.getName()));
+ addCreateClassFix(refText, element, actions);
}
}