From 5b3cb745e05942cfeca91113ef125798d96f8f2a Mon Sep 17 00:00:00 2001 From: Morgan Bartholomew Date: Mon, 18 Aug 2025 12:09:41 +0000 Subject: [PATCH] [python] PY-79930 don't fold `__future__` imports Merge-request: IJ-MR-171486 Merged-by: Morgan Bartholomew GitOrigin-RevId: 968e8d7c03dd7e46ff55316cffd07e7e2a9c7b54 --- .../src/com/jetbrains/python/PythonFoldingBuilder.kt | 7 ++++--- python/testData/folding/futureImport.py | 9 +++++++++ python/testData/folding/futureImportWithOneImport.py | 7 +++++++ python/testSrc/com/jetbrains/python/PyFoldingTest.java | 10 ++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 python/testData/folding/futureImport.py create mode 100644 python/testData/folding/futureImportWithOneImport.py diff --git a/python/python-syntax/src/com/jetbrains/python/PythonFoldingBuilder.kt b/python/python-syntax/src/com/jetbrains/python/PythonFoldingBuilder.kt index f762c656a5c1..54d5be081bee 100644 --- a/python/python-syntax/src/com/jetbrains/python/PythonFoldingBuilder.kt +++ b/python/python-syntax/src/com/jetbrains/python/PythonFoldingBuilder.kt @@ -110,9 +110,10 @@ open class PythonFoldingBuilder : CustomFoldingBuilder(), DumbAware { val elementType = node.elementType if (node.psi is PyAstFile) { val imports = (node.psi as PyAstFile).importBlock - if (imports.size > 1) { - val firstImport: PyAstImportStatementBase = imports[0] - val lastImport: PyAstImportStatementBase = imports[imports.size - 1] + val firstIndex = imports.takeWhile { (it as? PyAstFromImportStatement)?.isFromFuture == true }.size + if (imports.size - firstIndex > 1) { + val firstImport: PyAstImportStatementBase = imports[firstIndex] + val lastImport: PyAstImportStatementBase = imports.last() descriptors.add(FoldingDescriptor(firstImport, TextRange(firstImport.textRange.startOffset, lastImport.textRange.endOffset))) } diff --git a/python/testData/folding/futureImport.py b/python/testData/folding/futureImport.py new file mode 100644 index 000000000000..d659f3aee2d0 --- /dev/null +++ b/python/testData/folding/futureImport.py @@ -0,0 +1,9 @@ +"""This is a module-level docstring.""" + +from __future__ import annotations +from __future__ import another_one + +import os +import sys + +print(os, sys) diff --git a/python/testData/folding/futureImportWithOneImport.py b/python/testData/folding/futureImportWithOneImport.py new file mode 100644 index 000000000000..96ea17db5dd6 --- /dev/null +++ b/python/testData/folding/futureImportWithOneImport.py @@ -0,0 +1,7 @@ +"""This is a module-level docstring.""" + +from __future__ import annotations + +import os + +print(os.path) diff --git a/python/testSrc/com/jetbrains/python/PyFoldingTest.java b/python/testSrc/com/jetbrains/python/PyFoldingTest.java index 17397c28d6ac..d3d77a5c05cb 100644 --- a/python/testSrc/com/jetbrains/python/PyFoldingTest.java +++ b/python/testSrc/com/jetbrains/python/PyFoldingTest.java @@ -245,4 +245,14 @@ public class PyFoldingTest extends PyTestCase { public void testMatchFolding() { doTest(); } + + // PY-79930 + public void testFutureImport() { + doTest(); + } + + // PY-79930 + public void testFutureImportWithOneImport() { + doTest(); + } }