diff --git a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java
index 0495e4029004..99b46ba15cf4 100644
--- a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java
+++ b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java
@@ -45,6 +45,11 @@ final class ImageFileEditorProvider implements FileEditorProvider, DumbAware {
return ImageFileTypeManager.getInstance().isImage(file);
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@Override
@NotNull
public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
diff --git a/jupyter/viewOnly/resources/META-INF/jupyter-view-only.xml b/jupyter/viewOnly/resources/META-INF/jupyter-view-only.xml
index 581fd8e0089f..fc27b0240924 100644
--- a/jupyter/viewOnly/resources/META-INF/jupyter-view-only.xml
+++ b/jupyter/viewOnly/resources/META-INF/jupyter-view-only.xml
@@ -4,6 +4,6 @@
-
+
diff --git a/jupyter/viewOnly/src/org/jetbrains/plugins/notebooks/jupyter/preview/viewOnly/JupyterViewOnlyProvider.kt b/jupyter/viewOnly/src/org/jetbrains/plugins/notebooks/jupyter/preview/viewOnly/JupyterViewOnlyProvider.kt
index e115176d1c81..366cc11a514a 100644
--- a/jupyter/viewOnly/src/org/jetbrains/plugins/notebooks/jupyter/preview/viewOnly/JupyterViewOnlyProvider.kt
+++ b/jupyter/viewOnly/src/org/jetbrains/plugins/notebooks/jupyter/preview/viewOnly/JupyterViewOnlyProvider.kt
@@ -10,10 +10,11 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.plugins.notebooks.jupyter.JupyterFileType
-
-class JupyterViewOnlyProvider : FileEditorProvider, DumbAware {
+internal class JupyterViewOnlyProvider : FileEditorProvider, DumbAware {
override fun accept(project: Project, file: VirtualFile): Boolean = FileTypeRegistry.getInstance().isFileOfType(file, JupyterFileType)
+ override fun acceptRequiresReadAction() = false
+
override fun createEditor(project: Project, file: VirtualFile): FileEditor = JupyterViewOnlyFileEditor.create(file)
override fun getEditorTypeId(): String = "jupyter-view-only-provider"
diff --git a/platform/analysis-api/src/com/intellij/openapi/fileEditor/FileEditorProvider.java b/platform/analysis-api/src/com/intellij/openapi/fileEditor/FileEditorProvider.java
index b3d91a4cd8f5..1b2dbeb7c119 100644
--- a/platform/analysis-api/src/com/intellij/openapi/fileEditor/FileEditorProvider.java
+++ b/platform/analysis-api/src/com/intellij/openapi/fileEditor/FileEditorProvider.java
@@ -29,9 +29,9 @@ public interface FileEditorProvider {
*/
boolean accept(@NotNull Project project, @NotNull VirtualFile file);
- default boolean acceptRequiresReadAction() {
- return false;
- }
+ default boolean acceptRequiresReadAction() {
+ return true;
+ }
/**
* Creates editor for the specified file.
diff --git a/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java b/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java
index e2fea1ea5ed9..693ddda41a24 100644
--- a/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java
+++ b/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java
@@ -198,7 +198,7 @@ public class SingleRootFileViewProvider extends AbstractFileViewProvider impleme
public static boolean fileSizeIsGreaterThan(@NotNull VirtualFile vFile, long maxBytes) {
if (vFile instanceof LightVirtualFile && !vFile.getFileType().isBinary()) {
- // This is optimization in order to avoid conversion of [large] file contents to bytes
+ // this is an optimization in order to avoid conversion of [large] file contents to bytes
int lengthInChars = ((LightVirtualFile)vFile).getContent().length();
if (lengthInChars < maxBytes / 2) {
return false;
diff --git a/platform/diff-impl/src/com/intellij/diff/editor/DiffEditorProvider.kt b/platform/diff-impl/src/com/intellij/diff/editor/DiffEditorProvider.kt
index fc552b6bcadb..87c68fc2448f 100644
--- a/platform/diff-impl/src/com/intellij/diff/editor/DiffEditorProvider.kt
+++ b/platform/diff-impl/src/com/intellij/diff/editor/DiffEditorProvider.kt
@@ -1,4 +1,4 @@
-// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.diff.editor
import com.intellij.diff.tools.combined.CombinedDiffComponentFactoryProvider
@@ -17,7 +17,7 @@ import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.annotations.NonNls
-class DiffEditorProvider : DefaultPlatformFileEditorProvider, StructureViewFileEditorProvider, DumbAware {
+internal class DiffEditorProvider : DefaultPlatformFileEditorProvider, StructureViewFileEditorProvider, DumbAware {
companion object {
@NonNls
const val DIFF_EDITOR_PROVIDER_ID = "DiffEditor"
@@ -27,6 +27,8 @@ class DiffEditorProvider : DefaultPlatformFileEditorProvider, StructureViewFileE
return file is CombinedDiffVirtualFile || file is DiffVirtualFile
}
+ override fun acceptRequiresReadAction() = false
+
override fun createEditor(project: Project, file: VirtualFile): FileEditor {
if (file is CombinedDiffVirtualFile) {
val sourceId = file.sourceId
@@ -44,6 +46,8 @@ class DiffEditorProvider : DefaultPlatformFileEditorProvider, StructureViewFileE
}
override fun getEditorTypeId(): String = DIFF_EDITOR_PROVIDER_ID
+
override fun getPolicy(): FileEditorPolicy = FileEditorPolicy.NONE
+
override fun getStructureViewBuilder(project: Project, file: VirtualFile): StructureViewBuilder? = null
}
diff --git a/platform/lang-impl/src/com/intellij/largeFilesEditor/editor/LargeFileEditorProvider.java b/platform/lang-impl/src/com/intellij/largeFilesEditor/editor/LargeFileEditorProvider.java
index 7a4de23536d9..3a53a05bb18b 100644
--- a/platform/lang-impl/src/com/intellij/largeFilesEditor/editor/LargeFileEditorProvider.java
+++ b/platform/lang-impl/src/com/intellij/largeFilesEditor/editor/LargeFileEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.largeFilesEditor.editor;
import com.intellij.openapi.application.Experiments;
@@ -32,21 +32,23 @@ public final class LargeFileEditorProvider implements DefaultPlatformFileEditorP
&& file.isInLocalFileSystem());
}
- @NotNull
@Override
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new LargeFileEditorImpl(project, file);
}
- @NotNull
@Override
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return PROVIDER_ID;
}
- @NotNull
@Override
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.NONE;
}
@@ -60,9 +62,8 @@ public final class LargeFileEditorProvider implements DefaultPlatformFileEditorP
}
}
- @NotNull
@Override
- public FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
+ public @NotNull FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
LargeFileEditorState state = new LargeFileEditorState();
if (JDOMUtil.isEmpty(sourceElement)) {
return state;
diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.kt b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.kt
index 280cec229966..9305d6798b4d 100644
--- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.kt
+++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.kt
@@ -47,20 +47,24 @@ internal class TestEditorManagerImpl(private val project: Project) : FileEditorM
private val LOG = logger()
private val LIGHT_VIRTUAL_FILE = MyLightVirtualFile()
private val stubProvider: FileEditorProvider
- get() = object : FileEditorProvider {
- override fun accept(project: Project, file: VirtualFile) = false
+ get() {
+ return object : FileEditorProvider {
+ override fun accept(project: Project, file: VirtualFile) = false
- override fun createEditor(project: Project, file: VirtualFile): FileEditor = throw IncorrectOperationException()
+ override fun acceptRequiresReadAction() = false
- override fun disposeEditor(editor: FileEditor) = Disposer.dispose(editor)
+ override fun createEditor(project: Project, file: VirtualFile): FileEditor = throw IncorrectOperationException()
- override fun readState(sourceElement: Element, project: Project, file: VirtualFile): FileEditorState {
- throw IncorrectOperationException()
+ override fun disposeEditor(editor: FileEditor) = Disposer.dispose(editor)
+
+ override fun readState(sourceElement: Element, project: Project, file: VirtualFile): FileEditorState {
+ throw IncorrectOperationException()
+ }
+
+ override fun getEditorTypeId() = ""
+
+ override fun getPolicy(): FileEditorPolicy = throw IncorrectOperationException()
}
-
- override fun getEditorTypeId() = ""
-
- override fun getPolicy(): FileEditorPolicy = throw IncorrectOperationException()
}
}
@@ -123,7 +127,7 @@ internal class TestEditorManagerImpl(private val project: Project) : FileEditorM
private fun openFileImpl3(openFileDescriptor: FileEditorNavigatable): FileEditorComposite {
val file = openFileDescriptor.file
if (!isCurrentlyUnderLocalId) {
- clientFileEditorManager?.openFile(file, false, true) ?: return FileEditorComposite.EMPTY
+ clientFileEditorManager?.openFile(file = file, forceCreate = false, requestFocus = true) ?: return FileEditorComposite.EMPTY
}
val isNewEditor = !virtualFileToEditor.containsKey(file)
diff --git a/platform/platform-impl/src/com/intellij/ide/browsers/actions/WebPreviewEditorProvider.java b/platform/platform-impl/src/com/intellij/ide/browsers/actions/WebPreviewEditorProvider.java
index 60ef0624e1de..54faa644dfb6 100644
--- a/platform/platform-impl/src/com/intellij/ide/browsers/actions/WebPreviewEditorProvider.java
+++ b/platform/platform-impl/src/com/intellij/ide/browsers/actions/WebPreviewEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.browsers.actions;
import com.intellij.openapi.fileEditor.FileEditor;
@@ -12,12 +12,17 @@ import org.jetbrains.annotations.NotNull;
/**
* @author Konstantin Bulenkov
*/
-public class WebPreviewEditorProvider implements FileEditorProvider, DumbAware {
+ final class WebPreviewEditorProvider implements FileEditorProvider, DumbAware {
@Override
public boolean accept(@NotNull Project project, @NotNull VirtualFile file) {
return file instanceof WebPreviewVirtualFile;
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@NotNull
@Override
public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/UIComponentEditorProvider.java b/platform/platform-impl/src/com/intellij/ide/plugins/UIComponentEditorProvider.java
index 40145183d73e..06d56891222b 100644
--- a/platform/platform-impl/src/com/intellij/ide/plugins/UIComponentEditorProvider.java
+++ b/platform/platform-impl/src/com/intellij/ide/plugins/UIComponentEditorProvider.java
@@ -18,6 +18,11 @@ final class UIComponentEditorProvider implements FileEditorProvider, DumbAware {
return file instanceof UIComponentVirtualFile;
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@Override
public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new UIComponentFileEditor((UIComponentVirtualFile)file);
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorProviderManagerImpl.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorProviderManagerImpl.kt
index b096a02190c7..b2cbb5c598ee 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorProviderManagerImpl.kt
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorProviderManagerImpl.kt
@@ -8,7 +8,9 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.readAction
import com.intellij.openapi.components.*
import com.intellij.openapi.diagnostic.Logger
+import com.intellij.openapi.diagnostic.debug
import com.intellij.openapi.diagnostic.logger
+import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.impl.findByIdOrFromInstance
import com.intellij.openapi.fileEditor.FileEditorPolicy
import com.intellij.openapi.fileEditor.FileEditorProvider
@@ -18,12 +20,10 @@ import com.intellij.openapi.fileTypes.FileTypeRegistry
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
-import kotlinx.coroutines.CancellationException
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.async
-import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.*
import kotlinx.serialization.Serializable
import org.jetbrains.annotations.TestOnly
+import kotlin.time.Duration.Companion.seconds
private val LOG: Logger
get() = logger()
@@ -38,29 +38,6 @@ data class FileEditorProviderManagerState(@JvmField val selectedProviders: Map(
FileEditorProviderManagerState()) {
-
- private fun checkProvider(project: Project,
- file: VirtualFile,
- provider: FileEditorProvider,
- suppressors: List): Boolean {
- if (!DumbService.isDumbAware(provider) && DumbService.isDumb(project)) {
- return false
- }
-
- if (!provider.accept(project, file)) {
- return false
- }
-
- for (suppressor in suppressors) {
- if (suppressor.isSuppressed(project, file, provider)) {
- LOG.info("FileEditorProvider ${provider.javaClass} for VirtualFile $file " +
- "was suppressed by FileEditorProviderSuppressor ${suppressor.javaClass}")
- return false
- }
- }
- return true
- }
-
@Suppress("DuplicatedCode")
override fun getProviderList(project: Project, file: VirtualFile): List {
// collect all possible editors
@@ -70,6 +47,10 @@ class FileEditorProviderManagerImpl : FileEditorProviderManager,
val suppressors = FileEditorProviderSuppressor.EP_NAME.extensionList
for (provider in FileEditorProvider.EP_FILE_EDITOR_PROVIDER.extensionList) {
+ if (!DumbService.isDumbAware(provider) && DumbService.isDumb(project)) {
+ continue
+ }
+
if (ApplicationManager.getApplication().runReadAction {
checkProvider(project = project, file = file, provider = provider, suppressors = suppressors)
}) {
@@ -98,40 +79,31 @@ class FileEditorProviderManagerImpl : FileEditorProviderManager,
val sharedProviders = coroutineScope {
FileEditorProvider.EP_FILE_EDITOR_PROVIDER.filterableLazySequence().map { item ->
async {
- val providerFileTypeName = item.getCustomAttribute("fileType")
- // VcsLogFileType is not registered in FileTypeRegistry - we should check also by name
- if (providerFileTypeName != null && fileType.name != providerFileTypeName) {
- val fileTypeRegistry = FileTypeRegistry.getInstance()
- val providerFileType = fileTypeRegistry.findFileTypeByName(providerFileTypeName)
- if (providerFileType == null || !fileTypeRegistry.isFileOfType(file, providerFileType)) {
- return@async null
- }
- }
-
- val provider = item.instance ?: return@async null
try {
- if (provider.acceptRequiresReadAction()) {
- if (!readAction {
- checkProvider(project = project, file = file, provider = provider, suppressors = suppressors)
- }) {
- return@async null
+ withTimeout(30.seconds) {
+ val providerFileTypeName = item.getCustomAttribute("fileType")
+ // VcsLogFileType is not registered in FileTypeRegistry - we should check also by name
+ if (providerFileTypeName != null && fileType.name != providerFileTypeName) {
+ val fileTypeRegistry = FileTypeRegistry.getInstance()
+ val providerFileType = fileTypeRegistry.findFileTypeByName(providerFileTypeName)
+ if (providerFileType == null || !fileTypeRegistry.isFileOfType(file, providerFileType)) {
+ return@withTimeout null
+ }
}
- }
- else if (!checkProvider(project = project, file = file, provider = provider, suppressors = suppressors)) {
- return@async null
- }
- hideDefaultEditor = hideDefaultEditor or (provider.policy == FileEditorPolicy.HIDE_DEFAULT_EDITOR)
- hasHighPriorityEditors = hasHighPriorityEditors or (provider.policy == FileEditorPolicy.HIDE_OTHER_EDITORS)
- checkPolicy(provider)
+ val provider = getProviderIfApplicable(item = item, project = project, file = file, suppressors = suppressors)
+ ?: return@withTimeout null
+
+ hideDefaultEditor = hideDefaultEditor or (provider.policy == FileEditorPolicy.HIDE_DEFAULT_EDITOR)
+ hasHighPriorityEditors = hasHighPriorityEditors or (provider.policy == FileEditorPolicy.HIDE_OTHER_EDITORS)
+ checkPolicy(provider)
+ provider
+ }
}
- catch (e: CancellationException) {
- throw e
+ catch (e: TimeoutCancellationException) {
+ LOG.error(PluginException("Cannot check provider ${item.implementationClassName}", e, item.pluginDescriptor.pluginId))
+ null
}
- catch (e: Throwable) {
- LOG.error(PluginException(e, item.pluginDescriptor.pluginId))
- }
- provider
}
}.toList()
}.mapNotNullTo(mutableListOf()) { it.getCompleted() }
@@ -189,6 +161,63 @@ class FileEditorProviderManagerImpl : FileEditorProviderManager,
}
}
+private suspend fun getProviderIfApplicable(item: ExtensionPointName.LazyExtension,
+ project: Project,
+ file: VirtualFile,
+ suppressors: List): FileEditorProvider? {
+ val provider = item.instance ?: return null
+ if (!DumbService.isDumbAware(provider)) {
+ LOG.debug { "Please make ${provider.javaClass} dumb-aware" }
+ if (DumbService.isDumb(project)) {
+ return null
+ }
+ }
+
+ try {
+ if (provider.acceptRequiresReadAction()) {
+ if (!readAction {
+ checkProvider(project = project, file = file, provider = provider, suppressors = suppressors)
+ }) {
+ return null
+ }
+ }
+ else {
+ //println("TO CHECK: " + item.implementationClassName)
+ if (!checkProvider(project = project, file = file, provider = provider, suppressors = suppressors)) {
+ //println("FAIL: " + item.implementationClassName)
+ return null
+ }
+ //println("PASS: " + item.implementationClassName)
+ }
+ return provider
+ }
+ catch (e: CancellationException) {
+ throw e
+ }
+ catch (e: Throwable) {
+ LOG.error(PluginException(e, item.pluginDescriptor.pluginId))
+ return null
+ }
+}
+
+private fun checkProvider(project: Project,
+ file: VirtualFile,
+ provider: FileEditorProvider,
+ suppressors: List): Boolean {
+ if (!provider.accept(project, file)) {
+ return false
+ }
+
+ for (suppressor in suppressors) {
+ if (suppressor.isSuppressed(project, file, provider)) {
+ LOG.info("FileEditorProvider ${provider.javaClass} for VirtualFile $file " +
+ "was suppressed by FileEditorProviderSuppressor ${suppressor.javaClass}")
+ return false
+ }
+ }
+ return true
+}
+
private object MyComparator : Comparator {
private fun getWeight(provider: FileEditorProvider): Double {
return if (provider is WeighedFileEditorProvider) provider.weight else Double.MAX_VALUE
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt
index 278173d36de8..4db5bce1a431 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt
@@ -17,12 +17,16 @@ import com.intellij.testFramework.LightVirtualFile
import com.intellij.ui.jcef.JBCefApp
class HTMLEditorProvider : FileEditorProvider, DumbAware {
- override fun createEditor(project: Project, file: VirtualFile): FileEditor =
- file.getUserData(EDITOR_KEY) ?:
- HTMLFileEditor(project, file as LightVirtualFile, REQUEST_KEY.get(file)!!).also { file.putUserData(EDITOR_KEY, it) }
+ override fun createEditor(project: Project, file: VirtualFile): FileEditor {
+ return file.getUserData(EDITOR_KEY) ?: HTMLFileEditor(project, file as LightVirtualFile,
+ REQUEST_KEY.get(file)!!).also { file.putUserData(EDITOR_KEY, it) }
+ }
- override fun accept(project: Project, file: VirtualFile): Boolean =
- JBCefApp.isSupported() && file.getUserData(REQUEST_KEY) != null
+ override fun accept(project: Project, file: VirtualFile): Boolean {
+ return JBCefApp.isSupported() && file.getUserData(REQUEST_KEY) != null
+ }
+
+ override fun acceptRequiresReadAction() = false
override fun getEditorTypeId(): String = "html-editor"
@@ -70,8 +74,10 @@ class HTMLEditorProvider : FileEditorProvider, DumbAware {
}
companion object {
- @JvmStatic fun html(html: String): Request = Request(html, null)
- @JvmStatic fun url(url: String): Request = Request(null, url)
+ @JvmStatic
+ fun html(html: String): Request = Request(html, null)
+ @JvmStatic
+ fun url(url: String): Request = Request(null, url)
}
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/JComponentEditorProvider.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/JComponentEditorProvider.kt
index c307df65768f..fe947df5bbf6 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/JComponentEditorProvider.kt
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/JComponentEditorProvider.kt
@@ -1,4 +1,4 @@
-// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.fileEditor.impl
import com.intellij.openapi.fileEditor.FileEditor
@@ -26,7 +26,7 @@ import javax.swing.JComponent
* JComponentEditorProvider.openEditor(project, "Title", jComponent, fileType)
* }
*/
-class JComponentEditorProvider : FileEditorProvider, DumbAware {
+internal class JComponentEditorProvider : FileEditorProvider, DumbAware {
override fun createEditor(project: Project, file: VirtualFile): FileEditor {
val fileEditor = file.getUserData(EDITOR_KEY)
return if (fileEditor != null) {
@@ -42,6 +42,8 @@ class JComponentEditorProvider : FileEditorProvider, DumbAware {
override fun accept(project: Project, file: VirtualFile): Boolean = isJComponentFile(file)
+ override fun acceptRequiresReadAction() = false
+
override fun getEditorTypeId(): String = "jcomponent-editor"
override fun getPolicy(): FileEditorPolicy = FileEditorPolicy.HIDE_DEFAULT_EDITOR
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/http/HttpFileEditorProvider.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/http/HttpFileEditorProvider.java
index 677a8873447a..5c1ba7057e5e 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/http/HttpFileEditorProvider.java
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/http/HttpFileEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.fileEditor.impl.http;
import com.intellij.openapi.fileEditor.FileEditor;
@@ -13,12 +13,17 @@ import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
-class HttpFileEditorProvider implements FileEditorProvider, DumbAware {
+final class HttpFileEditorProvider implements FileEditorProvider, DumbAware {
@Override
public boolean accept(@NotNull final Project project, @NotNull final VirtualFile file) {
return file instanceof HttpVirtualFile && !file.isDirectory();
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@Override
@NotNull
public FileEditor createEditor(@NotNull final Project project, @NotNull final VirtualFile file) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.kt
index 6c5d30a033ac..3eda6a35d6ce 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.kt
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.kt
@@ -4,6 +4,8 @@ package com.intellij.openapi.fileEditor.impl.text
import com.intellij.concurrency.captureThreadContext
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.EDT
+import com.intellij.openapi.application.ModalityState
+import com.intellij.openapi.application.asContextElement
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.fileEditor.FileEditorStateLevel
@@ -46,7 +48,7 @@ class AsyncEditorLoader internal constructor(private val project: Project,
internal suspend fun waitForLoaded(editor: Editor) {
if (editor.getUserData(ASYNC_LOADER) != null) {
- withContext(Dispatchers.EDT) {
+ withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) {
suspendCoroutine {
performWhenLoaded(editor) { it.resume(Unit) }
}
@@ -184,7 +186,7 @@ private fun CoroutineScope.showLoadingIndicator(startDelay: Duration, addUi: (co
delay((startDelay.inWholeMilliseconds - (System.currentTimeMillis() - scheduleTime)).coerceAtLeast(0))
val processIcon = withContext(Dispatchers.EDT) {
- val processIcon = AsyncProcessIcon.createBig(this@launch)
+ val processIcon = AsyncProcessIcon.createBig(/* coroutineScope = */ this@launch)
addUi(processIcon)
processIcon
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.kt
index 084bedbce85a..675bb264aeca 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.kt
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.kt
@@ -84,6 +84,8 @@ open class TextEditorProvider : DefaultPlatformFileEditorProvider, TextBasedFile
return isTextFile(file) && !SingleRootFileViewProvider.isTooLargeForContentLoading(file)
}
+ override fun acceptRequiresReadAction() = false
+
override fun createEditor(project: Project, file: VirtualFile): FileEditor {
return TextEditorImpl(project, file, this, createTextEditor(project, file))
}
diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java
index e5c4fa72de2d..a56e23d0b858 100644
--- a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java
+++ b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.fileEditor;
import com.intellij.ide.ui.UISettings;
@@ -472,9 +472,8 @@ public class FileEditorManagerTest extends FileEditorManagerTestCase {
myPolicy = policy;
}
- @NotNull
@Override
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return myEditorTypeId;
}
@@ -483,19 +482,21 @@ public class FileEditorManagerTest extends FileEditorManagerTestCase {
return true;
}
- @NotNull
@Override
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new Mock.MyFileEditor() {
- @NotNull
@Override
- public JComponent getComponent() {
+ public @NotNull JComponent getComponent() {
return new JLabel();
}
- @NotNull
@Override
- public String getName() {
+ public @NotNull String getName() {
return myFileEditorName;
}
@@ -510,9 +511,8 @@ public class FileEditorManagerTest extends FileEditorManagerTestCase {
public void disposeEditor(@NotNull FileEditor editor) {
}
- @NotNull
@Override
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return myPolicy;
}
}
@@ -547,21 +547,23 @@ public class FileEditorManagerTest extends FileEditorManagerTestCase {
return true;
}
- @NotNull
@Override
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new MyTextEditor(file, FileDocumentManager.getInstance().getDocument(file), myId, myTargetOffset);
}
- @NotNull
@Override
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return myId;
}
- @NotNull
@Override
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.HIDE_DEFAULT_EDITOR;
}
}
@@ -592,21 +594,18 @@ public class FileEditorManagerTest extends FileEditorManagerTestCase {
}
}
- @NotNull
@Override
- public JComponent getComponent() {
+ public @NotNull JComponent getComponent() {
return new JLabel();
}
- @NotNull
@Override
- public String getName() {
+ public @NotNull String getName() {
return myName;
}
- @NotNull
@Override
- public Editor getEditor() {
+ public @NotNull Editor getEditor() {
return myEditor;
}
diff --git a/platform/testFramework/src/com/intellij/mock/Mock.java b/platform/testFramework/src/com/intellij/mock/Mock.java
index 683b5cd87f65..bbf3072388d0 100644
--- a/platform/testFramework/src/com/intellij/mock/Mock.java
+++ b/platform/testFramework/src/com/intellij/mock/Mock.java
@@ -456,6 +456,11 @@ public final class Mock {
return false;
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@Override
public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
throw new UnsupportedOperationException();
diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/editor/VcsLogEditor.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/editor/VcsLogEditor.kt
index b164466473d5..b7a33f499c70 100644
--- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/editor/VcsLogEditor.kt
+++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/editor/VcsLogEditor.kt
@@ -61,9 +61,9 @@ class VcsLogEditor(private val project: Project, private val vcsLogFile: VcsLogF
private class VcsLogEditorProvider : FileEditorProvider, StructureViewFileEditorProvider, DumbAware {
override fun accept(project: Project, file: VirtualFile): Boolean = file is VcsLogFile
- override fun createEditor(project: Project, file: VirtualFile): FileEditor {
- return VcsLogEditor(project, file as VcsLogFile)
- }
+ override fun acceptRequiresReadAction() = false
+
+ override fun createEditor(project: Project, file: VirtualFile) = VcsLogEditor(project, file as VcsLogFile)
override fun getEditorTypeId(): String = "VcsLogEditor"
override fun getPolicy(): FileEditorPolicy = FileEditorPolicy.HIDE_DEFAULT_EDITOR
diff --git a/plugins/devkit/devkit-core/src/testAssistant/TestDataGroupEditorProvider.java b/plugins/devkit/devkit-core/src/testAssistant/TestDataGroupEditorProvider.java
index 5e17bebece7d..0091dae1c39c 100644
--- a/plugins/devkit/devkit-core/src/testAssistant/TestDataGroupEditorProvider.java
+++ b/plugins/devkit/devkit-core/src/testAssistant/TestDataGroupEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.devkit.testAssistant;
import com.intellij.openapi.fileEditor.FileEditor;
@@ -10,28 +10,29 @@ import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.testAssistant.vfs.TestDataGroupVirtualFile;
-
-public class TestDataGroupEditorProvider implements FileEditorProvider, DumbAware {
+final class TestDataGroupEditorProvider implements FileEditorProvider, DumbAware {
@Override
public boolean accept(@NotNull Project project, @NotNull VirtualFile file) {
return file instanceof TestDataGroupVirtualFile;
}
@Override
- @NotNull
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new TestDataGroupFileEditor(project, (TestDataGroupVirtualFile) file);
}
@Override
- @NotNull
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return "TestDataGroup";
}
@Override
- @NotNull
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.HIDE_DEFAULT_EDITOR;
}
}
diff --git a/plugins/devkit/devkit-core/src/testAssistant/vfs/TestDataGroupVirtualFile.java b/plugins/devkit/devkit-core/src/testAssistant/vfs/TestDataGroupVirtualFile.java
index 06e5ccd0d7be..2add1a3f005e 100644
--- a/plugins/devkit/devkit-core/src/testAssistant/vfs/TestDataGroupVirtualFile.java
+++ b/plugins/devkit/devkit-core/src/testAssistant/vfs/TestDataGroupVirtualFile.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.devkit.testAssistant.vfs;
import com.intellij.ide.presentation.Presentation;
@@ -9,13 +9,11 @@ import com.intellij.util.ArrayUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.testAssistant.TestDataUtil;
-import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-
@Presentation(icon = "AllIcons.Nodes.TestSourceFolder")
-public class TestDataGroupVirtualFile extends VirtualFile {
+public final class TestDataGroupVirtualFile extends VirtualFile {
private final VirtualFile myBeforeFile;
private final VirtualFile myAfterFile;
@@ -24,31 +22,26 @@ public class TestDataGroupVirtualFile extends VirtualFile {
myAfterFile = afterFile;
}
- @NotNull
@Override
- public String getName() {
+ public @NotNull String getName() {
return TestDataUtil.getGroupDisplayName(myBeforeFile.getName(), myAfterFile.getName());
}
- @NotNull
- public VirtualFile getBeforeFile() {
+ public @NotNull VirtualFile getBeforeFile() {
return myBeforeFile;
}
- @NotNull
- public VirtualFile getAfterFile() {
+ public @NotNull VirtualFile getAfterFile() {
return myAfterFile;
}
- @NotNull
@Override
- public VirtualFileSystem getFileSystem() {
+ public @NotNull VirtualFileSystem getFileSystem() {
return TestDataGroupFileSystem.getTestDataGroupFileSystem();
}
- @NotNull
@Override
- public String getPath() {
+ public @NotNull String getPath() {
return TestDataGroupFileSystem.getPath(myBeforeFile, myAfterFile);
}
@@ -76,14 +69,14 @@ public class TestDataGroupVirtualFile extends VirtualFile {
public VirtualFile[] getChildren() {
return EMPTY_ARRAY;
}
- @NotNull
+
@Override
- public OutputStream getOutputStream(Object requestor, long newModificationStamp, long newTimeStamp) throws IOException {
+ public @NotNull OutputStream getOutputStream(Object requestor, long newModificationStamp, long newTimeStamp) {
throw new UnsupportedOperationException();
}
@Override
- public byte @NotNull [] contentsToByteArray() throws IOException {
+ public byte @NotNull [] contentsToByteArray() {
return ArrayUtilRt.EMPTY_BYTE_ARRAY;
}
@@ -107,13 +100,12 @@ public class TestDataGroupVirtualFile extends VirtualFile {
}
@Override
- public @NotNull InputStream getInputStream() throws IOException {
+ public @NotNull InputStream getInputStream() {
throw new UnsupportedOperationException();
}
- @NotNull
@Override
- public FileType getFileType() {
+ public @NotNull FileType getFileType() {
return myBeforeFile.getFileType();
}
diff --git a/plugins/editorconfig/resources/META-INF/plugin.xml b/plugins/editorconfig/resources/META-INF/plugin.xml
index a86abf14642a..15c067631c02 100644
--- a/plugins/editorconfig/resources/META-INF/plugin.xml
+++ b/plugins/editorconfig/resources/META-INF/plugin.xml
@@ -38,7 +38,7 @@ For more information, check the documentation for
-
+
diff --git a/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/file/GitLabFileEditorProvider.kt b/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/file/GitLabFileEditorProvider.kt
index 14b28975aa97..817e074cee40 100644
--- a/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/file/GitLabFileEditorProvider.kt
+++ b/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/file/GitLabFileEditorProvider.kt
@@ -11,11 +11,12 @@ import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.plugins.gitlab.api.GitLabProjectConnectionManager
internal class GitLabFileEditorProvider : FileEditorProvider, DumbAware {
-
override fun accept(project: Project, file: VirtualFile): Boolean {
return file is GitLabProjectVirtualFile && project.service().connectionState.value != null
}
+ override fun acceptRequiresReadAction() = false
+
override fun createEditor(project: Project, file: VirtualFile): FileEditor {
file as GitLabProjectVirtualFile
val ctx = file.findContext() ?: error("Not context for $this")
@@ -26,5 +27,6 @@ internal class GitLabFileEditorProvider : FileEditorProvider, DumbAware {
}
override fun getEditorTypeId(): String = "GitLab"
+
override fun getPolicy(): FileEditorPolicy = FileEditorPolicy.HIDE_DEFAULT_EDITOR
}
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditorProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditorProvider.java
index 0c8b970440f8..0eac7bd80c5a 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditorProvider.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.javaFX.sceneBuilder;
import com.intellij.openapi.fileEditor.FileEditor;
@@ -25,21 +25,23 @@ public class SceneBuilderEditorProvider implements FileEditorProvider, DumbAware
return JavaFxFileTypeFactory.FXML_EXTENSION.equalsIgnoreCase(file.getExtension()) && Registry.is("embed.scene.builder");
}
- @NotNull
@Override
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new SceneBuilderEditor(project, file);
}
- @NotNull
@Override
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return "JavaFX-Scene-Builder";
}
- @NotNull
@Override
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.PLACE_AFTER_DEFAULT_EDITOR;
}
}
\ No newline at end of file
diff --git a/plugins/kotlin/jvm/src/org/jetbrains/kotlin/idea/scratch/ui/KtScratchFileEditorProvider.kt b/plugins/kotlin/jvm/src/org/jetbrains/kotlin/idea/scratch/ui/KtScratchFileEditorProvider.kt
index d9f89f4f06b8..704d00d82145 100644
--- a/plugins/kotlin/jvm/src/org/jetbrains/kotlin/idea/scratch/ui/KtScratchFileEditorProvider.kt
+++ b/plugins/kotlin/jvm/src/org/jetbrains/kotlin/idea/scratch/ui/KtScratchFileEditorProvider.kt
@@ -47,6 +47,8 @@ private class KtScratchFileEditorProvider : FileEditorProvider, DumbAware {
return ScratchFileLanguageProvider.get(psiFile.fileType) != null
}
+ override fun acceptRequiresReadAction(): Boolean = false
+
override fun createEditor(project: Project, file: VirtualFile): FileEditor {
val scratchFile = createScratchFile(project, file) ?: return TextEditorProvider.getInstance().createEditor(project, file)
return KtScratchFileEditorWithPreview.create(scratchFile)
diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownPreviewFileEditorProvider.java b/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownPreviewFileEditorProvider.java
index 59f2930cd23a..24fb0cab6c36 100644
--- a/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownPreviewFileEditorProvider.java
+++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownPreviewFileEditorProvider.java
@@ -15,27 +15,32 @@ import org.jetbrains.annotations.NotNull;
final class MarkdownPreviewFileEditorProvider extends WeighedFileEditorProvider {
@Override
public boolean accept(@NotNull Project project, @NotNull VirtualFile file) {
- if (!MarkdownHtmlPanelProvider.hasAvailableProviders()) return false;
+ if (!MarkdownHtmlPanelProvider.hasAvailableProviders()) {
+ return false;
+ }
+
FileType fileType = file.getFileType();
return fileType == MarkdownFileType.INSTANCE ||
ScratchUtil.isScratch(file) && LanguageUtil.getLanguageForPsi(project, file, fileType) == MarkdownLanguage.INSTANCE;
}
- @NotNull
@Override
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public boolean acceptRequiresReadAction() {
+ return true;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new MarkdownPreviewFileEditor(project, file);
}
- @NotNull
@Override
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return "markdown-preview-editor";
}
- @NotNull
@Override
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.PLACE_AFTER_DEFAULT_EDITOR;
}
}
diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownSplitEditorProvider.kt b/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownSplitEditorProvider.kt
index 3d0560f4f7cc..c20d255fe45f 100644
--- a/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownSplitEditorProvider.kt
+++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/preview/MarkdownSplitEditorProvider.kt
@@ -13,7 +13,7 @@ import org.jdom.Element
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
-class MarkdownSplitEditorProvider: SplitTextEditorProvider(PsiAwareTextEditorProvider(), MarkdownPreviewFileEditorProvider()) {
+class MarkdownSplitEditorProvider : SplitTextEditorProvider(PsiAwareTextEditorProvider(), MarkdownPreviewFileEditorProvider()) {
override fun createSplitEditor(firstEditor: FileEditor, secondEditor: FileEditor): FileEditor {
require(firstEditor is TextEditor) { "Main editor should be TextEditor" }
require(secondEditor is MarkdownPreviewFileEditor) { "Secondary editor should be MarkdownPreviewFileEditor" }
diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/split/SplitTextEditorProvider.java b/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/split/SplitTextEditorProvider.java
index 44c68efb210a..386f55941dc1 100644
--- a/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/split/SplitTextEditorProvider.java
+++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/ui/split/SplitTextEditorProvider.java
@@ -27,13 +27,10 @@ public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider
protected static final String SECOND_EDITOR = "second_editor";
protected static final String SPLIT_LAYOUT = "split_layout";
- @NotNull
- protected final FileEditorProvider myFirstProvider;
- @NotNull
- protected final FileEditorProvider mySecondProvider;
+ protected final @NotNull FileEditorProvider myFirstProvider;
+ protected final @NotNull FileEditorProvider mySecondProvider;
- @NotNull
- private final String myEditorTypeId;
+ private final @NotNull String myEditorTypeId;
public SplitTextEditorProvider(@NotNull FileEditorProvider firstProvider, @NotNull FileEditorProvider secondProvider) {
myFirstProvider = firstProvider;
@@ -43,38 +40,39 @@ public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider
}
@Override
- public boolean accept(@NotNull Project project, @NotNull VirtualFile file) {
+ public final boolean accept(@NotNull Project project, @NotNull VirtualFile file) {
return myFirstProvider.accept(project, file) && mySecondProvider.accept(project, file);
}
- @NotNull
@Override
- public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
+ public final boolean acceptRequiresReadAction() {
+ return myFirstProvider.acceptRequiresReadAction() || mySecondProvider.acceptRequiresReadAction();
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return createEditorAsync(project, file).build();
}
- @NotNull
@Override
- public String getEditorTypeId() {
+ public @NotNull String getEditorTypeId() {
return myEditorTypeId;
}
- @NotNull
@Override
- public Builder createEditorAsync(@NotNull final Project project, @NotNull final VirtualFile file) {
+ public @NotNull Builder createEditorAsync(final @NotNull Project project, final @NotNull VirtualFile file) {
final Builder firstBuilder = getBuilderFromEditorProvider(myFirstProvider, project, file);
final Builder secondBuilder = getBuilderFromEditorProvider(mySecondProvider, project, file);
return new Builder() {
@Override
- public FileEditor build() {
+ public @NotNull FileEditor build() {
return createSplitEditor(firstBuilder.build(), secondBuilder.build());
}
};
}
- @Nullable
- protected FileEditorState readFirstProviderState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
+ protected @Nullable FileEditorState readFirstProviderState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
final var child = sourceElement.getChild(FIRST_EDITOR);
if (child != null) {
return myFirstProvider.readState(child, project, file);
@@ -82,8 +80,7 @@ public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider
return null;
}
- @Nullable
- protected FileEditorState readSecondProviderState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
+ protected @Nullable FileEditorState readSecondProviderState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
final var child = sourceElement.getChild(SECOND_EDITOR);
if (child != null) {
return mySecondProvider.readState(child, project, file);
@@ -91,8 +88,7 @@ public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider
return null;
}
- @Nullable
- protected String readSplitLayoutState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
+ protected @Nullable String readSplitLayoutState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
final var attribute = sourceElement.getAttribute(SPLIT_LAYOUT);
String layoutName = null;
if (attribute != null) {
@@ -101,9 +97,8 @@ public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider
return layoutName;
}
- @NotNull
@Override
- public FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
+ public @NotNull FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
final var firstState = readFirstProviderState(sourceElement, project, file);
final var secondState = readSecondProviderState(sourceElement, project, file);
final var layoutName = readSplitLayoutState(sourceElement, project, file);
@@ -144,16 +139,14 @@ public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider
protected abstract FileEditor createSplitEditor(@NotNull FileEditor firstEditor, @NotNull FileEditor secondEditor);
- @NotNull
@Override
- public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.HIDE_DEFAULT_EDITOR;
}
- @NotNull
- public static Builder getBuilderFromEditorProvider(@NotNull final FileEditorProvider provider,
- @NotNull final Project project,
- @NotNull final VirtualFile file) {
+ public static @NotNull Builder getBuilderFromEditorProvider(final @NotNull FileEditorProvider provider,
+ final @NotNull Project project,
+ final @NotNull VirtualFile file) {
if (provider instanceof AsyncFileEditorProvider) {
return ((AsyncFileEditorProvider)provider).createEditorAsync(project, file);
}
diff --git a/plugins/properties/properties-resource-bundle-editor/src/com/intellij/lang/properties/editor/ResourceBundleEditorProvider.java b/plugins/properties/properties-resource-bundle-editor/src/com/intellij/lang/properties/editor/ResourceBundleEditorProvider.java
index 14c25af742bd..db0463982218 100644
--- a/plugins/properties/properties-resource-bundle-editor/src/com/intellij/lang/properties/editor/ResourceBundleEditorProvider.java
+++ b/plugins/properties/properties-resource-bundle-editor/src/com/intellij/lang/properties/editor/ResourceBundleEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.lang.properties.editor;
import com.intellij.lang.properties.PropertiesFileType;
@@ -23,10 +23,16 @@ import org.jetbrains.annotations.NotNull;
public final class ResourceBundleEditorProvider implements FileEditorProvider, DumbAware {
@Override
public boolean accept(final @NotNull Project project, final @NotNull VirtualFile file){
- if (file instanceof ResourceBundleAsVirtualFile) return true;
- if (!file.isValid()) return false;
- final FileType type = file.getFileType();
- if (type != PropertiesFileType.INSTANCE && type != StdFileTypes.XML) return false;
+ if (file instanceof ResourceBundleAsVirtualFile) {
+ return true;
+ }
+ if (!file.isValid()) {
+ return false;
+ }
+ FileType type = file.getFileType();
+ if (type != PropertiesFileType.INSTANCE && type != StdFileTypes.XML) {
+ return false;
+ }
return ReadAction.compute(() -> {
if (project.isDisposed()) return Boolean.FALSE;
@@ -36,6 +42,11 @@ public final class ResourceBundleEditorProvider implements FileEditorProvider, D
});
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@Override
public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
ResourceBundle resourceBundle;
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java
index df6e4f0744ed..05d3a29975a8 100644
--- a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.terminal.vfs;
import com.intellij.openapi.Disposable;
@@ -17,12 +17,17 @@ import org.jetbrains.plugins.terminal.ShellStartupOptions;
import org.jetbrains.plugins.terminal.ShellStartupOptionsKt;
import org.jetbrains.plugins.terminal.arrangement.TerminalWorkingDirectoryManager;
-public class TerminalSessionEditorProvider implements FileEditorProvider, DumbAware {
+final class TerminalSessionEditorProvider implements FileEditorProvider, DumbAware {
@Override
public boolean accept(@NotNull Project project, @NotNull VirtualFile file) {
return file instanceof TerminalSessionVirtualFileImpl;
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@NotNull
@Override
public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/editor/UIFormEditorProvider.java b/plugins/ui-designer/src/com/intellij/uiDesigner/editor/UIFormEditorProvider.java
index 751d3fb95e18..0952cc2c6f9f 100644
--- a/plugins/ui-designer/src/com/intellij/uiDesigner/editor/UIFormEditorProvider.java
+++ b/plugins/ui-designer/src/com/intellij/uiDesigner/editor/UIFormEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.uiDesigner.editor;
import com.intellij.openapi.diagnostic.Logger;
@@ -17,11 +17,11 @@ import com.intellij.util.ArrayUtilRt;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
-public final class UIFormEditorProvider implements FileEditorProvider, DumbAware {
+final class UIFormEditorProvider implements FileEditorProvider, DumbAware {
private static final Logger LOG = Logger.getInstance(UIFormEditorProvider.class);
@Override
- public boolean accept(@NotNull final Project project, @NotNull final VirtualFile file){
+ public boolean accept(final @NotNull Project project, final @NotNull VirtualFile file){
return
FileTypeRegistry.getInstance().isFileOfType(file, GuiFormFileType.INSTANCE) &&
!GuiFormFileType.INSTANCE.isBinary() &&
@@ -29,25 +29,29 @@ public final class UIFormEditorProvider implements FileEditorProvider, DumbAware
}
@Override
- @NotNull public FileEditor createEditor(@NotNull final Project project, @NotNull final VirtualFile file){
+ public boolean acceptRequiresReadAction() {
+ return true;
+ }
+
+ @Override
+ public @NotNull FileEditor createEditor(final @NotNull Project project, final @NotNull VirtualFile file){
LOG.assertTrue(accept(project, file));
return new UIFormEditor(project, file);
}
@Override
- @NotNull
- public FileEditorState readState(@NotNull Element element, @NotNull final Project project, @NotNull final VirtualFile file){
+ public @NotNull FileEditorState readState(@NotNull Element element, final @NotNull Project project, final @NotNull VirtualFile file){
//TODO[anton,vova] implement
return new MyEditorState(-1, ArrayUtilRt.EMPTY_STRING_ARRAY);
}
@Override
- @NotNull public String getEditorTypeId(){
+ public @NotNull String getEditorTypeId(){
return "ui-designer";
}
@Override
- @NotNull public FileEditorPolicy getPolicy() {
+ public @NotNull FileEditorPolicy getPolicy() {
return FileEditorPolicy.HIDE_DEFAULT_EDITOR;
}
}
\ No newline at end of file
diff --git a/python/rest/resources/META-INF/rest.xml b/python/rest/resources/META-INF/rest.xml
index f42264a22cc6..40899dac3a21 100644
--- a/python/rest/resources/META-INF/rest.xml
+++ b/python/rest/resources/META-INF/rest.xml
@@ -32,7 +32,7 @@
-
+
diff --git a/python/rest/src/com/jetbrains/rest/editor/RestSplitEditorProvider.java b/python/rest/src/com/jetbrains/rest/editor/RestSplitEditorProvider.java
index 85ca31d4218a..9b266a6b833f 100644
--- a/python/rest/src/com/jetbrains/rest/editor/RestSplitEditorProvider.java
+++ b/python/rest/src/com/jetbrains/rest/editor/RestSplitEditorProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.rest.editor;
import com.intellij.openapi.fileEditor.*;
@@ -10,8 +10,8 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.jetbrains.rest.RestFileType;
import org.jetbrains.annotations.NotNull;
-public class RestSplitEditorProvider implements FileEditorProvider, DumbAware {
- public RestSplitEditorProvider() {
+final class RestSplitEditorProvider implements FileEditorProvider, DumbAware {
+ RestSplitEditorProvider() {
}
@Override
@@ -19,6 +19,11 @@ public class RestSplitEditorProvider implements FileEditorProvider, DumbAware {
return FileTypeRegistry.getInstance().isFileOfType(file, RestFileType.INSTANCE);
}
+ @Override
+ public boolean acceptRequiresReadAction() {
+ return false;
+ }
+
@NotNull
@Override
public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {