diff --git a/python/src/com/jetbrains/python/psi/PyElementVisitor.java b/python/src/com/jetbrains/python/psi/PyElementVisitor.java index e934476fae4c..a576ade506bd 100644 --- a/python/src/com/jetbrains/python/psi/PyElementVisitor.java +++ b/python/src/com/jetbrains/python/psi/PyElementVisitor.java @@ -245,4 +245,8 @@ public class PyElementVisitor extends PsiElementVisitor { public void visitPyBoolLiteralExpression(final PyBoolLiteralExpression node) { visitPyElement(node); } + + public void visitPyConditionalExpression(PyConditionalExpression node) { + visitPyElement(node); + } } diff --git a/python/src/com/jetbrains/python/psi/impl/PyConditionalExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyConditionalExpressionImpl.java index 6eee1d51ca41..061b3c5117cb 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyConditionalExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyConditionalExpressionImpl.java @@ -3,6 +3,7 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.psi.PyConditionalExpression; +import com.jetbrains.python.psi.PyElementVisitor; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.types.PyType; import com.jetbrains.python.psi.types.PyUnionType; @@ -45,4 +46,9 @@ public class PyConditionalExpressionImpl extends PyElementImpl implements PyCond final List expressions = PsiTreeUtil.getChildrenOfTypeAsList(this, PyExpression.class); return expressions.size() == 3 ? expressions.get(2) : null; } + + @Override + protected void acceptPyVisitor(PyElementVisitor pyVisitor) { + pyVisitor.visitPyConditionalExpression(this); + } } diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java index 38728fc4e53e..f9a5dd7e769b 100644 --- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java +++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java @@ -386,8 +386,6 @@ public abstract class CompatibilityVisitor extends PyAnnotator { if (PydevConsoleRunner.isInPydevConsole(node)) return; if (myVersionsToProcess.contains(LanguageLevel.PYTHON24)) { PyExpression assignedValue = node.getAssignedValue(); - if (assignedValue instanceof PyConditionalExpression) // PY-2792 - registerProblem(node, "Python version 2.4 doesn't support this syntax."); Stack st = new Stack(); // PY-2796 if (assignedValue != null) @@ -405,6 +403,15 @@ public abstract class CompatibilityVisitor extends PyAnnotator { } } + @Override + public void visitPyConditionalExpression(PyConditionalExpression node) { //PY-4293 + super.visitPyConditionalExpression(node); + if (PydevConsoleRunner.isInPydevConsole(node)) return; + if (myVersionsToProcess.contains(LanguageLevel.PYTHON24)) { + registerProblem(node, "Python version 2.4 doesn't support this syntax."); + } + } + @Override public void visitPyTryExceptStatement(PyTryExceptStatement node) { // PY-2795 super.visitPyTryExceptStatement(node); diff --git a/python/testData/inspections/PyCompatibilityInspection/assignmentStatement.py b/python/testData/inspections/PyCompatibilityInspection/assignmentStatement.py index 1910ccad01a9..c015d246e1dc 100644 --- a/python/testData/inspections/PyCompatibilityInspection/assignmentStatement.py +++ b/python/testData/inspections/PyCompatibilityInspection/assignmentStatement.py @@ -1,5 +1,5 @@ # PY-2792 -x = True if condition else False +x = True if condition else False def foo(): # PY-2796 a = (yield 1) diff --git a/python/testData/inspections/PyCompatibilityInspection/conditionalExpression.py b/python/testData/inspections/PyCompatibilityInspection/conditionalExpression.py new file mode 100644 index 000000000000..25936836e30b --- /dev/null +++ b/python/testData/inspections/PyCompatibilityInspection/conditionalExpression.py @@ -0,0 +1,9 @@ +# PY-4293 +def test_conditional_expression(val): + x = 'Yes' if val else 'No' + return 'Yes' if val else 'No' + +def f(arg): + pass + +f(1 if True else 2) \ No newline at end of file diff --git a/python/testData/inspections/PyCompatibilityInspection/test.py b/python/testData/inspections/PyCompatibilityInspection/test.py deleted file mode 100644 index 3fe5bce0e1a2..000000000000 --- a/python/testData/inspections/PyCompatibilityInspection/test.py +++ /dev/null @@ -1,101 +0,0 @@ -print(a <> b) - -if a <> 2: - var = a -######################## - -print "One value" - -######################## - -#PY-2719 -class BaseC(): - pass - -######################## - -with A() as a, B() as b: - suite - -######################## -a = `imp.acquire_lock()` - -######################## -var = [x for x in 1, 2, 3] - -######################## -class A: - def cmp(self): - pass - -a = A() -a.cmp() - -######################## - -cmp() -reduce() -all() - -bytearray() -next() -buffer() - -######################## -try: - a -except : - raise ImportError, ImportWarning - - -try: - a -except ImportError, ImportWarning: - b - - - -######################## - -var = {i : chr(65+i) for i in range(4)} - -######################## - -import Bastion -var = Bastion.BastionClass() - -######################## -def foo(): # PY-2796 - a = (yield 1) - -######################## - -raise - -######################## -# PY-2792 -x = True if condition else False - -######################## -# PY-2792 - -def unified_tef(): - try: - pass - except ImportError: - pass - except KeyError: - pass - else: - pass - finally: - pass - -######################## -# PY-2797 - -with open("x.txt") as f: - data = f.read() -######################## - -from .module import name1, name2 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java b/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java index 5579559a26b9..2608b3fdbd7c 100644 --- a/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java +++ b/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java @@ -296,11 +296,6 @@ public class PythonInspectionsTest extends PyLightFixtureTestCase { doHighlightingTest(PyListCreationInspection.class); } - public void testPyCompatibilityInspection() { - setLanguageLevel(LanguageLevel.PYTHON27); - doHighlightingTest(PyCompatibilityInspection.class); - } - public void testPyStringFormatInspection1() { //PY-2836 doHighlightingTest(PyStringFormatInspection.class); } diff --git a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java index a887888f0da8..0a005fb46763 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java @@ -106,6 +106,9 @@ public class PyCompatibilityInspectionTest extends PyLightFixtureTestCase { doTest(); } + public void testConditionalExpression() { + doTest(); + } private void doTest() { myFixture.configureByFile("inspections/PyCompatibilityInspection/" + getTestName(true) + ".py");