From cfa611b041d64c761bd0c4c530ea4c499330896a Mon Sep 17 00:00:00 2001 From: Andrey Vokin Date: Fri, 13 Feb 2026 12:35:49 +0100 Subject: [PATCH] PY-87502 PyCharm considers `Literal[1]` not to be equal to `Literal[+1]` GitOrigin-RevId: 2e65c2f06e4398a01f7d81aec3eeed636219cb0d --- .../com/jetbrains/python/psi/impl/PyEvaluator.java | 11 ++++++++--- .../testSrc/com/jetbrains/python/PyEvaluatorTest.java | 6 ++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyEvaluator.java index a4979d1872ef..67f4e14f56b7 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyEvaluator.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyEvaluator.java @@ -290,16 +290,21 @@ public class PyEvaluator { } private @Nullable Object evaluatePrefix(@NotNull PyPrefixExpression expression) { - if (expression.getOperator() == PyTokenTypes.NOT_KEYWORD) { + PyElementType operator = expression.getOperator(); + if (operator == PyTokenTypes.NOT_KEYWORD) { final Boolean value = PyUtil.as(evaluate(expression.getOperand()), Boolean.class); if (value != null) { return !value; } } - else if (expression.getOperator() == PyTokenTypes.MINUS) { + else if (operator == PyTokenTypes.MINUS || operator == PyTokenTypes.PLUS) { final Number number = PyUtil.as(evaluate(expression.getOperand()), Number.class); if (number != null) { - return fromBigInteger(toBigInteger(number).negate()); + var bigInt = toBigInteger(number); + if (operator == PyTokenTypes.MINUS) { + bigInt = bigInt.negate(); + } + return fromBigInteger(bigInt); } } diff --git a/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java b/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java index 1521bdcd5829..a801ec5871ec 100644 --- a/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java +++ b/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java @@ -254,6 +254,12 @@ public class PyEvaluatorTest extends PyTestCase { assertTrue(byExpression("2 != 1", Boolean.class)); } + public void testPositiveNumberLiteral() { + assertEquals(Integer.valueOf(5), byExpression("+5", Integer.class)); + assertEquals(Long.valueOf(Long.MAX_VALUE), byExpression("+" + Long.MAX_VALUE, Long.class)); + assertEquals(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE), byExpression("+" + BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE), BigInteger.class)); + } + public void testBooleanOperators() { assertTrue(byExpression("True and True", Boolean.class)); assertTrue(byExpression("True or False", Boolean.class));