From 9d0d776478f21d5b1b8c65ec4f149ee9e6b683b0 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 17 Apr 2017 22:24:45 +0300 Subject: [PATCH] Revert of "IDEA-CR-17950: True and False are now always PyBooleanLiteralExpressions" because of "Restored None, False, True as non-keywords (reserved words) in PY2" --- .../python/psi/impl/PyEvaluator.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java index ddb8a4037a5d..79e2b62e4127 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java @@ -67,8 +67,9 @@ public class PyEvaluator { if (expr instanceof PySequenceExpression) { return evaluateSequenceExpression((PySequenceExpression)expr); } - if (expr instanceof PyBoolLiteralExpression) { - return ((PyBoolLiteralExpression)expr).getValue(); + final Boolean booleanExpression = getBooleanExpression(expr); + if (booleanExpression != null) { // support bool + return booleanExpression; } if (expr instanceof PyCallExpression) { return evaluateCall((PyCallExpression)expr); @@ -93,6 +94,32 @@ public class PyEvaluator { return null; } + /** + * TODO: Move to PyExpression? PyUtil? + * True/False is bool literal in Py3K, but reference in Python2. + * + * @param expression expression to check + * @return true if expression is boolean + */ + @Nullable + private static Boolean getBooleanExpression(@NotNull final PyExpression expression) { + final boolean py3K = LanguageLevel.forElement(expression).isPy3K(); + if ((expression instanceof PyBoolLiteralExpression)) { + return ((PyBoolLiteralExpression)expression).getValue(); + } + if ((!py3K && (expression instanceof PyReferenceExpression))) { + final String text = ((PyQualifiedExpression)expression).getReferencedName(); // Ref in Python2 + if (PyNames.TRUE.equals(text)) { + return true; + } + if (PyNames.FALSE.equals(text)) { + return false; + } + } + + return null; + } + /** * Evaluates some sequence (tuple, list) *