diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java index 8ba891721382..6af4d9a1821e 100644 --- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java +++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java @@ -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 diff --git a/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java b/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java index 98e532b61f77..3b70f31b774e 100644 --- a/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java +++ b/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java @@ -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 forComponents = node.getForComponents(); if (versionToProcess.isPy3K()) { diff --git a/python/testData/inspections/PyCompatibilityInspection/raiseFrom.py b/python/testData/inspections/PyCompatibilityInspection/raiseFrom.py new file mode 100644 index 000000000000..1668f11b4fe7 --- /dev/null +++ b/python/testData/inspections/PyCompatibilityInspection/raiseFrom.py @@ -0,0 +1,2 @@ +raise exception from cause +a = 1 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java index 87769e81fb10..0bafbd187f90 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java @@ -64,6 +64,11 @@ public class PyCompatibilityInspectionTest extends PyTestCase { doTest(); } + public void testRaiseFrom() { + setLanguageLevel(LanguageLevel.PYTHON32); + doTest(); + } + public void testReprExpression() { doTest(); }