diff options
Diffstat (limited to 'python/src/com/jetbrains/python/inspections')
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); } } |