From f927fb3471e96ea8dea5dbbefe6cc891af1c5e39 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 12 Dec 2019 20:22:30 +0300 Subject: [PATCH] Wizard: introduce ServicesManager & correctly handle disabled gradle & maven Idea plugins --- .../tools/projectWizard/wizard/IdeWizard.kt | 14 ++- .../wizard/NewProjectWizardModuleBuilder.kt | 12 +-- .../projectWizard/wizard/ideaServices.kt | 91 ------------------- ...deaBuildSystemAvailabilityWizardService.kt | 19 ++++ .../service/IdeaFileSystemWizardService.kt | 31 +++++++ .../wizard/service/IdeaGradleWizardService.kt | 51 +++++++++++ .../IdeaJpsWizardService.kt} | 22 +++-- .../wizard/service/IdeaMavenWizardService.kt | 47 ++++++++++ .../wizard/service/IdeaWizardService.kt | 27 ++++++ .../wizard/ui/components/DropDownComponent.kt | 34 ++++--- .../BuildSystemTypeSettingComponent.kt | 6 +- .../ui/setting/DefaultSettingComponent.kt | 13 +-- .../tools/projectWizard/wizard/YamlWizard.kt | 14 ++- .../cli/AbstractBuildFileGenerationTest.kt | 4 +- .../tools/projectWizard/core/Context.kt | 1 - .../projectWizard/core/TaskRunningContext.kt | 10 +- .../core/ValuesReadingContext.kt | 14 ++- .../projectWizard/core/entity/Setting.kt | 2 +- ...roidService.kt => AndroidWizardService.kt} | 4 +- .../BuildSystemAvailabilityWizardService.kt | 16 ++++ .../core/service/BuildSystemService.kt | 12 --- .../core/service/BuildSystemWizardService.kt | 7 ++ ...mService.kt => FileSystemWizardService.kt} | 11 +-- .../core/service/GradleService.kt | 14 --- .../projectWizard/core/service/JpsService.kt | 14 --- .../core/service/MavenService.kt | 14 --- .../service/ProjectImportingWizardService.kt | 16 ++++ .../projectWizard/core/service/Service.kt | 13 --- .../core/service/ServicesManager.kt | 20 ++++ .../core/service/WizardService.kt | 15 +++ ...AndroidSinglePlatformModuleConfigurator.kt | 5 +- .../projectWizard/plugins/StructurePlugin.kt | 4 +- .../plugins/buildSystem/BuildSystemPlugin.kt | 20 ++-- .../plugins/buildSystem/JpsPlugin.kt | 2 - .../plugins/buildSystem/MavenPlugin.kt | 2 - .../buildSystem/gradle/GroovyDslPlugin.kt | 6 -- .../buildSystem/gradle/KotlinDslPlugin.kt | 4 - .../plugins/kotlin/KotlinPlugin.kt | 9 +- .../tools/projectWizard/templates/Template.kt | 5 +- .../projectWizard/templates/TemplateEngine.kt | 4 +- .../tools/projectWizard/wizard/Wizard.kt | 11 ++- 41 files changed, 361 insertions(+), 279 deletions(-) delete mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ideaServices.kt create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaBuildSystemAvailabilityWizardService.kt create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaFileSystemWizardService.kt create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt rename idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/{IdeaJpsService.kt => service/IdeaJpsWizardService.kt} (87%) create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaMavenWizardService.kt create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt rename libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/{AndroidService.kt => AndroidWizardService.kt} (63%) create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt delete mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemService.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemWizardService.kt rename libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/{FileSystemService.kt => FileSystemWizardService.kt} (68%) delete mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/GradleService.kt delete mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/JpsService.kt delete mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/MavenService.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ProjectImportingWizardService.kt delete mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/Service.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ServicesManager.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt index 1559ce4c266..5e4e0570313 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt @@ -4,16 +4,24 @@ import org.jetbrains.kotlin.tools.projectWizard.core.PluginsCreator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference -import org.jetbrains.kotlin.tools.projectWizard.core.service.Service +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin +import org.jetbrains.kotlin.tools.projectWizard.wizard.service.IdeaWizardService import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty class IdeWizard( createPlugins: PluginsCreator, - initialServices: List -) : Wizard(createPlugins, initialServices) { + initialServices: List +) : Wizard( + createPlugins, + ServicesManager(initialServices) { services -> + services.firstOrNull { it is IdeaWizardService } + ?: services.firstOrNull() + } +) { private val allSettings = plugins.flatMap { it.declaredSettings } init { diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt index d76e2a529c8..7fe74c1bf09 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin +import org.jetbrains.kotlin.tools.projectWizard.wizard.service.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.PomWizardStepComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep.FirstWizardStepComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.SecondStepWizardComponent @@ -34,7 +35,7 @@ import com.intellij.openapi.module.Module as IdeaModule class NewProjectWizardModuleBuilder : ModuleBuilder() { - private val wizard = IdeWizard(Plugins.allPlugins, listOf(IdeaAndroidService())) + private val wizard = IdeWizard(Plugins.allPlugins, IdeaServices.PROJECT_INDEPENDENT) companion object { const val MODULE_BUILDER_ID = "kotlin.newProjectWizard.builder" @@ -62,13 +63,8 @@ class NewProjectWizardModuleBuilder : ModuleBuilder() { ): List? { val modulesModel = model ?: ModuleManager.getInstance(project).modifiableModel val success = wizard.apply( - services = listOf( - IdeaMavenService(project), - IdeaGradleService(project), - IdeaJpsService(project, modulesModel), - IdeaFileSystemService(), - IdeaAndroidService() - ), + services = IdeaServices.createScopeDependent(project, modulesModel) + + IdeaServices.PROJECT_INDEPENDENT, phases = GenerationPhase.startingFrom(GenerationPhase.FIRST_STEP) ).onFailure { errors -> val errorMessages = errors.joinToString(separator = "\n") { it.message } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ideaServices.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ideaServices.kt deleted file mode 100644 index fe5ef2823a9..00000000000 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ideaServices.kt +++ /dev/null @@ -1,91 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.wizard - -import com.intellij.openapi.actionSystem.ActionPlaces -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.actionSystem.impl.SimpleDataContext -import com.intellij.openapi.project.Project -import com.intellij.openapi.vfs.LocalFileSystem -import com.intellij.openapi.vfs.VfsUtil -import com.intellij.openapi.vfs.VirtualFile -import org.jetbrains.android.sdk.AndroidSdkData -import org.jetbrains.idea.maven.project.MavenProjectsManager -import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult -import org.jetbrains.kotlin.tools.projectWizard.core.safe -import org.jetbrains.kotlin.tools.projectWizard.core.service.* -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR -import org.jetbrains.plugins.gradle.action.ImportProjectFromScriptAction -import java.nio.file.Path - -class IdeaFileSystemService : FileSystemService { - override fun createDirectory(path: Path): TaskResult = safe { - runWriteAction { - VfsUtil.createDirectoryIfMissing(path.toString()) - } - } - - override fun createFile(path: Path, text: String): TaskResult = safe { - runWriteAction { - val directoryPath = path.parent - val directory = VfsUtil.createDirectoryIfMissing(directoryPath.toFile().toString())!! - val virtualFile = directory.createChildData(this, path.fileName.toString()) - VfsUtil.saveText(virtualFile, text) - } - } -} - -class IdeaGradleService(private val project: Project) : GradleService { - - // We have to call action directly as there is no common way - // to import Gradle project in all IDEAs from 183 to 193 - override fun importProject( - path: Path, - modulesIrs: List - ): TaskResult = safe { - val virtualFile = LocalFileSystem.getInstance().findFileByPath(path.toString())!! - val dataContext = SimpleDataContext.getSimpleContext( - mapOf( - CommonDataKeys.PROJECT.name to project, - CommonDataKeys.VIRTUAL_FILE.name to virtualFile - ), - null - ) - val action = ImportProjectFromScriptAction() - val event = AnActionEvent.createFromAnAction(action, null, ActionPlaces.UNKNOWN, dataContext) - action.actionPerformed(event) - } -} - -class IdeaMavenService(private val project: Project) : MavenService { - override fun importProject( - path: Path, - modulesIrs: List - ): TaskResult = safe { - val mavenProjectManager = MavenProjectsManager.getInstance(project) - - val rootFile = LocalFileSystem.getInstance().findFileByPath(path.toString())!! - mavenProjectManager.addManagedFilesOrUnignore(rootFile.findAllPomFiles()) - } - - private fun VirtualFile.findAllPomFiles(): List { - val result = mutableListOf() - - fun VirtualFile.find() { - when { - !isDirectory && name == "pom.xml" -> result += this - isDirectory -> children.forEach(VirtualFile::find) - } - } - - find() - return result - } -} - -class IdeaAndroidService : AndroidService { - override fun isValidAndroidSdk(path: Path): Boolean = - //todo use android plugin for that? - AndroidServiceImpl().isValidAndroidSdk(path) -} - diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaBuildSystemAvailabilityWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaBuildSystemAvailabilityWizardService.kt new file mode 100644 index 00000000000..2971cd4564d --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaBuildSystemAvailabilityWizardService.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service + +import com.intellij.ide.plugins.PluginManagerCore +import org.jetbrains.kotlin.tools.projectWizard.core.service.BuildSystemAvailabilityWizardService +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle + +class IdeaBuildSystemAvailabilityWizardService : BuildSystemAvailabilityWizardService, IdeaWizardService { + override fun isAvailable(buildSystemType: BuildSystemType): Boolean = when { + buildSystemType.isGradle -> !PluginManagerCore.isDisabled("org.jetbrains.plugins.gradle") + buildSystemType == BuildSystemType.Maven -> !PluginManagerCore.isDisabled("org.jetbrains.idea.maven") + else -> true + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaFileSystemWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaFileSystemWizardService.kt new file mode 100644 index 00000000000..53c7845b50f --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaFileSystemWizardService.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service + +import com.intellij.openapi.vfs.VfsUtil +import org.jetbrains.kotlin.idea.util.application.runWriteAction +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.safe +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService +import java.nio.file.Path + +class IdeaFileSystemWizardService : FileSystemWizardService, IdeaWizardService { + override fun createDirectory(path: Path): TaskResult = safe { + runWriteAction { + VfsUtil.createDirectoryIfMissing(path.toString()) + } + } + + override fun createFile(path: Path, text: String): TaskResult = safe { + runWriteAction { + val directoryPath = path.parent + val directory = + VfsUtil.createDirectoryIfMissing(directoryPath.toFile().toString())!! + val virtualFile = directory.createChildData(this, path.fileName.toString()) + VfsUtil.saveText(virtualFile, text) + } + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt new file mode 100644 index 00000000000..0ff0fa68361 --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service + +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.actionSystem.impl.SimpleDataContext +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.LocalFileSystem +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.safe +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle +import org.jetbrains.plugins.gradle.action.ImportProjectFromScriptAction +import java.nio.file.Path + +class IdeaGradleWizardService(private val project: Project) : ProjectImportingWizardService, + IdeaWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType.isGradle + + // We have to call action directly as there is no common way + // to import Gradle project in all IDEAs from 183 to 193 + override fun importProject( + path: Path, + modulesIrs: List + ): TaskResult = safe { + val virtualFile = LocalFileSystem.getInstance().findFileByPath(path.toString())!! + val dataContext = SimpleDataContext.getSimpleContext( + mapOf( + CommonDataKeys.PROJECT.name to project, + CommonDataKeys.VIRTUAL_FILE.name to virtualFile + ), + null + ) + val action = ImportProjectFromScriptAction() + val event = AnActionEvent.createFromAnAction( + action, + null, + ActionPlaces.UNKNOWN, + dataContext + ) + action.actionPerformed(event) + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeaJpsService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt similarity index 87% rename from idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeaJpsService.kt rename to idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt index 0d47649c550..cab709ad7e9 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeaJpsService.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt @@ -1,4 +1,9 @@ -package org.jetbrains.kotlin.tools.projectWizard.wizard +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix import com.intellij.jarRepository.JarRepositoryManager @@ -9,7 +14,6 @@ import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.OrderRootType -import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.util.PathUtil import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties @@ -19,19 +23,24 @@ import org.jetbrains.kotlin.config.TestResourceKotlinRootType import org.jetbrains.kotlin.config.TestSourceKotlinRootType import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.tools.projectWizard.core.* -import org.jetbrains.kotlin.tools.projectWizard.core.service.JpsService +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import java.nio.file.Path import com.intellij.openapi.module.Module as IdeaModule -class IdeaJpsService( +class IdeaJpsWizardService( private val project: Project, private val modulesModel: ModifiableModuleModel -) : JpsService { +) : ProjectImportingWizardService, IdeaWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType == BuildSystemType.Jps + override fun importProject(path: Path, modulesIrs: List): TaskResult = runWriteAction { - ProjectImporter(project, modulesModel, path, modulesIrs).import() + ProjectImporter(project, modulesModel, path, modulesIrs) + .import() } } @@ -47,7 +56,6 @@ private class ProjectImporter( fun import() = modulesIrs.mapSequence { convertModule(it) } andThen safe { modulesModel.commit() } - private fun convertModule(moduleIr: ModuleIR): TaskResult { val module = modulesModel.newModule( (moduleIr.path / "${moduleIr.name}.iml").toString(), diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaMavenWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaMavenWizardService.kt new file mode 100644 index 00000000000..db06ae831ee --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaMavenWizardService.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service + +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.idea.maven.project.MavenProjectsManager +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.safe +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import java.nio.file.Path + +class IdeaMavenWizardService(private val project: Project) : ProjectImportingWizardService, + IdeaWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType == BuildSystemType.Maven + + override fun importProject( + path: Path, + modulesIrs: List + ): TaskResult = safe { + val mavenProjectManager = MavenProjectsManager.getInstance(project) + + val rootFile = LocalFileSystem.getInstance().findFileByPath(path.toString())!! + mavenProjectManager.addManagedFilesOrUnignore(rootFile.findAllPomFiles()) + } + + private fun VirtualFile.findAllPomFiles(): List { + val result = mutableListOf() + + fun VirtualFile.find() { + when { + !isDirectory && name == "pom.xml" -> result += this + isDirectory -> children.forEach(VirtualFile::find) + } + } + + find() + return result + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt new file mode 100644 index 00000000000..627470273b2 --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service + +import com.intellij.openapi.module.ModifiableModuleModel +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService + +interface IdeaWizardService : WizardService + +object IdeaServices { + val PROJECT_INDEPENDENT: List = listOf( + IdeaFileSystemWizardService(), + IdeaBuildSystemAvailabilityWizardService() + ) + + fun createScopeDependent(project: Project, model: ModifiableModuleModel) = listOf( + IdeaGradleWizardService(project), + IdeaMavenWizardService(project), + IdeaJpsWizardService(project, model) + ) +} + + diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt index e4ef00d7d77..06e9a55806d 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt @@ -22,8 +22,9 @@ import javax.swing.JList class DropDownComponent( private val valuesReadingContext: ValuesReadingContext, - initialValues: List = emptyList(), + private val initialValues: List = emptyList(), labelText: String? = null, + private val filter: (T) -> Boolean = { true }, private val validator: SettingValidator = settingValidator { ValidationResult.OK }, private val iconProvider: (T) -> Icon? = { null }, private val onAnyValueUpdate: (T) -> Unit = {} @@ -42,7 +43,7 @@ class DropDownComponent( } @Suppress("UNCHECKED_CAST") - private val comboBox = ComboBox(initialValues.toTypedArray() as Array).apply { + private val comboBox = ComboBox().apply { renderer = object : ColoredListCellRenderer() { override fun customizeCellRenderer( list: JList, @@ -76,13 +77,23 @@ class DropDownComponent( } } - fun updateValues(newValues: List) = withoutActionFiring { - val oldValue = comboBox.selectedItem - @Suppress("UNCHECKED_CAST") - comboBox.model = DefaultComboBoxModel(newValues.toTypedArray() as Array) + override fun onInit() { + super.onInit() + updateValues(initialValues) + } - if (newValues.isNotEmpty() && oldValue !in newValues) { - value = newValues.first() + fun updateValues(newValues: List) { + val newValuesFiltered = newValues.filter(filter) + val oldValue = comboBox.selectedItem + withoutActionFiring { + @Suppress("UNCHECKED_CAST") + comboBox.model = DefaultComboBoxModel(newValuesFiltered.toTypedArray() as Array) + } + + if (oldValue !in newValuesFiltered) { + newValuesFiltered.firstOrNull()?.let { newValue -> + value = newValuesFiltered.first() + } } } @@ -106,13 +117,6 @@ class DropDownComponent( } } - init { - initialValues.firstOrNull()?.let { first -> - value = first - validate(first) - } - } - fun validate(value: T = this.value) { validationIndicator.validationState = validator.validate(valuesReadingContext, value) } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt index c498df8e2f0..07d94c4969b 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep import com.intellij.icons.AllIcons import icons.GradleIcons import icons.MavenIcons +import icons.OpenapiIcons import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext @@ -18,7 +19,7 @@ import java.awt.BorderLayout class BuildSystemTypeSettingComponent( - valuesReadingContext: ValuesReadingContext + private val valuesReadingContext: ValuesReadingContext ) : SettingComponent>( BuildSystemPlugin::type.reference, valuesReadingContext @@ -28,6 +29,7 @@ class BuildSystemTypeSettingComponent( valuesReadingContext, setting.type.values, labelText = "Build System", + filter = { value -> setting.type.filter(valuesReadingContext, reference, value) }, validator = setting.validator, iconProvider = BuildSystemType::icon, onAnyValueUpdate = { value = it } @@ -51,6 +53,6 @@ private val BuildSystemType.icon get() = when (this) { BuildSystemType.GradleKotlinDsl -> GradleIcons.Gradle BuildSystemType.GradleGroovyDsl -> GradleIcons.Gradle - BuildSystemType.Maven -> MavenIcons.MavenLogo + BuildSystemType.Maven -> OpenapiIcons.RepositoryLibraryLogo BuildSystemType.Jps -> AllIcons.Nodes.Module } \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt index a17437c5894..6af8847c425 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt @@ -100,7 +100,7 @@ class VersionSettingComponent( class DropdownSettingComponent( reference: SettingReference>, - valuesReadingContext: ValuesReadingContext + private val valuesReadingContext: ValuesReadingContext ) : DefaultSettingComponent>( reference, valuesReadingContext @@ -108,22 +108,13 @@ class DropdownSettingComponent( private val dropDownComponent = DropDownComponent( valuesReadingContext, setting.type.values, + filter = { value -> setting.type.filter(valuesReadingContext, reference, value) }, labelText = setting.title, onAnyValueUpdate = { newValue -> value = newValue } ).asSubComponent() - - override fun onInit() { - super.onInit() - val valuesFiltered = setting.type.values.filter { setting.type.filter(reference, it) } - dropDownComponent.updateValues(valuesFiltered) - if (valuesFiltered.isNotEmpty()) { - value = valuesFiltered.first() - } - } - override val validationIndicator: ValidationIndicator? = null override val component: JComponent = dropDownComponent.component } diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt index c33f8b8d2f6..6569ba87498 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt @@ -5,8 +5,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PluginSettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference -import org.jetbrains.kotlin.tools.projectWizard.core.service.AndroidServiceImpl -import org.jetbrains.kotlin.tools.projectWizard.core.service.Service +import org.jetbrains.kotlin.tools.projectWizard.core.service.* import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin @@ -16,9 +15,14 @@ class YamlWizard( private val yaml: String, private val path: String, createPlugins: (Context) -> List -) : Wizard(createPlugins, listOf(AndroidServiceImpl())) { +) : Wizard( + createPlugins, + ServicesManager(Services.IDEA_INDEPENDENT_SERVICES) { services -> + services.firstOrNull { it is IdeaIndependentWizardService } + } +) { override fun apply( - services: List, + services: List, phases: Set, onTaskExecuting: (PipelineTask) -> Unit ): TaskResult = computeM { @@ -38,5 +42,5 @@ class YamlWizard( get() = pluginSettings.mapNotNull { setting -> val defaultValue = setting.defaultValue ?: return@mapNotNull null PluginSettingReference(setting) to defaultValue - } .toMap() + }.toMap() } diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractBuildFileGenerationTest.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractBuildFileGenerationTest.kt index 655b035cade..9f43d89afe5 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractBuildFileGenerationTest.kt +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractBuildFileGenerationTest.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.tools.projectWizard.cli -import com.intellij.testFramework.UsefulTestCase import org.jetbrains.kotlin.tools.projectWizard.core.ExceptionError import org.jetbrains.kotlin.tools.projectWizard.core.div import org.jetbrains.kotlin.tools.projectWizard.core.onFailure @@ -20,7 +19,6 @@ import java.nio.file.Path import java.nio.file.Paths abstract class AbstractBuildFileGenerationTest : AbstractPluginBasedTest() { - fun doTest(directoryPath: String) { val directory = Paths.get(directoryPath) val testData = init(directory) @@ -41,7 +39,7 @@ abstract class AbstractBuildFileGenerationTest : AbstractPluginBasedTest() { buildSystem.yaml val tempDir = Files.createTempDirectory(null) val wizard = YamlWizard(yaml, tempDir.toString(), testData.createPlugins) - val result = wizard.apply(Services.osServices, GenerationPhase.ALL) + val result = wizard.apply(Services.IDEA_INDEPENDENT_SERVICES, GenerationPhase.ALL) result.onFailure { errors -> errors.forEach { error -> if (error is ExceptionError) { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt index 13b2e20dd03..bca3c4873b8 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt @@ -3,7 +3,6 @@ package org.jetbrains.kotlin.tools.projectWizard.core import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import kotlin.reflect.KClass -import kotlin.reflect.KProperty1 import kotlin.reflect.full.isSubclassOf import kotlin.reflect.full.memberProperties diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskRunningContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskRunningContext.kt index 0ffe4ae3cb8..e5ff3ad96b3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskRunningContext.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskRunningContext.kt @@ -3,11 +3,12 @@ package org.jetbrains.kotlin.tools.projectWizard.core import org.jetbrains.kotlin.tools.projectWizard.core.entity.PropertyReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1 import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1Reference -import org.jetbrains.kotlin.tools.projectWizard.core.service.Service -import kotlin.reflect.KClass -import kotlin.reflect.full.isSubclassOf +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager -class TaskRunningContext(context: Context, services: List) : ValuesReadingContext(context, services) { +class TaskRunningContext( + context: Context, + servicesManager: ServicesManager +) : ValuesReadingContext(context, servicesManager) { fun Task1Reference.execute(value: A): TaskResult { @Suppress("UNCHECKED_CAST") val task = context.taskContext.getEntity(this) as Task1 @@ -30,4 +31,3 @@ class TaskRunningContext(context: Context, services: List) : ValuesRead values: List ): TaskResult = update { oldValues -> success(oldValues + values) } } - diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt index eaf87ff538f..7cc5e7603d0 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt @@ -1,19 +1,17 @@ package org.jetbrains.kotlin.tools.projectWizard.core import org.jetbrains.kotlin.tools.projectWizard.core.entity.* -import org.jetbrains.kotlin.tools.projectWizard.core.service.Service +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import kotlin.reflect.KClass import kotlin.reflect.KProperty1 -import kotlin.reflect.full.isSubclassOf -import kotlin.reflect.jvm.jvmName @Suppress("UNCHECKED_CAST") -open class ValuesReadingContext(val context: Context, private val services: List) { - inline fun service() = serviceByClass(S::class) +open class ValuesReadingContext(val context: Context, private val servicesManager: ServicesManager) { + inline fun service(noinline filter: (S) -> Boolean = { true }) = serviceByClass(S::class, filter) - @Suppress("UNCHECKED_CAST") - fun serviceByClass(klass: KClass) = - services.firstOrNull { it::class.isSubclassOf(klass) } as? S ?: error("No service ${klass.jvmName}") + fun serviceByClass(klass: KClass, filter: (S) -> Boolean = { true }) = + servicesManager.serviceByClass(klass, filter) inline val PropertyReference.propertyValue: T get() = context.propertyContext[this] as T diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt index 9346d4fcff2..37dba854e7c 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt @@ -277,7 +277,7 @@ class DropDownSettingType( } } -typealias DropDownSettingTypeFilter = (SettingReference>, V) -> Boolean +typealias DropDownSettingTypeFilter = ValuesReadingContext.(SettingReference>, V) -> Boolean class ValueSettingType( diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/AndroidService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/AndroidWizardService.kt similarity index 63% rename from libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/AndroidService.kt rename to libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/AndroidWizardService.kt index 0b5f75ceaf8..890e8a474c8 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/AndroidService.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/AndroidWizardService.kt @@ -2,11 +2,11 @@ package org.jetbrains.kotlin.tools.projectWizard.core.service import java.nio.file.Path -interface AndroidService : Service { +interface AndroidWizardService : WizardService { fun isValidAndroidSdk(path: Path): Boolean } -class AndroidServiceImpl : AndroidService { +class AndroidWizardServiceImpl : AndroidWizardService, IdeaIndependentWizardService { //TODO use some heuristics override fun isValidAndroidSdk(path: Path): Boolean = true } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt new file mode 100644 index 00000000000..c6813857dac --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.core.service + +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType + +interface BuildSystemAvailabilityWizardService : WizardService { + fun isAvailable(buildSystemType: BuildSystemType): Boolean +} + +class BuildSystemAvailabilityWizardServiceImpl : BuildSystemAvailabilityWizardService, IdeaIndependentWizardService { + override fun isAvailable(buildSystemType: BuildSystemType) = true +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemService.kt deleted file mode 100644 index 0ed7f6ca9e8..00000000000 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemService.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.core.service - -import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR -import java.nio.file.Path - -interface BuildSystemService : Service { - fun importProject( - path: Path, - modulesIrs: List - ): TaskResult -} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemWizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemWizardService.kt new file mode 100644 index 00000000000..9d3a1eb5751 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemWizardService.kt @@ -0,0 +1,7 @@ +package org.jetbrains.kotlin.tools.projectWizard.core.service + +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType + +interface BuildSystemWizardService : WizardService { + fun isSuitableFor(buildSystemType: BuildSystemType): Boolean +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/FileSystemService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/FileSystemWizardService.kt similarity index 68% rename from libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/FileSystemService.kt rename to libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/FileSystemWizardService.kt index a73142a4e6d..1d30d1ca132 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/FileSystemService.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/FileSystemWizardService.kt @@ -1,29 +1,22 @@ package org.jetbrains.kotlin.tools.projectWizard.core.service import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult -import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.computeM import org.jetbrains.kotlin.tools.projectWizard.core.safe import java.nio.file.Files import java.nio.file.Path -interface FileSystemService : Service { +interface FileSystemWizardService : WizardService { fun createFile(path: Path, text: String): TaskResult fun createDirectory(path: Path): TaskResult - - object DUMMY : FileSystemService { - override fun createFile(path: Path, text: String): TaskResult = UNIT_SUCCESS - override fun createDirectory(path: Path): TaskResult = UNIT_SUCCESS - } } -class OsFileSystemService : FileSystemService { +class OsFileSystemWizardService : FileSystemWizardService, IdeaIndependentWizardService { override fun createFile(path: Path, text: String) = computeM { createDirectory(path.parent).ensure() safe { Files.createFile(path.normalize()).toFile().writeText(text) } } - override fun createDirectory(path: Path) = safe { @Suppress("NAME_SHADOWING") val path = path.normalize() if (Files.notExists(path)) { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/GradleService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/GradleService.kt deleted file mode 100644 index 6856d156490..00000000000 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/GradleService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.core.service - -import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR -import java.nio.file.Path - -interface GradleService : BuildSystemService - -class OsGradleIntegration : GradleService { - override fun importProject( - path: Path, - modulesIrs: List - ) = UNIT_SUCCESS -} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/JpsService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/JpsService.kt deleted file mode 100644 index f124879c393..00000000000 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/JpsService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.core.service - -import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR -import java.nio.file.Path - -interface JpsService : BuildSystemService - -class OsJpsService : JpsService { - override fun importProject( - path: Path, - modulesIrs: List - ) = UNIT_SUCCESS -} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/MavenService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/MavenService.kt deleted file mode 100644 index 18b01a4fc6a..00000000000 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/MavenService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.core.service - -import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR -import java.nio.file.Path - -interface MavenService : BuildSystemService - -class OsMavenService : MavenService { - override fun importProject( - path: Path, - modulesIrs: List - ) = UNIT_SUCCESS -} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ProjectImportingWizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ProjectImportingWizardService.kt new file mode 100644 index 00000000000..15cf8d3a388 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ProjectImportingWizardService.kt @@ -0,0 +1,16 @@ +package org.jetbrains.kotlin.tools.projectWizard.core.service + +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import java.nio.file.Path + +interface ProjectImportingWizardService : BuildSystemWizardService { + fun importProject(path: Path, modulesIrs: List): TaskResult +} + +class ProjectImportingWizardServiceImpl : ProjectImportingWizardService, IdeaIndependentWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = true + override fun importProject(path: Path, modulesIrs: List) = UNIT_SUCCESS +} diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/Service.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/Service.kt deleted file mode 100644 index 77e8ddaa946..00000000000 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/Service.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.core.service - -interface Service - -object Services { - val osServices = listOf( - OsGradleIntegration(), - OsMavenService(), - OsFileSystemService(), - OsJpsService(), - AndroidServiceImpl() - ) -} diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ServicesManager.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ServicesManager.kt new file mode 100644 index 00000000000..3ea94f1a207 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/ServicesManager.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.core.service + +import kotlin.reflect.KClass +import kotlin.reflect.full.isSubclassOf + +class ServicesManager(private val services: List, private val serviceSelector: (List) -> WizardService?) { + @Suppress("UNCHECKED_CAST") + fun serviceByClass(klass: KClass, filter: (S) -> Boolean): S? = + services.filter { service -> + service::class.isSubclassOf(klass) && filter(service as S) + }.let(serviceSelector) as? S + + fun withServices(services: List) = + ServicesManager(this.services + services, serviceSelector) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt new file mode 100644 index 00000000000..817724511ff --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt @@ -0,0 +1,15 @@ +package org.jetbrains.kotlin.tools.projectWizard.core.service + +interface WizardService + +interface IdeaIndependentWizardService : WizardService + +object Services { + val IDEA_INDEPENDENT_SERVICES: List = listOf( + ProjectImportingWizardServiceImpl(), + OsFileSystemWizardService(), + AndroidWizardServiceImpl(), + BuildSystemAvailabilityWizardServiceImpl() + ) +} + diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt index a5977663f3c..cd19af3d7ff 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt @@ -3,7 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult -import org.jetbrains.kotlin.tools.projectWizard.core.service.AndroidService +import org.jetbrains.kotlin.tools.projectWizard.core.service.AndroidWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.AndroidConfigIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptDependencyIR @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.GradlePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType -import org.jetbrains.kotlin.tools.projectWizard.plugins.pomIR import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin import org.jetbrains.kotlin.tools.projectWizard.settings.JavaPackage import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository @@ -38,7 +37,7 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings( validate { path -> ValidationResult.create( - service().isValidAndroidSdk( + service()!!.isValidAndroidSdk( path ), "Path should point to valid Android SDK location" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt index 9849f9f4dd2..e78d36147b8 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt @@ -5,7 +5,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.pathParser -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemService +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.PomIR import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version @@ -31,7 +31,7 @@ class StructurePlugin(context: Context) : Plugin(context) { val createProjectDir by pipelineTask(GenerationPhase.PROJECT_GENERATION) { withAction { - service().createDirectory(StructurePlugin::projectPath.reference.settingValue) + service()!!.createDirectory(StructurePlugin::projectPath.reference.settingValue) } } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt index b15c7cc9e2e..8d62d31d362 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt @@ -3,8 +3,9 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference -import org.jetbrains.kotlin.tools.projectWizard.core.service.BuildSystemService -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemService +import org.jetbrains.kotlin.tools.projectWizard.core.service.BuildSystemAvailabilityWizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.MultiplatformModulesStructureIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render @@ -16,13 +17,17 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.printBuildFile import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem -import kotlin.reflect.KClass abstract class BuildSystemPlugin(context: Context) : Plugin(context) { val type by enumSetting("Build System", GenerationPhase.FIRST_STEP) { + filter = { _, type -> + val service = service()!! + service.isAvailable(type) + } + validate { buildSystemType -> if (!buildSystemType.isGradle - && KotlinPlugin::projectKind.settingValue() == ProjectKind.Multiplatform + && KotlinPlugin::projectKind.reference.notRequiredSettingValue == ProjectKind.Multiplatform ) { ValidationResult.ValidationError("Multiplatform project cannot be generated using ${buildSystemType.text}") } else ValidationResult.OK @@ -36,7 +41,7 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { val createModules by pipelineTask(GenerationPhase.PROJECT_GENERATION) { runAfter(StructurePlugin::createProjectDir) withAction { - val fileSystem = service() + val fileSystem = service()!! val data = BuildSystemPlugin::buildSystemData.propertyValue.first { it.type == buildSystemType } val buildFileData = data.buildFileData ?: return@withAction UNIT_SUCCESS BuildSystemPlugin::buildFiles.propertyValue.mapSequenceIgnore { buildFile -> @@ -52,7 +57,7 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { runAfter(BuildSystemPlugin::createModules) withAction { val data = BuildSystemPlugin::buildSystemData.propertyValue.first { it.type == buildSystemType } - serviceByClass(data.buildSystemServiceClass) + service { service -> service.isSuitableFor(data.type) }!! .importProject(StructurePlugin::projectPath.reference.settingValue, allModules) } } @@ -61,14 +66,13 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { runBefore(BuildSystemPlugin::createModules) activityChecker = Checker.ALWAYS_AVAILABLE withAction { - BuildSystemPlugin::buildSystemData.update { Success(it + data) } + BuildSystemPlugin::buildSystemData.addValues(data) } } } data class BuildSystemData( val type: BuildSystemType, - val buildSystemServiceClass: KClass, val buildFileData: BuildFileData? ) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt index 8ecd2140dce..4881f7356ff 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt @@ -1,7 +1,6 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem import org.jetbrains.kotlin.tools.projectWizard.core.Context -import org.jetbrains.kotlin.tools.projectWizard.core.service.JpsService class JpsPlugin(context: Context) : BuildSystemPlugin(context) { override val title: String = "IDEA" @@ -9,7 +8,6 @@ class JpsPlugin(context: Context) : BuildSystemPlugin(context) { val addBuildSystemData by addBuildSystemData( BuildSystemData( type = BuildSystemType.Jps, - buildSystemServiceClass = JpsService::class, buildFileData = null ) ) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt index 9047aa0be85..2549aed07b2 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt @@ -4,7 +4,6 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Context import org.jetbrains.kotlin.tools.projectWizard.core.asSuccess import org.jetbrains.kotlin.tools.projectWizard.core.checker import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference -import org.jetbrains.kotlin.tools.projectWizard.core.service.MavenService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RootFileModuleStructureIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.ModulesDependencyMavenIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs @@ -42,7 +41,6 @@ class MavenPlugin(context: Context) : BuildSystemPlugin(context) { val addBuildSystemData by addBuildSystemData( BuildSystemData( type = BuildSystemType.Maven, - buildSystemServiceClass = MavenService::class, buildFileData = BuildFileData( createPrinter = { MavenPrinter() }, buildFileName = "pom.xml" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt index ecc31067db4..214136a007d 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt @@ -1,15 +1,10 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle import org.jetbrains.kotlin.tools.projectWizard.core.Context -import org.jetbrains.kotlin.tools.projectWizard.core.checker -import org.jetbrains.kotlin.tools.projectWizard.core.service.GradleService -import org.jetbrains.kotlin.tools.projectWizard.core.service.MavenService import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildFileData import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemData -import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter -import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter class GroovyDslPlugin(context: Context) : GradlePlugin(context) { override val title: String = "Gradle (Groovy DSL)" @@ -17,7 +12,6 @@ class GroovyDslPlugin(context: Context) : GradlePlugin(context) { val addBuildSystemData by addBuildSystemData( BuildSystemData( type = BuildSystemType.GradleGroovyDsl, - buildSystemServiceClass = GradleService::class, buildFileData = BuildFileData( createPrinter = { GradlePrinter(GradlePrinter.GradleDsl.GROOVY) }, buildFileName = "build.gradle" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt index 714c963be39..20cfe8b1d33 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt @@ -1,11 +1,8 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle import org.jetbrains.kotlin.tools.projectWizard.core.Context -import org.jetbrains.kotlin.tools.projectWizard.core.checker -import org.jetbrains.kotlin.tools.projectWizard.core.service.GradleService import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildFileData import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemData -import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter @@ -15,7 +12,6 @@ class KotlinDslPlugin(context: Context) : GradlePlugin(context) { val addBuildSystemData by addBuildSystemData( BuildSystemData( type = BuildSystemType.GradleKotlinDsl, - buildSystemServiceClass = GradleService::class, buildFileData = BuildFileData( createPrinter = { GradlePrinter(GradlePrinter.GradleDsl.KOTLIN) }, buildFileName = "build.gradle.kts" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt index 6dab264ac0d..b61989355a3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt @@ -2,7 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.* -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemService +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin @@ -82,9 +82,10 @@ class KotlinPlugin(context: Context) : Plugin(context) { val createSourcesetDirectories by pipelineTask(GenerationPhase.PROJECT_GENERATION) { runAfter(KotlinPlugin::createModules) withAction { - fun Path.createKotlinAndResourceDirectories() = - service().createDirectory(this / Defaults.KOTLIN_DIR) andThen - service().createDirectory(this / Defaults.RESOURCES_DIR) + fun Path.createKotlinAndResourceDirectories() = with(service()!!) { + createDirectory(this@createKotlinAndResourceDirectories / Defaults.KOTLIN_DIR) andThen + createDirectory(this@createKotlinAndResourceDirectories / Defaults.RESOURCES_DIR) + } forEachModule { moduleIR -> when (moduleIR) { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt index c12d8eeb0f2..415af1b458a 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt @@ -4,11 +4,10 @@ import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.* -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemService +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.SourcesetIR -import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType @@ -79,7 +78,7 @@ abstract class Template : SettingsOwner { templateEngine: TemplateEngine, sourceset: SourcesetIR ): TaskResult { - val fileSystemService = service() + val fileSystemService = service()!! val allSettings = createDefaultSettings() + settingsAsMap(sourceset.original) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/TemplateEngine.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/TemplateEngine.kt index 695d067b7f0..bc5336e45a0 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/TemplateEngine.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/TemplateEngine.kt @@ -8,7 +8,7 @@ import org.apache.velocity.runtime.log.LogChute import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext import org.jetbrains.kotlin.tools.projectWizard.core.div -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemService +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import java.io.StringWriter @@ -17,7 +17,7 @@ interface TemplateEngine { fun TaskRunningContext.writeTemplate(template: FileTemplate): TaskResult { val text = renderTemplate(template.descriptor, template.data) - return service().createFile(template.rootPath / template.descriptor.relativePath, text) + return service()!!.createFile(template.rootPath / template.descriptor.relativePath, text) } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/Wizard.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/Wizard.kt index c8262bad9c1..6d7774bdb77 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/Wizard.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/Wizard.kt @@ -2,12 +2,13 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.* -import org.jetbrains.kotlin.tools.projectWizard.core.service.Service +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase -abstract class Wizard(createPlugins: PluginsCreator, initialServices: List) { +abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: ServicesManager) { val context = Context(createPlugins, EventManager()) - val valuesReadingContext = ValuesReadingContext(context, initialServices) + val valuesReadingContext = ValuesReadingContext(context, servicesManager) protected val plugins = context.plugins protected val pluginSettings = plugins.flatMap { it.declaredSettings }.distinctBy { it.path } @@ -28,12 +29,12 @@ abstract class Wizard(createPlugins: PluginsCreator, initialServices: List, + services: List, phases: Set, onTaskExecuting: (PipelineTask) -> Unit = {} ): TaskResult = computeM { context.checkAllRequiredSettingPresent(phases).ensure() - val taskRunningContext = TaskRunningContext(context, services) + val taskRunningContext = TaskRunningContext(context, servicesManager.withServices(services)) taskRunningContext.validate(phases).ensure() val (tasksSorted) = context.sortTasks().map { tasks -> tasks.groupBy { it.phase }.toList().sortedBy { it.first }.flatMap { it.second }