2026.3 EAP: FileEditorOpenRequest moved packages — supported way to retain compatibility across 263 builds?
Hi,
I maintain BetterPy, a PyCharm plugin. Its test/production editor-tab feature moves files into designated editor splits while preserving selection, focus, pin state, and caret position.
The plugin is compiled against PyCharm 263.6259.38 and declares compatibility through 263.*. We received this runtime error:
java.lang.NoClassDefFoundError:
com/intellij/openapi/fileEditor/ex/FileEditorOpenRequest
at ...IntellijTestProductionEditorTabLayout.openFile(...)
Caused by: java.lang.ClassNotFoundException:
com.intellij.openapi.fileEditor.ex.FileEditorOpenRequest
The relevant call is:
import com.intellij.openapi.fileEditor.ex.FileEditorOpenMode
import com.intellij.openapi.fileEditor.ex.FileEditorOpenRequest
manager.openFile(
file,
FileEditorOpenRequest(
targetWindow = targetWindow,
openMode = FileEditorOpenMode.DEFAULT,
selectAsCurrent = selectAsCurrent,
reuseOpen = true,
usePreviewTab = false,
requestFocus = selectAsCurrent,
pin = pin,
),
)
Comparing the platform binaries for 263.6259.38 and 263.6800.43:
- In
263.6259.38,FileEditorOpenRequestandFileEditorOpenModeare incom.intellij.openapi.fileEditor.ex, with a synchronousFileEditorManagerEx.openFile(file, request)overload. - In
263.6800.43, those classes are incom.intellij.openapi.fileEditor. The earlier synchronous overload is absent; the newer API includesrequestOpenFileInWindow(...)returning aCompletableFutureand suspendingopenFileInWindow(...). - Both builds retain the synchronous
openFile(file, window, FileEditorOpenOptions)overload, but that method andFileEditorOpenOptionsare marked@ApiStatus.Internal.
I understand that the earlier request API was marked experimental. My concern is how to support these 263 EAP builds in one plugin artifact without introducing internal-API dependencies or changing the layout logic to assume an editor is available before an asynchronous open completes.
I checked the 2026 incompatible API changes list, but couldn’t find this package move or the replacement of the synchronous request-based overload.
What is the recommended approach?
Thanks.