mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fixed PY-6766 Compatibility inspection doesn't detect 'raise from'
This commit is contained in:
@@ -250,6 +250,7 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
|
||||
@Override
|
||||
public void visitPyRaiseStatement(PyRaiseStatement node) {
|
||||
super.visitPyRaiseStatement(node);
|
||||
// empty raise
|
||||
int len = 0;
|
||||
StringBuilder message = new StringBuilder(myCommonMessage);
|
||||
for (int i = 0; i != myVersionsToProcess.size(); ++i) {
|
||||
@@ -261,7 +262,7 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
|
||||
}
|
||||
commonRegisterProblem(message, " not support this syntax. Raise with no arguments can only be used in an except block",
|
||||
len, node, null);
|
||||
|
||||
// raise 1, 2, 3
|
||||
len = 0;
|
||||
message = new StringBuilder(myCommonMessage);
|
||||
for (int i = 0; i != myVersionsToProcess.size(); ++i) {
|
||||
@@ -273,6 +274,19 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
|
||||
}
|
||||
commonRegisterProblem(message, " not support this syntax.",
|
||||
len, node, new ReplaceRaiseStatementQuickFix());
|
||||
|
||||
// raise exception from cause
|
||||
len = 0;
|
||||
message = new StringBuilder(myCommonMessage);
|
||||
for (int i = 0; i != myVersionsToProcess.size(); ++i) {
|
||||
final LanguageLevel languageLevel = myVersionsToProcess.get(i);
|
||||
final boolean hasFrom = UnsupportedFeaturesUtil.raiseHasFromKeyword(node, languageLevel);
|
||||
if (hasFrom) {
|
||||
len = appendLanguageLevel(message, len, languageLevel);
|
||||
}
|
||||
}
|
||||
commonRegisterProblem(message, " not support this syntax.",
|
||||
len, node, new ReplaceRaiseStatementQuickFix());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiWhiteSpace;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.jetbrains.python.PyTokenTypes;
|
||||
import com.jetbrains.python.PythonHelpersLocator;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import org.xml.sax.InputSource;
|
||||
@@ -91,6 +92,25 @@ public class UnsupportedFeaturesUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean raiseHasFromKeyword(PyRaiseStatement node, LanguageLevel versionToProcess) {
|
||||
final PyExpression[] expressions = node.getExpressions();
|
||||
if (expressions.length > 0) {
|
||||
if (expressions.length < 2) {
|
||||
return false;
|
||||
}
|
||||
if (!versionToProcess.isPy3K()) {
|
||||
PsiElement element = expressions[0].getNextSibling();
|
||||
while (element instanceof PsiWhiteSpace) {
|
||||
element = element.getNextSibling();
|
||||
}
|
||||
if (element != null && element.getNode().getElementType() == PyTokenTypes.FROM_KEYWORD) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean visitPyListCompExpression(final PyListCompExpression node, LanguageLevel versionToProcess) {
|
||||
final List<ComprhForComponent> forComponents = node.getForComponents();
|
||||
if (versionToProcess.isPy3K()) {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<warning descr="Python version 2.4, 2.5, 2.6, 2.7 do not support this syntax.">raise exception from cause</warning>
|
||||
a = 1
|
||||
@@ -64,6 +64,11 @@ public class PyCompatibilityInspectionTest extends PyTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testRaiseFrom() {
|
||||
setLanguageLevel(LanguageLevel.PYTHON32);
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testReprExpression() {
|
||||
doTest();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user