User: kyle wood Date: 03 Oct 22 01:54 Revision: 12b14212e390451b274a1315632b74b7ec1b0989 Summary: Merge branch '2021.3' into 2022.1 TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=8147&personal=false Index: build.gradle.kts =================================================================== --- build.gradle.kts (revision 9434b74357b45f0381c8201979cda78900fb3527) +++ build.gradle.kts (revision 12b14212e390451b274a1315632b74b7ec1b0989) @@ -363,7 +363,7 @@ } tasks.runIde { - maxHeapSize = "2G" + maxHeapSize = "4G" jvmArgs("--add-exports=java.base/jdk.internal.vm=ALL-UNNAMED") System.getProperty("debug")?.let { Index: src/main/kotlin/nbt/editor/NbtFileEditorProvider.kt =================================================================== --- src/main/kotlin/nbt/editor/NbtFileEditorProvider.kt (revision 9434b74357b45f0381c8201979cda78900fb3527) +++ src/main/kotlin/nbt/editor/NbtFileEditorProvider.kt (revision 12b14212e390451b274a1315632b74b7ec1b0989) @@ -12,9 +12,19 @@ import com.demonwav.mcdev.nbt.NbtVirtualFile import com.demonwav.mcdev.nbt.filetype.NbtFileType +import com.demonwav.mcdev.nbt.lang.NbttFile +import com.demonwav.mcdev.util.invokeAndWait import com.demonwav.mcdev.util.invokeLater -import com.intellij.openapi.application.ApplicationManager +import com.intellij.ide.actions.SaveAllAction +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.AnActionResult +import com.intellij.openapi.actionSystem.ex.AnActionListener +import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.command.UndoConfirmationPolicy +import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.fileEditor.FileEditor +import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.fileEditor.FileEditorPolicy import com.intellij.openapi.fileEditor.FileEditorState import com.intellij.openapi.fileEditor.FileEditorStateLevel @@ -26,30 +36,35 @@ import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiManager +import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.ui.components.JBLoadingPanel import com.intellij.util.IncorrectOperationException import java.awt.BorderLayout import java.beans.PropertyChangeListener import javax.swing.JPanel +import org.jetbrains.concurrency.runAsync class NbtFileEditorProvider : PsiAwareTextEditorProvider(), DumbAware { override fun getEditorTypeId() = EDITOR_TYPE_ID override fun accept(project: Project, file: VirtualFile) = file.fileType == NbtFileType override fun getPolicy() = FileEditorPolicy.NONE override fun createEditor(project: Project, file: VirtualFile): FileEditor { - val fileEditor = NbtFileEditor(file) { nbtFile -> super.createEditor(project, nbtFile) } + val fileEditor = NbtFileEditor(file) { nbtFile -> + invokeAndWait { + super.createEditor(project, nbtFile) + } + } - ApplicationManager.getApplication().executeOnPooledThread { + runAsync { val nbtFile = NbtVirtualFile(file, project) if (NonProjectFileWritingAccessProvider.isWriteAccessAllowed(file, project)) { NonProjectFileWritingAccessProvider.allowWriting(listOf(nbtFile)) } - invokeLater { - fileEditor.ready(nbtFile) + fileEditor.ready(nbtFile, project) - } + } - } return fileEditor } @@ -75,12 +90,18 @@ component.add(loading, BorderLayout.CENTER) } - fun ready(nbtFile: NbtVirtualFile) { + fun ready(nbtFile: NbtVirtualFile, project: Project) { + if (project.isDisposed) { + return + } + component.removeAll() val toolbar = NbtToolbar(nbtFile) nbtFile.toolbar = toolbar - editor = editorProvider(nbtFile) + editor = invokeAndWait { + editorProvider(nbtFile) + } editor?.let { editor -> try { Disposer.register(this, editor) @@ -92,11 +113,44 @@ Disposer.dispose(this) return@let } + invokeLater { - component.add(toolbar.panel, BorderLayout.NORTH) - component.add(editor.component, BorderLayout.CENTER) - } - } + component.add(toolbar.panel, BorderLayout.NORTH) + component.add(editor.component, BorderLayout.CENTER) + } + } + // This can be null if the file is too big to be parsed as a psi file + val psiFile = runReadAction { + PsiManager.getInstance(project).findFile(nbtFile) as? NbttFile + } ?: return + + WriteCommandAction.writeCommandAction(psiFile) + .shouldRecordActionForActiveDocument(false) + .withUndoConfirmationPolicy(UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION) + .run { + CodeStyleManager.getInstance(project).reformat(psiFile, true) + } + + project.messageBus.connect(this).subscribe( + AnActionListener.TOPIC, + object : AnActionListener { + override fun afterActionPerformed(action: AnAction, event: AnActionEvent, result: AnActionResult) { + if (action !is SaveAllAction) { + return + } + + val selectedEditor = FileEditorManager.getInstance(project).selectedEditor ?: return + + if (selectedEditor !is NbtFileEditor || selectedEditor.editor != editor) { + return + } + + nbtFile.writeFile(this) + } + } + ) + } + override fun isModified() = editor.exec { isModified } ?: false override fun addPropertyChangeListener(listener: PropertyChangeListener) { editor.exec { addPropertyChangeListener(listener) } Index: src/main/kotlin/util/utils.kt =================================================================== --- src/main/kotlin/util/utils.kt (revision 9434b74357b45f0381c8201979cda78900fb3527) +++ src/main/kotlin/util/utils.kt (revision 12b14212e390451b274a1315632b74b7ec1b0989) @@ -34,6 +34,8 @@ import com.intellij.psi.PsiFile import java.util.Locale import kotlin.math.min +import org.jetbrains.concurrency.Promise +import org.jetbrains.concurrency.runAsync inline fun runWriteTask(crossinline func: () -> T): T { return invokeAndWait { @@ -106,6 +108,12 @@ return result } +inline fun runReadActionAsync(crossinline runnable: () -> T): Promise { + return runAsync { + runReadAction(runnable) + } +} + fun waitForAllSmart() { for (project in ProjectManager.getInstance().openProjects) { if (!project.isDisposed) {