mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 03:21:12 +07:00
PY-34617 Take into account sys.version_info checks when analyzing Python files
Don't use PyAst* interfaces in PyVersionCheck.kt GitOrigin-RevId: 6179220a0821a5e93a90938867e842d68ed9f2b0
This commit is contained in:
committed by
intellij-monorepo-bot
parent
753596ee0a
commit
143b893f2c
@@ -6,8 +6,11 @@ import com.google.common.collect.Range
|
||||
import com.intellij.openapi.util.Version
|
||||
import com.intellij.psi.util.QualifiedName
|
||||
import com.jetbrains.python.PyTokenTypes
|
||||
import com.jetbrains.python.ast.*
|
||||
import com.jetbrains.python.ast.impl.PyPsiUtilsCore
|
||||
import com.jetbrains.python.psi.PyBinaryExpression
|
||||
import com.jetbrains.python.psi.PyExpression
|
||||
import com.jetbrains.python.psi.PyNumericLiteralExpression
|
||||
import com.jetbrains.python.psi.PyReferenceExpression
|
||||
import com.jetbrains.python.psi.PyTupleExpression
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import java.math.BigInteger
|
||||
|
||||
@@ -19,8 +22,8 @@ object PyVersionCheck {
|
||||
* @see <a href="https://peps.python.org/pep-0484/#version-and-platform-checking">Version and Platform Checks</a>
|
||||
*/
|
||||
@JvmStatic
|
||||
fun convertToVersionRanges(expression: PyAstExpression): ImmutableRangeSet<Version>? {
|
||||
val binaryExpr = PyPsiUtilsCore.flattenParens(expression) as? PyAstBinaryExpression ?: return null
|
||||
fun convertToVersionRanges(expression: PyExpression): ImmutableRangeSet<Version>? {
|
||||
val binaryExpr = PyPsiUtils.flattenParens(expression) as? PyBinaryExpression ?: return null
|
||||
when (val operator = binaryExpr.operator) {
|
||||
PyTokenTypes.AND_KEYWORD, PyTokenTypes.OR_KEYWORD -> {
|
||||
val rhs = binaryExpr.rightExpression ?: return null
|
||||
@@ -33,10 +36,10 @@ object PyVersionCheck {
|
||||
}
|
||||
|
||||
PyTokenTypes.LT, PyTokenTypes.GT, PyTokenTypes.LE, PyTokenTypes.GE -> {
|
||||
val refExpr = PyPsiUtilsCore.flattenParens(binaryExpr.leftExpression) as? PyAstReferenceExpression ?: return null
|
||||
val refExpr = PyPsiUtils.flattenParens(binaryExpr.leftExpression) as? PyReferenceExpression ?: return null
|
||||
if (SYS_VERSION_INFO_QUALIFIED_NAME != refExpr.asQualifiedName()) return null
|
||||
|
||||
val tuple = PyPsiUtilsCore.flattenParens(binaryExpr.rightExpression) as? PyAstTupleExpression<*> ?: return null
|
||||
val tuple = PyPsiUtils.flattenParens(binaryExpr.rightExpression) as? PyTupleExpression ?: return null
|
||||
val version = evaluateVersion(tuple) ?: return null
|
||||
|
||||
val range = when (operator) {
|
||||
@@ -55,7 +58,7 @@ object PyVersionCheck {
|
||||
|
||||
private val SYS_VERSION_INFO_QUALIFIED_NAME = QualifiedName.fromDottedString("sys.version_info")
|
||||
|
||||
private fun evaluateVersion(versionTuple: PyAstTupleExpression<*>): Version? {
|
||||
private fun evaluateVersion(versionTuple: PyTupleExpression): Version? {
|
||||
val elements = versionTuple.elements
|
||||
if (elements.size != 1 && elements.size != 2) {
|
||||
return null
|
||||
@@ -78,8 +81,8 @@ object PyVersionCheck {
|
||||
return Version(major, minor, 0)
|
||||
}
|
||||
|
||||
private fun evaluateNumber(expression: PyAstExpression?): Int? {
|
||||
if (expression !is PyAstNumericLiteralExpression) return null
|
||||
private fun evaluateNumber(expression: PyExpression?): Int? {
|
||||
if (expression !is PyNumericLiteralExpression) return null
|
||||
if (!expression.isIntegerLiteral) return null
|
||||
val value = expression.bigIntegerValue
|
||||
val intValue = value.toInt()
|
||||
|
||||
Reference in New Issue
Block a user