fixed PY-6766 Compatibility inspection doesn't detect 'raise from'

This commit is contained in:
Ekaterina Tuzova
2012-06-15 14:32:30 +04:00
parent fb56ad53e1
commit 106e6d415c
4 changed files with 42 additions and 1 deletions
@@ -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();
}