From d6db8e23b373f0e08c3ce74220d78c526815821a Mon Sep 17 00:00:00 2001 From: Sergei Vorobyov Date: Mon, 16 Sep 2024 13:20:00 +0200 Subject: [PATCH] [NPW|Assets] fix: generate sources on a background thread under modal progress Issues: IDEA-349863, IDEA-341180 GitOrigin-RevId: 06c621f3d98cd15231b5b083fba3884626e06b1d --- .../generators/AssetsNewProjectWizardStep.kt | 21 +++++++++++++++++-- .../resources/messages/UIBundle.properties | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/generators/AssetsNewProjectWizardStep.kt b/java/idea-ui/src/com/intellij/ide/projectWizard/generators/AssetsNewProjectWizardStep.kt index 54f9f9fd017b..ae83c8ac6b09 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/generators/AssetsNewProjectWizardStep.kt +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/generators/AssetsNewProjectWizardStep.kt @@ -14,14 +14,19 @@ import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData import com.intellij.ide.wizard.NewProjectWizardStep import com.intellij.ide.wizard.setupProjectSafe import com.intellij.ide.wizard.whenProjectCreated +import com.intellij.openapi.application.invokeAndWaitIfNeeded import com.intellij.openapi.fileEditor.FileEditorManager +import com.intellij.openapi.progress.blockingContext import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.isFile import com.intellij.openapi.vfs.refreshAndFindVirtualFile import com.intellij.openapi.vfs.refreshAndFindVirtualFileOrDirectory +import com.intellij.platform.ide.progress.runWithModalProgressBlocking import com.intellij.psi.PsiManager import com.intellij.ui.UIBundle +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import org.jetbrains.annotations.ApiStatus import java.net.URL import java.nio.file.Path @@ -93,8 +98,11 @@ abstract class AssetsNewProjectWizardStep(parent: NewProjectWizardStep) : Abstra val outputDirectory = resolveOutputDirectory() val filesToOpen = resolveFilesToOpen(outputDirectory) - val assetsProcessor = AssetsProcessor.getInstance() - val generatedFiles = assetsProcessor.generateSources(outputDirectory, assets, templateProperties) + val generatedFiles = invokeAndWaitIfNeeded { + runWithModalProgressBlocking(project, UIBundle.message("label.project.wizard.new.assets.step.generate.sources.progress", project.name)) { + generateSources(outputDirectory) + } + } whenProjectCreated(project) { //IDEA-244863 reformatCode(project, generatedFiles.mapNotNull { it.refreshAndFindVirtualFileOrDirectory() }.filter { it.isFile }) @@ -121,6 +129,15 @@ abstract class AssetsNewProjectWizardStep(parent: NewProjectWizardStep) : Abstra return filesToOpen.map { outputDirectory.resolve(it).normalize() } } + private suspend fun generateSources(outputDirectory: Path): List { + return withContext(Dispatchers.IO) { + blockingContext { + val assetsProcessor = AssetsProcessor.getInstance() + assetsProcessor.generateSources(outputDirectory, assets, templateProperties) + } + } + } + private fun reformatCode(project: Project, files: List) { val psiManager = PsiManager.getInstance(project) val psiFiles = files.mapNotNull { psiManager.findFile(it) } diff --git a/platform/platform-api/resources/messages/UIBundle.properties b/platform/platform-api/resources/messages/UIBundle.properties index 09d9d3aabd99..651c1f1a97c5 100644 --- a/platform/platform-api/resources/messages/UIBundle.properties +++ b/platform/platform-api/resources/messages/UIBundle.properties @@ -313,6 +313,7 @@ label.project.wizard.new.module.name.exists.error=Module ''{0}'' already exists label.project.wizard.new.module.directory.already.taken.error=Module {0} already exists in this location label.project.wizard.empty.project.generator.name=Empty Project label.project.wizard.empty.project.generator.full.description=A basic project with free structure. +label.project.wizard.new.assets.step.generate.sources.progress=Generating project {0} sources\u2026 error.project.wizard.new.project.title=New {0,choice,0#Module|1#Project} Wizard Error error.project.wizard.new.project.sample.code=Unable to generate {0,choice,0#module|1#project} sources