[NPW|Assets] fix: generate sources on a background thread under modal progress

Issues: IDEA-349863, IDEA-341180

GitOrigin-RevId: 06c621f3d98cd15231b5b083fba3884626e06b1d
This commit is contained in:
Sergei Vorobyov
2024-09-16 13:20:00 +02:00
committed by intellij-monorepo-bot
parent e4012cbda4
commit d6db8e23b3
2 changed files with 20 additions and 2 deletions

View File

@@ -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<Path> {
return withContext(Dispatchers.IO) {
blockingContext {
val assetsProcessor = AssetsProcessor.getInstance()
assetsProcessor.generateSources(outputDirectory, assets, templateProperties)
}
}
}
private fun reformatCode(project: Project, files: List<VirtualFile>) {
val psiManager = PsiManager.getInstance(project)
val psiFiles = files.mapNotNull { psiManager.findFile(it) }

View File

@@ -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