diff --git a/build.gradle.kts b/build.gradle.kts index 9250d6795cc..e82331459e1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -670,7 +670,8 @@ tasks { dependsOn("dist") dependsOn( ":libraries:tools:new-project-wizard:test", - ":libraries:tools:new-project-wizard:new-project-wizard-cli:test" + ":libraries:tools:new-project-wizard:new-project-wizard-cli:test", + ":idea:idea-new-project-wizard:test" ) } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 2651a69747e..91ef3e6c614 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -163,10 +163,13 @@ import org.jetbrains.kotlin.search.AbstractAnnotatedMembersSearchTest import org.jetbrains.kotlin.search.AbstractInheritorsSearchTest import org.jetbrains.kotlin.shortenRefs.AbstractShortenRefsTest import org.jetbrains.kotlin.test.TargetBackend -import org.jetbrains.kotlin.tools.projectWizard.cli.AbstractBuildFileGenerationTest +import org.jetbrains.kotlin.tools.projectWizard.cli.AbstractProjectTemplateBuildFileGenerationTest +import org.jetbrains.kotlin.tools.projectWizard.cli.AbstractYamlBuildFileGenerationTest import org.jetbrains.kotlinx.serialization.AbstractSerializationIrBytecodeListingTest import org.jetbrains.kotlinx.serialization.AbstractSerializationPluginBytecodeListingTest import org.jetbrains.kotlinx.serialization.AbstractSerializationPluginDiagnosticTest +import org.jetbrains.kotlin.tools.projectWizard.wizard.AbstractProjectTemplateNewWizardProjectImportTest +import org.jetbrains.kotlin.tools.projectWizard.wizard.AbstractYamlNewWizardProjectImportTest fun main(args: Array) { System.setProperty("java.awt.headless", "true") @@ -1092,9 +1095,35 @@ fun main(args: Array) { "libraries/tools/new-project-wizard/new-project-wizard-cli/tests", "libraries/tools/new-project-wizard/new-project-wizard-cli/testData" ) { - testClass { + testClass { model("buildFileGeneration", recursive = false, extension = null) } + testClass { + model("projectTemplatesBuildFileGeneration", recursive = false, extension = null) + } + } + + testGroup( + "idea/idea-new-project-wizard/tests", + "libraries/tools/new-project-wizard/new-project-wizard-cli/testData" + ) { + fun TestGroup.TestClass.allBuildSystemTests(relativeRootPath: String) { + for (testClass in listOf("GradleKts", "GradleGroovy", "Maven")) { + model( + relativeRootPath, + recursive = false, + extension = null, + testMethod = "doTest${testClass}", + testClassName = testClass + ) + } + } + testClass { + allBuildSystemTests("buildFileGeneration") + } + testClass { + allBuildSystemTests("projectTemplatesBuildFileGeneration") + } } //TODO: move these tests into idea-completion module diff --git a/idea/idea-new-project-wizard/build.gradle.kts b/idea/idea-new-project-wizard/build.gradle.kts index 74bc3106b33..9c89115ecba 100644 --- a/idea/idea-new-project-wizard/build.gradle.kts +++ b/idea/idea-new-project-wizard/build.gradle.kts @@ -14,6 +14,16 @@ dependencies { compileOnly(intellijDep()) compileOnly(intellijPluginDep("gradle")) + testImplementation(projectTests(":idea")) + testImplementation(project(":libraries:tools:new-project-wizard:new-project-wizard-cli")) + testImplementation(projectTests(":libraries:tools:new-project-wizard:new-project-wizard-cli")) + testImplementation(projectTests(":compiler:tests-common")) + testImplementation(project(":kotlin-test:kotlin-test-junit")) + testImplementation(commonDep("junit:junit")) + testImplementation(intellijDep()) + testImplementation(intellijPluginDep("gradle")) + + excludeInAndroidStudio(rootProject) { compileOnly(intellijPluginDep("maven")) } @@ -25,6 +35,7 @@ dependencies { Platform[192].orHigher { compileOnly(intellijPluginDep("java")) { includeJars("java-api", "java-impl") } testCompileOnly(intellijPluginDep("java")) { includeJars("java-api", "java-impl") } + testRuntimeOnly(intellijPluginDep("java")) { includeJars("java-api") } } } @@ -33,6 +44,8 @@ sourceSets { "test" { projectDefault() } } +testsJar() + projectTest { dependsOn(":dist") workingDir = rootDir 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 index cc2695e9500..6da61e64784 100644 --- 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 @@ -34,7 +34,8 @@ class IdeaGradleWizardService(private val project: Project) : ProjectImportingWi // to import Gradle project in all IDEAs from 183 to 193 override fun importProject( path: Path, - modulesIrs: List + modulesIrs: List, + buildSystem: BuildSystemType ): TaskResult = performImport(path) andThen createGradleWrapper(path) private fun performImport(path: Path) = safe { diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt index 5ee12f06ccd..b5cdf49a76c 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt @@ -36,7 +36,11 @@ class IdeaJpsWizardService( override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = buildSystemType == BuildSystemType.Jps - override fun importProject(path: Path, modulesIrs: List): TaskResult = runWriteAction { + override fun importProject( + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ): TaskResult = runWriteAction { ProjectImporter(project, modulesModel, path, modulesIrs) .import() } 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 index b8767ed2ce9..dbc3cbbeb07 100644 --- 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 @@ -20,7 +20,8 @@ class IdeaMavenWizardService(private val project: Project) : ProjectImportingWiz override fun importProject( path: Path, - modulesIrs: List + modulesIrs: List, + buildSystem: BuildSystemType ): TaskResult = safe { MavenProjectImporter(project).importProject(path) } 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 index 0e911ee4bda..44771ba4af4 100644 --- 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 @@ -20,10 +20,10 @@ object IdeaServices { IdeaSettingSavingWizardService() ) - fun createScopeDependent(project: Project, model: ModifiableModuleModel) = listOf( + fun createScopeDependent(project: Project, model: ModifiableModuleModel?) = listOfNotNull( IdeaGradleWizardService(project), IdeaMavenWizardService(project), - IdeaJpsWizardService(project, model), + model?.let { IdeaJpsWizardService(project, it) }, IdeaFileFormattingService(project), IdeaRunConfigurationsService(project) ) diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt index 3adf2ecdf80..70f9aa6e6a2 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt @@ -88,5 +88,5 @@ abstract class UIComponent( fun ReadingContext.valueForSetting( uiComponent: UIComponent, - setting: Setting> + setting: SettingReference> ): V? = setting.savedOrDefaultValue ?: uiComponent.getUiValue() \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt index 54bc66dd0e1..3ca4b9c9ff9 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt @@ -8,6 +8,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.applyProjectTemplate import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext @@ -57,12 +58,8 @@ class TemplatesSubStep(ideContext: IdeContext) : SubStep(ideContext) { private fun applySelectedTemplate() { modify { - projectTemplateSettingComponent.value?.setsValues?.forEach { (setting, value) -> - setting.setValue(value) - } - allModules().forEach { module -> - module.apply { initDefaultValuesForSettings() } - } + val selectedProjectTemplate = projectTemplateSettingComponent.value ?: return@modify + applyProjectTemplate(selectedProjectTemplate) } } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/NewModuleCreator.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/NewModuleCreator.kt index 639ec369140..9189c3db2f4 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/NewModuleCreator.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/NewModuleCreator.kt @@ -62,7 +62,6 @@ class NewModuleCreator { } val createdModule = Module( name, - configurator.moduleKind, configurator, template = null, sourcesets = sourcesets, 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 0b214998844..0d4ef833a3b 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 @@ -66,7 +66,7 @@ class VersionSettingComponent( override fun onInit() { super.onInit() - val values = read { setting.savedOrDefaultValue }?.let(::listOf).orEmpty() + val values = read { reference.savedOrDefaultValue }?.let(::listOf).orEmpty() comboBox.model = DefaultComboBoxModel(values.toTypedArray()) if (values.isNotEmpty()) { diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt index 82e151bc38c..ee177298a7b 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt @@ -24,7 +24,7 @@ abstract class UIComponentDelegatingSettingComponent override fun onInit() { super.onInit() if (value == null) { - read { valueForSetting(uiComponent, setting) }?.let { value = it } + read { valueForSetting(uiComponent, reference) }?.let { value = it } } value?.let(uiComponent::updateUiValue) } diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractNewWizardProjectImportTest.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractNewWizardProjectImportTest.kt new file mode 100644 index 00000000000..81f1f72e7ca --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractNewWizardProjectImportTest.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2010-2020 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 + +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.projectRoots.ProjectJdkTable +import com.intellij.openapi.projectRoots.SimpleJavaSdkType +import com.intellij.testFramework.IdeaTestUtil +import com.intellij.testFramework.PlatformTestCase +import org.jetbrains.kotlin.test.testFramework.runWriteAction +import org.jetbrains.kotlin.tools.projectWizard.cli.* +import org.jetbrains.kotlin.tools.projectWizard.core.service.Services +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.wizard.service.IdeaServices +import org.jetbrains.kotlin.tools.projectWizard.wizard.service.IdeaWizardService +import org.jetbrains.kotlin.tools.projectWizard.wizard.services.TestWizardServices +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull +import org.jetbrains.plugins.gradle.settings.DistributionType +import org.jetbrains.plugins.gradle.settings.GradleProjectSettings +import org.jetbrains.plugins.gradle.settings.GradleSettings +import org.jetbrains.plugins.gradle.util.GradleConstants +import org.jetbrains.plugins.gradle.util.GradleEnvironment +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths + +//TODO change to HeavyPlatformTestCase when we stop supporting <= 192 +abstract class AbstractNewWizardProjectImportTest : PlatformTestCase() { + abstract fun createWizard(directory: Path, buildSystem: BuildSystem, projectDirectory: Path): Wizard + override fun setUp() { + super.setUp() + runWriteAction { + val sdk = SimpleJavaSdkType().createJdk(SDK_NAME, IdeaTestUtil.requireRealJdkHome()) + ProjectJdkTable.getInstance().addJdk(sdk, project) + } + } + + override fun tearDown() { + super.tearDown() + runWriteAction { + ProjectJdkTable.getInstance().findJdk(SDK_NAME)?.let(ProjectJdkTable.getInstance()::removeJdk) + } + } + + fun doTestGradleKts(directoryPath: String) { + doTest(directoryPath, BuildSystem.GRADLE_KOTLIN_DSL) + } + + fun doTestGradleGroovy(directoryPath: String) { + doTest(directoryPath, BuildSystem.GRADLE_GROOVY_DSL) + } + + fun doTestMaven(directoryPath: String) { + doTest(directoryPath, BuildSystem.MAVEN) + } + + private fun doTest(directoryPath: String, buildSystem: BuildSystem) { + val directory = Paths.get(directoryPath) + + val parameters = ProjectImportingTestParameters.fromTestDataOrDefault(directory) + if (!parameters.runForMaven && buildSystem == BuildSystem.MAVEN) return + + val tempDirectory = Files.createTempDirectory(null) + if (buildSystem.isGradle) { + prepareGradleBuildSystem(tempDirectory) + } + + val wizard = createWizard(directory, buildSystem, tempDirectory) + + val projectDependentServices = + IdeaServices.createScopeDependent(project, null) + + TestWizardServices.createProjectDependent(project) + + TestWizardServices.PROJECT_INDEPENDENT + wizard.apply(projectDependentServices, GenerationPhase.ALL).assertSuccess() + } + + private fun prepareGradleBuildSystem(directory: Path) { + project.getService(GradleSettings::class.java)?.apply { + gradleVmOptions = GradleEnvironment.Headless.GRADLE_VM_OPTIONS ?: gradleVmOptions + isOfflineWork = GradleEnvironment.Headless.GRADLE_OFFLINE?.toBoolean() ?: isOfflineWork + serviceDirectoryPath = GradleEnvironment.Headless.GRADLE_SERVICE_DIRECTORY ?: serviceDirectoryPath + storeProjectFilesExternally = true + } + + val settings = GradleProjectSettings().apply { + externalProjectPath = directory.toString() + isUseAutoImport = false + isUseQualifiedModuleNames = true + gradleJvm = SDK_NAME + distributionType = DistributionType.WRAPPED + } + ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID).linkProject(settings) + } + + companion object { + private const val SDK_NAME = "defaultSdk" + + val IDE_WIZARD_TEST_SERVICES_MANAGER = ServicesManager( + IdeaServices.PROJECT_INDEPENDENT + Services.IDEA_INDEPENDENT_SERVICES + ) { services -> + services.firstIsInstanceOrNull() + ?: services.firstIsInstanceOrNull() + ?: services.firstOrNull() + } + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractProjectTemplateNewWizardProjectImportTest.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractProjectTemplateNewWizardProjectImportTest.kt new file mode 100644 index 00000000000..3cf791ac4b6 --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractProjectTemplateNewWizardProjectImportTest.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2020 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 + +import org.jetbrains.kotlin.tools.projectWizard.cli.BuildSystem +import org.jetbrains.kotlin.tools.projectWizard.cli.ProjectTemplateBasedTestWizard +import org.jetbrains.kotlin.tools.projectWizard.cli.readSettingsYaml +import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins +import java.nio.file.Path + +abstract class AbstractProjectTemplateNewWizardProjectImportTest : AbstractNewWizardProjectImportTest() { + override fun createWizard(directory: Path, buildSystem: BuildSystem, projectDirectory: Path): Wizard = + ProjectTemplateBasedTestWizard.createByDirectory(directory, buildSystem, projectDirectory, IDE_WIZARD_TEST_SERVICES_MANAGER) +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractYamlNewWizardProjectImportTest.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractYamlNewWizardProjectImportTest.kt new file mode 100644 index 00000000000..9bd11ce90cc --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/AbstractYamlNewWizardProjectImportTest.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2020 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 + +import org.jetbrains.kotlin.tools.projectWizard.cli.BuildSystem +import org.jetbrains.kotlin.tools.projectWizard.cli.readSettingsYaml +import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins +import java.nio.file.Path + +abstract class AbstractYamlNewWizardProjectImportTest : AbstractNewWizardProjectImportTest() { + override fun createWizard(directory: Path, buildSystem: BuildSystem, projectDirectory: Path): Wizard { + val yaml = readSettingsYaml(directory, buildSystem) ?: error("settings.yaml does not exists in $directory") + return YamlWizard( + yaml = yaml, + projectPath = projectDirectory, + createPlugins = Plugins.allPlugins, + servicesManager = IDE_WIZARD_TEST_SERVICES_MANAGER, + isUnitTestMode = true + ) + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectImportingTestParameters.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectImportingTestParameters.kt new file mode 100644 index 00000000000..93606a28774 --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectImportingTestParameters.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2020 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 + +import org.jetbrains.kotlin.tools.projectWizard.cli.TestParameters +import java.nio.file.Path + +data class ProjectImportingTestParameters(val runForMaven: Boolean = false) : TestParameters { + companion object { + fun fromTestDataOrDefault(directory: Path): ProjectImportingTestParameters = + TestParameters.fromTestDataOrDefault(directory, PARAMETERS_FILE_NAME) + + private const val PARAMETERS_FILE_NAME = "importParameters.txt" + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java new file mode 100644 index 00000000000..615b60788e4 --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java @@ -0,0 +1,179 @@ +/* + * Copyright 2010-2020 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; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@RunWith(JUnit3RunnerWithInners.class) +public class ProjectTemplateNewWizardProjectImportTestGenerated extends AbstractProjectTemplateNewWizardProjectImportTest { + @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class GradleKts extends AbstractProjectTemplateNewWizardProjectImportTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestGradleKts, this, testDataFilePath); + } + + public void testAllFilesPresentInGradleKts() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("androidApplication") + public void testAndroidApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/"); + } + + @TestMetadata("emptyMultiplatform") + public void testEmptyMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/"); + } + + @TestMetadata("emptySingleplatform") + public void testEmptySingleplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/"); + } + + @TestMetadata("jsBrowserApplication") + public void testJsBrowserApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/"); + } + + @TestMetadata("jvmConsoleApplication") + public void testJvmConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/"); + } + + @TestMetadata("jvmServerJsClient") + public void testJvmServerJsClient() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/"); + } + + @TestMetadata("multiplatformLibrary") + public void testMultiplatformLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); + } + + @TestMetadata("nativeConsoleApplication") + public void testNativeConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); + } + } + + @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class GradleGroovy extends AbstractProjectTemplateNewWizardProjectImportTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestGradleGroovy, this, testDataFilePath); + } + + public void testAllFilesPresentInGradleGroovy() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("androidApplication") + public void testAndroidApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/"); + } + + @TestMetadata("emptyMultiplatform") + public void testEmptyMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/"); + } + + @TestMetadata("emptySingleplatform") + public void testEmptySingleplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/"); + } + + @TestMetadata("jsBrowserApplication") + public void testJsBrowserApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/"); + } + + @TestMetadata("jvmConsoleApplication") + public void testJvmConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/"); + } + + @TestMetadata("jvmServerJsClient") + public void testJvmServerJsClient() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/"); + } + + @TestMetadata("multiplatformLibrary") + public void testMultiplatformLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); + } + + @TestMetadata("nativeConsoleApplication") + public void testNativeConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); + } + } + + @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Maven extends AbstractProjectTemplateNewWizardProjectImportTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestMaven, this, testDataFilePath); + } + + public void testAllFilesPresentInMaven() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("androidApplication") + public void testAndroidApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/"); + } + + @TestMetadata("emptyMultiplatform") + public void testEmptyMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/"); + } + + @TestMetadata("emptySingleplatform") + public void testEmptySingleplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/"); + } + + @TestMetadata("jsBrowserApplication") + public void testJsBrowserApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/"); + } + + @TestMetadata("jvmConsoleApplication") + public void testJvmConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/"); + } + + @TestMetadata("jvmServerJsClient") + public void testJvmServerJsClient() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/"); + } + + @TestMetadata("multiplatformLibrary") + public void testMultiplatformLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); + } + + @TestMetadata("nativeConsoleApplication") + public void testNativeConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); + } + } +} diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlNewWizardProjectImportTestGenerated.java b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlNewWizardProjectImportTestGenerated.java new file mode 100644 index 00000000000..4c4a1dbb5df --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlNewWizardProjectImportTestGenerated.java @@ -0,0 +1,179 @@ +/* + * Copyright 2010-2020 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; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@RunWith(JUnit3RunnerWithInners.class) +public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWizardProjectImportTest { + @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class GradleKts extends AbstractYamlNewWizardProjectImportTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestGradleKts, this, testDataFilePath); + } + + public void testAllFilesPresentInGradleKts() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("android") + public void testAndroid() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/"); + } + + @TestMetadata("jsNodeAndBrowserTargets") + public void testJsNodeAndBrowserTargets() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/"); + } + + @TestMetadata("jvmTarget") + public void testJvmTarget() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); + } + + @TestMetadata("kotlinJvm") + public void testKotlinJvm() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); + } + + @TestMetadata("nativeForCurrentSystem") + public void testNativeForCurrentSystem() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/"); + } + + @TestMetadata("simpleMultiplatform") + public void testSimpleMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/"); + } + + @TestMetadata("simpleNativeTarget") + public void testSimpleNativeTarget() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/"); + } + + @TestMetadata("singleplatformJs") + public void testSingleplatformJs() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/"); + } + } + + @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class GradleGroovy extends AbstractYamlNewWizardProjectImportTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestGradleGroovy, this, testDataFilePath); + } + + public void testAllFilesPresentInGradleGroovy() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("android") + public void testAndroid() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/"); + } + + @TestMetadata("jsNodeAndBrowserTargets") + public void testJsNodeAndBrowserTargets() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/"); + } + + @TestMetadata("jvmTarget") + public void testJvmTarget() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); + } + + @TestMetadata("kotlinJvm") + public void testKotlinJvm() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); + } + + @TestMetadata("nativeForCurrentSystem") + public void testNativeForCurrentSystem() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/"); + } + + @TestMetadata("simpleMultiplatform") + public void testSimpleMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/"); + } + + @TestMetadata("simpleNativeTarget") + public void testSimpleNativeTarget() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/"); + } + + @TestMetadata("singleplatformJs") + public void testSingleplatformJs() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/"); + } + } + + @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Maven extends AbstractYamlNewWizardProjectImportTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestMaven, this, testDataFilePath); + } + + public void testAllFilesPresentInMaven() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("android") + public void testAndroid() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/"); + } + + @TestMetadata("jsNodeAndBrowserTargets") + public void testJsNodeAndBrowserTargets() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/"); + } + + @TestMetadata("jvmTarget") + public void testJvmTarget() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); + } + + @TestMetadata("kotlinJvm") + public void testKotlinJvm() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); + } + + @TestMetadata("nativeForCurrentSystem") + public void testNativeForCurrentSystem() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/"); + } + + @TestMetadata("simpleMultiplatform") + public void testSimpleMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/"); + } + + @TestMetadata("simpleNativeTarget") + public void testSimpleNativeTarget() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/"); + } + + @TestMetadata("singleplatformJs") + public void testSingleplatformJs() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/"); + } + } +} diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/FormattingTestWizardService.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/FormattingTestWizardService.kt new file mode 100644 index 00000000000..282b9717182 --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/FormattingTestWizardService.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2020 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.services + +import org.jetbrains.kotlin.tools.projectWizard.cli.TestWizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService + +class FormattingTestWizardService : FileFormattingService, TestWizardService { + override fun formatFile(text: String, filename: String): String = text +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt new file mode 100644 index 00000000000..9370909449f --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2010-2020 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.services + +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.externalSystem.importing.ImportSpecBuilder +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ProjectData +import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode +import com.intellij.openapi.externalSystem.service.project.ExternalProjectRefreshCallback +import com.intellij.openapi.externalSystem.service.project.ProjectDataManager +import com.intellij.openapi.externalSystem.util.ExternalSystemUtil +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.idea.framework.MAVEN_SYSTEM_ID +import org.jetbrains.kotlin.tools.projectWizard.cli.TestWizardService +import org.jetbrains.kotlin.tools.projectWizard.core.Failure +import org.jetbrains.kotlin.tools.projectWizard.core.ProjectImportingError +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS +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.util.GradleConstants +import java.nio.file.Path + +class GradleProjectImportingTestWizardService(private val project: Project) : ProjectImportingWizardService, TestWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType.isGradle || buildSystemType == BuildSystemType.Maven + + override fun importProject( + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ): TaskResult { + var importingErrorMessage: String? = null + + ExternalSystemUtil.refreshProjects( + ImportSpecBuilder(project, buildSystem.externalSystemId() ?: error("Unsupported build system $buildSystem")) + .use(ProgressExecutionMode.MODAL_SYNC) + .callback(object : ExternalProjectRefreshCallback { + override fun onSuccess(externalProject: DataNode?) { + if (externalProject == null) { + importingErrorMessage = "Got null External project after import" + } else { + ServiceManager.getService(ProjectDataManager::class.java).importData(externalProject, project, true) + } + } + + override fun onFailure(errorMessage: String, errorDetails: String?) { + importingErrorMessage = errorMessage + } + }).forceWhenUptodate() + ) + + return importingErrorMessage?.let { Failure(ProjectImportingError(it)) } ?: UNIT_SUCCESS + } + + private fun BuildSystemType.externalSystemId() = when (this) { + BuildSystemType.GradleKotlinDsl -> GradleConstants.SYSTEM_ID + BuildSystemType.GradleGroovyDsl -> GradleConstants.SYSTEM_ID + BuildSystemType.Jps -> null + BuildSystemType.Maven -> MAVEN_SYSTEM_ID + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/TestWizardServices.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/TestWizardServices.kt new file mode 100644 index 00000000000..16e557b8b54 --- /dev/null +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/TestWizardServices.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2020 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.services + +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.tools.projectWizard.cli.TestWizardService + +object TestWizardServices { + fun createProjectDependent(project: Project): List = listOf( + GradleProjectImportingTestWizardService(project) + ) + val PROJECT_INDEPENDENT = listOf(FormattingTestWizardService()) +} \ No newline at end of file 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 dc2d1a648de..58c59f4afbc 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 @@ -2,46 +2,57 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard import org.jetbrains.kotlin.tools.projectWizard.YamlSettingsParser import org.jetbrains.kotlin.tools.projectWizard.core.* +import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext +import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext 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.PluginSetting +import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference -import org.jetbrains.kotlin.tools.projectWizard.core.service.* +import org.jetbrains.kotlin.tools.projectWizard.core.service.IdeaIndependentWizardService +import org.jetbrains.kotlin.tools.projectWizard.core.service.Services +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService 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 -import java.nio.file.Paths +import java.nio.file.Path class YamlWizard( private val yaml: String, - private val path: String, + private val projectPath: Path, createPlugins: (Context) -> List, + servicesManager: ServicesManager = CLI_SERVICES_MANAGER, isUnitTestMode: Boolean -) : Wizard( - createPlugins, - ServicesManager(Services.IDEA_INDEPENDENT_SERVICES) { services -> - services.firstOrNull { it is IdeaIndependentWizardService } - }, isUnitTestMode -) { +) : Wizard(createPlugins, servicesManager, isUnitTestMode) { + private val settingsWritingContext = SettingsWritingContext(context, servicesManager, isUnitTestMode) + override fun apply( services: List, phases: Set, onTaskExecuting: (PipelineTask) -> Unit ): TaskResult = computeM { - super.apply(services, setOf(GenerationPhase.PREPARE), onTaskExecuting) - val parsingData = with(valuesReadingContext) { - ParsingState(TemplatesPlugin::templates.propertyValue, emptyMap()) + val (settingsValuesFromYaml) = valuesReadingContext.parseYaml(yaml, pluginSettings) + + with(settingsWritingContext) { + settingsValuesFromYaml.forEach { (reference, value) -> reference.setValue(value) } + StructurePlugin::projectPath.reference.setValue(projectPath) } - val yamlParser = YamlSettingsParser(pluginSettings, parsingData) - val (settingsValuesFromYaml) = yamlParser.parseYamlText(yaml) - val settingValues = defaultPluginSettingValues + settingsValuesFromYaml - settingValues.forEach { (path, value) -> context.settingContext[path] = value } - context.settingContext[StructurePlugin::projectPath.reference] = Paths.get(path) + super.apply(services, phases, onTaskExecuting) } - private val defaultPluginSettingValues - get() = pluginSettings.mapNotNull { setting -> - val defaultValue = setting.defaultValue ?: return@mapNotNull null - PluginSettingReference(setting) to defaultValue - }.toMap() + companion object { + val CLI_SERVICES_MANAGER = ServicesManager(Services.IDEA_INDEPENDENT_SERVICES) { services -> + services.firstOrNull { it is IdeaIndependentWizardService } + } + } +} + +fun ReadingContext.parseYaml( + yaml: String, + pluginSettings: List> +): TaskResult, Any>> { + val parsingData = ParsingState(TemplatesPlugin::templates.propertyValue, emptyMap()) + val yamlParser = YamlSettingsParser(pluginSettings, parsingData) + return yamlParser.parseYamlText(yaml) } diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle new file mode 100644 index 00000000000..70b1d122d19 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + jcenter() + } + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == 'com.android' || requested.id.name == 'kotlin-android-extensions') { + useModule('com.android.tools.build:gradle:3.5.2') + } + } + } +} +rootProject.name = 'generatedProject' + + +include(':android') \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts new file mode 100644 index 00000000000..02dcc260a8b --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + jcenter() + } + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == "com.android" || requested.id.name == "kotlin-android-extensions") { + useModule("com.android.tools.build:gradle:3.5.2") + } + } + } +} +rootProject.name = "generatedProject" + + +include(":android") \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/settings.yaml index 23e467b46de..596b6cd27f2 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/settings.yaml @@ -6,8 +6,4 @@ kotlin: - type: name: android androidSdkPath: /home/user/Android/Sdk - kind: singleplatformJvm - name: android - sourcesets: - - type: main - - type: test + name: android \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.yaml index bf2cf69f411..23594012a70 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jsNodeAndBrowserTargets/settings.yaml @@ -2,20 +2,11 @@ kotlin: projectKind: Multiplatform modules: - type: multiplatform - kind: multiplatform name: a subModules: - type: jsNode - kind: target name: nodeJs - sourcesets: - - type: main - - type: test - type: name: jsBrowser testFramework: JS - kind: target - name: browser - sourcesets: - - type: main - - type: test \ No newline at end of file + name: browser \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml index 0ae6a6cf615..0e994b79ed2 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml @@ -2,15 +2,10 @@ kotlin: projectKind: Multiplatform modules: - type: multiplatform - kind: multiplatform name: a subModules: - type: targetJvmVersion: "1.8" name: jvmTarget testFramework: JUNIT4 - kind: target - name: jvm - sourcesets: - - type: main - - type: test \ No newline at end of file + name: jvm \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/importParameters.txt b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/importParameters.txt new file mode 100644 index 00000000000..f14bef2e838 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/importParameters.txt @@ -0,0 +1 @@ +// runForMaven true \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml index 29a6a49a268..69302491373 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml @@ -5,8 +5,4 @@ kotlin: targetJvmVersion: "1.6" name: JVM Module testFramework: JUNIT4 - name: nya - kind: singleplatformJvm - sourcesets: - - type: main - + name: nya \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.yaml index 0ae06b46f48..3e763c10953 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/settings.yaml @@ -2,12 +2,7 @@ kotlin: projectKind: Multiplatform modules: - type: multiplatform - kind: multiplatform name: a subModules: - type: nativeForCurrentSystem - kind: target - name: myNative - sourcesets: - - type: main - - type: test \ No newline at end of file + name: myNative \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml index 0a4f163d0eb..976af2abe4d 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml @@ -2,23 +2,14 @@ kotlin: projectKind: Multiplatform modules: - type: multiplatform - kind: multiplatform name: a subModules: - type: targetJvmVersion: "9" name: jvmTarget testFramework: JUNIT4 - kind: target name: jvm - sourcesets: - - type: main - - type: test - type: name: jsBrowser testFramework: JS - kind: target - name: a - sourcesets: - - type: main - - type: test \ No newline at end of file + name: a \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.yaml index f178c673cf9..6b649d48895 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/settings.yaml @@ -2,12 +2,7 @@ kotlin: projectKind: Multiplatform modules: - type: multiplatform - kind: multiplatform name: a subModules: - type: linuxX64Target - kind: target - name: linuxX64 - sourcesets: - - type: main - - type: test \ No newline at end of file + name: linuxX64 \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/build.gradle new file mode 100644 index 00000000000..6cedc3e0d7e --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.jetbrains.kotlin.js' version '1.3.61' +} +group = 'testGroupId' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} +dependencies { + testImplementation 'org.jetbrains.kotlin:kotlin-test-js' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-js' +} +kotlin.target.browser { } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/build.gradle.kts new file mode 100644 index 00000000000..421a09531b2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + kotlin("js") version "1.3.61" +} +group = "testGroupId" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} +dependencies { + testImplementation(kotlin("test-js")) + implementation(kotlin("stdlib-js")) +} +kotlin.target.browser { } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/settings.gradle new file mode 100644 index 00000000000..c8f757733f2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'generatedProject' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/settings.gradle.kts new file mode 100644 index 00000000000..b9c39b1ab0d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/expected/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "generatedProject" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/settings.yaml new file mode 100644 index 00000000000..74e7794fa8e --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/settings.yaml @@ -0,0 +1,5 @@ +kotlin: + projectKind: js + modules: + - type: jsSinglepaltform + name: a \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/app/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/app/build.gradle new file mode 100644 index 00000000000..8b802ad4e5d --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/app/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' version '1.3.61' + id 'kotlin-android-extensions' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + gradlePluginPortal() + google() + jcenter() + mavenCentral() +} +dependencies { + implementation 'androidx.core:core-ktx:1.1.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7' +} +android { + compileSdkVersion 29 + defaultConfig { + applicationId 'me.user.app' + minSdkVersion 24 + targetSdkVersion 29 + versionCode 1 + versionName '1.0' + } + buildTypes { + 'release' { + minifyEnabled false + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/app/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/app/build.gradle.kts new file mode 100644 index 00000000000..66aa8b504cd --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/app/build.gradle.kts @@ -0,0 +1,35 @@ +plugins { + id("com.android.application") + kotlin("android") version "1.3.61" + id("kotlin-android-extensions") +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + gradlePluginPortal() + google() + jcenter() + mavenCentral() +} +dependencies { + implementation("androidx.core:core-ktx:1.1.0") + implementation("androidx.appcompat:appcompat:1.1.0") + implementation("androidx.constraintlayout:constraintlayout:1.1.3") + implementation(kotlin("stdlib-jdk7")) +} +android { + compileSdkVersion(29) + defaultConfig { + applicationId = "me.user.app" + minSdkVersion(24) + targetSdkVersion(29) + versionCode = 1 + versionName = "1.0" + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/build.gradle new file mode 100644 index 00000000000..58dfac75d1c --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/build.gradle @@ -0,0 +1,6 @@ +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/build.gradle.kts new file mode 100644 index 00000000000..f4cf4e941e3 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/build.gradle.kts @@ -0,0 +1,6 @@ +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/settings.gradle new file mode 100644 index 00000000000..e7b65b2556c --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/settings.gradle @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + jcenter() + } + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == 'com.android' || requested.id.name == 'kotlin-android-extensions') { + useModule('com.android.tools.build:gradle:3.5.2') + } + } + } +} +rootProject.name = 'AndroidApplication' + + +include(':app') \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/settings.gradle.kts new file mode 100644 index 00000000000..6d4ce6b3380 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/expected/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + jcenter() + } + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == "com.android" || requested.id.name == "kotlin-android-extensions") { + useModule("com.android.tools.build:gradle:3.5.2") + } + } + } +} +rootProject.name = "AndroidApplication" + + +include(":app") \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/settings.yaml new file mode 100644 index 00000000000..e21db7a9cb7 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/settings.yaml @@ -0,0 +1,2 @@ +android: + androidSdkPath: android.sdk \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/build.gradle new file mode 100644 index 00000000000..9f0892ff612 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.61' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} +kotlin { + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib-common') + } + } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/build.gradle.kts new file mode 100644 index 00000000000..8918c7b3238 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("multiplatform") version "1.3.61" +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} +kotlin { + + sourceSets { + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib-common")) + } + } + val commonTest by getting { + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/settings.gradle new file mode 100644 index 00000000000..2d4e59d339b --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'EmptyMultiplatform' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/settings.gradle.kts new file mode 100644 index 00000000000..20ce23febd5 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "EmptyMultiplatform" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/build.gradle new file mode 100644 index 00000000000..f3d448b91ba --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/build.gradle @@ -0,0 +1,18 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.3.61' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} +dependencies { + testImplementation 'org.jetbrains.kotlin:kotlin-test-junit' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' +} +tasks.withType(KotlinCompile) { + kotlinOptions.jvmTarget = '1.8' +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/build.gradle.kts new file mode 100644 index 00000000000..5f54d6599ec --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/build.gradle.kts @@ -0,0 +1,18 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.3.61" +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} +dependencies { + testImplementation(kotlin("test-junit")) + implementation(kotlin("stdlib-jdk8")) +} +tasks.withType() { + kotlinOptions.jvmTarget = "1.8" +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/importParameters.txt b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/importParameters.txt new file mode 100644 index 00000000000..f14bef2e838 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/importParameters.txt @@ -0,0 +1 @@ +// runForMaven true \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/pom.xml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/pom.xml new file mode 100644 index 00000000000..5989d8b5db9 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + mainModule + me.user + 1.0-SNAPSHOT + jar + + mainModule + + + UTF-8 + official + 1.8 + + + + + mavenCentral + https://repo1.maven.org/maven2/ + + + + + src/main/kotlin + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + 1.3.61 + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + + + + org.jetbrains.kotlin + kotlin-test-junit + 1.3.61 + test + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + 1.3.61 + + + \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/settings.gradle new file mode 100644 index 00000000000..6e79e40028b --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'EmptySingleplatform' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/settings.gradle.kts new file mode 100644 index 00000000000..f46e6fc3ad1 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "EmptySingleplatform" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/build.gradle new file mode 100644 index 00000000000..7b0c85260a5 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'org.jetbrains.kotlin.js' version '1.3.61' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() + jcenter() + maven { + url 'https://dl.bintray.com/kotlin/kotlin-js-wrappers' + } +} +dependencies { + testImplementation 'org.jetbrains.kotlin:kotlin-test-js' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-js' + implementation 'org.jetbrains.kotlinx:kotlinx-html-js:0.6.12' + implementation 'org.jetbrains:kotlin-react:16.9.0-pre.89-kotlin-1.3.60' + implementation 'org.jetbrains:kotlin-react-dom:16.9.0-pre.89-kotlin-1.3.60' + implementation npm('react','16.12.0') + implementation npm('react-dom','16.12.0') + implementation npm('react-is','16.12.0') + implementation 'org.jetbrains:kotlin-styled:1.0.0-pre.89-kotlin-1.3.60' + implementation npm('styled-components','5.0.0') + implementation npm('inline-style-prefixer','5.1.0') +} +kotlin.target.browser { } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/build.gradle.kts new file mode 100644 index 00000000000..f203800d41f --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + kotlin("js") version "1.3.61" +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() + jcenter() + maven { + url = uri("https://dl.bintray.com/kotlin/kotlin-js-wrappers") + } +} +dependencies { + testImplementation(kotlin("test-js")) + implementation(kotlin("stdlib-js")) + implementation("org.jetbrains.kotlinx:kotlinx-html-js:0.6.12") + implementation("org.jetbrains:kotlin-react:16.9.0-pre.89-kotlin-1.3.60") + implementation("org.jetbrains:kotlin-react-dom:16.9.0-pre.89-kotlin-1.3.60") + implementation(npm("react","16.12.0")) + implementation(npm("react-dom","16.12.0")) + implementation(npm("react-is","16.12.0")) + implementation("org.jetbrains:kotlin-styled:1.0.0-pre.89-kotlin-1.3.60") + implementation(npm("styled-components","5.0.0")) + implementation(npm("inline-style-prefixer","5.1.0")) +} +kotlin.target.browser { } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/settings.gradle new file mode 100644 index 00000000000..912569f7902 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'JsBrowserApplication' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/settings.gradle.kts new file mode 100644 index 00000000000..1f1137503ab --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "JsBrowserApplication" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/build.gradle new file mode 100644 index 00000000000..b57e9762dc5 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/build.gradle @@ -0,0 +1,22 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.3.61' + id 'application' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} +dependencies { + testImplementation 'org.jetbrains.kotlin:kotlin-test-junit' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' +} +tasks.withType(KotlinCompile) { + kotlinOptions.jvmTarget = '1.8' +} +application { + mainClassName = 'MainKt' +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/build.gradle.kts new file mode 100644 index 00000000000..a1c20e5d059 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/build.gradle.kts @@ -0,0 +1,22 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.3.61" + application +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} +dependencies { + testImplementation(kotlin("test-junit")) + implementation(kotlin("stdlib-jdk8")) +} +tasks.withType() { + kotlinOptions.jvmTarget = "1.8" +} +application { + mainClassName = "MainKt" +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/importParameters.txt b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/importParameters.txt new file mode 100644 index 00000000000..f14bef2e838 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/importParameters.txt @@ -0,0 +1 @@ +// runForMaven true \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/pom.xml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/pom.xml new file mode 100644 index 00000000000..3f54b38c9ee --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + consoleApp + me.user + 1.0-SNAPSHOT + jar + + consoleApp + + + UTF-8 + official + 1.8 + + + + + mavenCentral + https://repo1.maven.org/maven2/ + + + + + src/main/kotlin + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + 1.3.61 + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + MainKt + + + + + + + org.jetbrains.kotlin + kotlin-test-junit + 1.3.61 + test + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + 1.3.61 + + + \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/settings.gradle new file mode 100644 index 00000000000..cb28affaeee --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'JvmConsoleApplication' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/settings.gradle.kts new file mode 100644 index 00000000000..f48e2d46cbd --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "JvmConsoleApplication" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/build.gradle new file mode 100644 index 00000000000..d144478a76a --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/build.gradle @@ -0,0 +1,81 @@ +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack + +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.61' + id 'application' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() + jcenter() + maven { + url 'https://dl.bintray.com/kotlin/ktor' + } + maven { + url 'https://dl.bintray.com/kotlin/kotlin-js-wrappers' + } +} +kotlin { + jvm { + compilations.all { + kotlinOptions.jvmTarget = '1.8' + } + withJava() + } + js { + browser { + + } + } + sourceSets { + jvmMain { + dependencies { + implementation kotlin('stdlib-jdk8') + implementation 'io.ktor:ktor-server-netty:1.2.6' + implementation 'io.ktor:ktor-html-builder:1.2.6' + implementation 'org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.12' + } + } + jvmTest { + dependencies { + implementation kotlin('test-junit') + } + } + jsMain { + dependencies { + implementation kotlin('stdlib-js') + implementation 'org.jetbrains.kotlinx:kotlinx-html-js:0.6.12' + implementation 'org.jetbrains:kotlin-react:16.9.0-pre.89-kotlin-1.3.60' + implementation 'org.jetbrains:kotlin-react-dom:16.9.0-pre.89-kotlin-1.3.60' + implementation npm('react','16.12.0') + implementation npm('react-dom','16.12.0') + implementation npm('react-is','16.12.0') + implementation 'org.jetbrains:kotlin-styled:1.0.0-pre.89-kotlin-1.3.60' + implementation npm('styled-components','5.0.0') + implementation npm('inline-style-prefixer','5.1.0') + } + } + jsTest { + dependencies { + implementation kotlin('test-js') + } + } + } +} +application { + mainClassName = 'ServerKt' +} +tasks.getByName('jsBrowserProductionWebpack') { + outputFileName = 'output.js' +} +tasks.getByName('jvmJar') { + dependsOn(tasks.getByName('jsBrowserProductionWebpack')) + def jsBrowserProductionWebpack = tasks.getByName('jsBrowserProductionWebpack') + from(new File(jsBrowserProductionWebpack.destinationDirectory, jsBrowserProductionWebpack.outputFileName)) +} +tasks.getByName('run') { + dependsOn(tasks.getByName('jvmJar')) + classpath(tasks.getByName('jvmJar')) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/build.gradle.kts new file mode 100644 index 00000000000..25c173ea5bc --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/build.gradle.kts @@ -0,0 +1,81 @@ +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack + +plugins { + kotlin("multiplatform") version "1.3.61" + application +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() + jcenter() + maven { + url = uri("https://dl.bintray.com/kotlin/ktor") + } + maven { + url = uri("https://dl.bintray.com/kotlin/kotlin-js-wrappers") + } +} +kotlin { + jvm { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + withJava() + } + js { + browser { + + } + } + sourceSets { + val jvmMain by getting { + dependencies { + implementation(kotlin("stdlib-jdk8")) + implementation("io.ktor:ktor-server-netty:1.2.6") + implementation("io.ktor:ktor-html-builder:1.2.6") + implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.12") + } + } + val jvmTest by getting { + dependencies { + implementation(kotlin("test-junit")) + } + } + val jsMain by getting { + dependencies { + implementation(kotlin("stdlib-js")) + implementation("org.jetbrains.kotlinx:kotlinx-html-js:0.6.12") + implementation("org.jetbrains:kotlin-react:16.9.0-pre.89-kotlin-1.3.60") + implementation("org.jetbrains:kotlin-react-dom:16.9.0-pre.89-kotlin-1.3.60") + implementation(npm("react","16.12.0")) + implementation(npm("react-dom","16.12.0")) + implementation(npm("react-is","16.12.0")) + implementation("org.jetbrains:kotlin-styled:1.0.0-pre.89-kotlin-1.3.60") + implementation(npm("styled-components","5.0.0")) + implementation(npm("inline-style-prefixer","5.1.0")) + } + } + val jsTest by getting { + dependencies { + implementation(kotlin("test-js")) + } + } + } +} +application { + mainClassName = "ServerKt" +} +tasks.getByName("jsBrowserProductionWebpack") { + outputFileName = "output.js" +} +tasks.getByName("jvmJar") { + dependsOn(tasks.getByName("jsBrowserProductionWebpack")) + val jsBrowserProductionWebpack = tasks.getByName("jsBrowserProductionWebpack") + from(File(jsBrowserProductionWebpack.destinationDirectory, jsBrowserProductionWebpack.outputFileName)) +} +tasks.getByName("run") { + dependsOn(tasks.getByName("jvmJar")) + classpath(tasks.getByName("jvmJar")) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/settings.gradle new file mode 100644 index 00000000000..c20ce09cb88 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'JvmServerJsClient' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/settings.gradle.kts new file mode 100644 index 00000000000..ddf297a3294 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "JvmServerJsClient" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/build.gradle new file mode 100644 index 00000000000..e78482cd098 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/build.gradle @@ -0,0 +1,71 @@ +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests + +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.61' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} +kotlin { + jvm { + compilations.all { + kotlinOptions.jvmTarget = '1.8' + } + } + js { + browser { + + } + } + def hostOs = System.getProperty("os.name") + def isMingwX64 = hostOs.startsWith("Windows") + KotlinNativeTargetWithTests nativeTarget + if (hostOs == "Mac OS X") nativeTarget = macosX64('native') + else if (hostOs == "Linux") nativeTarget = linuxX64("native") + else if (isMingwX64) nativeTarget = mingwX64("native") + else throw new GradleException("Host OS is not supported in Kotlin/Native.") + + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib-common') + } + } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } + jvmMain { + dependencies { + implementation kotlin('stdlib-jdk8') + } + } + jvmTest { + dependencies { + implementation kotlin('test-junit') + } + } + jsMain { + dependencies { + implementation kotlin('stdlib-js') + } + } + jsTest { + dependencies { + implementation kotlin('test-js') + } + } + nativeMain { + + } + nativeTest { + + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/build.gradle.kts new file mode 100644 index 00000000000..111569f9cf9 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/build.gradle.kts @@ -0,0 +1,66 @@ +plugins { + kotlin("multiplatform") version "1.3.61" +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} +kotlin { + jvm { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + } + js { + browser { + + } + } + val hostOs = System.getProperty("os.name") + val isMingwX64 = hostOs.startsWith("Windows") + val nativeTarget = when { + hostOs == "Mac OS X" -> macosX64("native") + hostOs == "Linux" -> linuxX64("native") + isMingwX64 -> mingwX64("native") + else -> throw GradleException("Host OS is not supported in Kotlin/Native.") + } + + + sourceSets { + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib-common")) + } + } + val commonTest by getting { + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + val jvmMain by getting { + dependencies { + implementation(kotlin("stdlib-jdk8")) + } + } + val jvmTest by getting { + dependencies { + implementation(kotlin("test-junit")) + } + } + val jsMain by getting { + dependencies { + implementation(kotlin("stdlib-js")) + } + } + val jsTest by getting { + dependencies { + implementation(kotlin("test-js")) + } + } + val nativeMain by getting + val nativeTest by getting + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/settings.gradle new file mode 100644 index 00000000000..cae69c13f94 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'MultiplatformLibrary' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/settings.gradle.kts new file mode 100644 index 00000000000..d8696eecd38 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "MultiplatformLibrary" \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/build.gradle new file mode 100644 index 00000000000..bc579149114 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/build.gradle @@ -0,0 +1,36 @@ +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests + +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.61' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} +kotlin { + def hostOs = System.getProperty("os.name") + def isMingwX64 = hostOs.startsWith("Windows") + KotlinNativeTargetWithTests nativeTarget + if (hostOs == "Mac OS X") nativeTarget = macosX64('native') + else if (hostOs == "Linux") nativeTarget = linuxX64("native") + else if (isMingwX64) nativeTarget = mingwX64("native") + else throw new GradleException("Host OS is not supported in Kotlin/Native.") + + nativeTarget.with { + binaries { + executable { + entryPoint = 'main' + } + } + } + sourceSets { + nativeMain { + + } + nativeTest { + + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/build.gradle.kts new file mode 100644 index 00000000000..fe0663df000 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + kotlin("multiplatform") version "1.3.61" +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} +kotlin { + val hostOs = System.getProperty("os.name") + val isMingwX64 = hostOs.startsWith("Windows") + val nativeTarget = when { + hostOs == "Mac OS X" -> macosX64("native") + hostOs == "Linux" -> linuxX64("native") + isMingwX64 -> mingwX64("native") + else -> throw GradleException("Host OS is not supported in Kotlin/Native.") + } + + nativeTarget.apply { + binaries { + executable { + entryPoint = "main" + } + } + } + sourceSets { + val nativeMain by getting + val nativeTest by getting + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/settings.gradle new file mode 100644 index 00000000000..0bb5b3b94b2 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'NativeConsoleApplication' \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/settings.gradle.kts new file mode 100644 index 00000000000..8399b10ce57 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "NativeConsoleApplication" \ No newline at end of file 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 9f3d2d89a34..3a7850c38aa 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 @@ -6,21 +6,17 @@ 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 import org.jetbrains.kotlin.tools.projectWizard.core.service.Services import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase -import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins -import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.MavenPlugin -import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.GroovyDslPlugin -import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.KotlinDslPlugin -import org.jetbrains.kotlin.tools.projectWizard.wizard.YamlWizard +import org.jetbrains.kotlin.tools.projectWizard.wizard.Wizard import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths abstract class AbstractBuildFileGenerationTest : UsefulTestCase() { + abstract fun createWizard(directory: Path, buildSystem: BuildSystem, projectDirectory: Path): Wizard + fun doTest(directoryPath: String) { val directory = Paths.get(directoryPath) val expectedDirectory = expectedDirectory(directory) @@ -33,67 +29,26 @@ abstract class AbstractBuildFileGenerationTest : UsefulTestCase() { } private fun doTest(directory: Path, buildSystem: BuildSystem) { - val yaml = directory.resolve("settings.yaml").toFile().readText() + "\n" + - defaultStructure + "\n" + - buildSystem.yaml - val tempDir = Files.createTempDirectory(null) - val wizard = YamlWizard(yaml, tempDir.toString(), Plugins.allPlugins, isUnitTestMode = true) + val tempDirectory = Files.createTempDirectory(null) + val wizard = createWizard(directory, buildSystem, tempDirectory) val result = wizard.apply(Services.IDEA_INDEPENDENT_SERVICES, GenerationPhase.ALL) - result.onFailure { errors -> - errors.forEach { error -> - if (error is ExceptionError) { - throw error.exception - } - } - fail(errors.joinToString("\n")) - } + result.assertSuccess() val expectedDirectory = expectedDirectory(directory) compareFiles( expectedDirectory.allBuildFiles(buildSystem), expectedDirectory, - tempDir.allBuildFiles(buildSystem), tempDir + tempDirectory.allBuildFiles(buildSystem), tempDirectory ) } private fun Path.allBuildFiles(buildSystem: BuildSystem) = - listFiles { it.fileName.toString() == buildSystem.buildFileName } - - private enum class BuildSystem(val buildFileName: String, val yaml: String) { - GRADLE_KOTLIN_DSL( - buildFileName = "build.gradle.kts", - yaml = """buildSystem: - type: GradleKotlinDsl - gradle: - createGradleWrapper: false - version: 5.4.1""".trimIndent() - ), - GRADLE_GROOVY_DSL( - buildFileName = "build.gradle", - yaml = """buildSystem: - type: GradleGroovyDsl - gradle: - createGradleWrapper: false - version: 5.4.1""".trimIndent() - ), - MAVEN( - buildFileName = "pom.xml", - yaml = """buildSystem: - type: Maven""".trimIndent() - ) - } + listFiles { it.fileName.toString() in buildSystem.allBuildFileNames } private fun expectedDirectory(directory: Path): Path = (directory / EXPECTED_DIRECTORY_NAME).takeIf { Files.exists(it) } ?: directory companion object { private const val EXPECTED_DIRECTORY_NAME = "expected" - - private val defaultStructure = - """structure: - name: generatedProject - groupId: testGroupId - artifactId: testArtifactId - """.trimIndent() } } diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractProjectTemplateBuildFileGenerationTest.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractProjectTemplateBuildFileGenerationTest.kt new file mode 100644 index 00000000000..9eff32bdb2e --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractProjectTemplateBuildFileGenerationTest.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2020 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.cli + +import org.jetbrains.kotlin.tools.projectWizard.wizard.Wizard +import org.jetbrains.kotlin.tools.projectWizard.wizard.YamlWizard +import java.nio.file.Path + +abstract class AbstractProjectTemplateBuildFileGenerationTest : AbstractBuildFileGenerationTest() { + override fun createWizard(directory: Path, buildSystem: BuildSystem, projectDirectory: Path): Wizard = + ProjectTemplateBasedTestWizard.createByDirectory(directory, buildSystem, projectDirectory, YamlWizard.CLI_SERVICES_MANAGER) +} + diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractYamlBuildFileGenerationTest.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractYamlBuildFileGenerationTest.kt new file mode 100644 index 00000000000..56e94ce8d54 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/AbstractYamlBuildFileGenerationTest.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2020 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.cli + +import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins +import org.jetbrains.kotlin.tools.projectWizard.wizard.Wizard +import org.jetbrains.kotlin.tools.projectWizard.wizard.YamlWizard +import java.nio.file.Path + +abstract class AbstractYamlBuildFileGenerationTest : AbstractBuildFileGenerationTest() { + override fun createWizard(directory: Path, buildSystem: BuildSystem, projectDirectory: Path): Wizard { + val yaml = readSettingsYaml(directory, buildSystem) ?: error("settings.yaml should exists in $directory") + return YamlWizard(yaml, projectDirectory.toString(), Plugins.allPlugins, isUnitTestMode = true) + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt new file mode 100644 index 00000000000..4e1e4b0f7f8 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2010-2020 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.cli + +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.compute +import org.jetbrains.kotlin.tools.projectWizard.core.computeM +import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext +import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference +import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins +import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.applyProjectTemplate +import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate +import org.jetbrains.kotlin.tools.projectWizard.wizard.Wizard +import org.jetbrains.kotlin.tools.projectWizard.wizard.YamlWizard +import org.jetbrains.kotlin.tools.projectWizard.wizard.parseYaml +import java.nio.file.Path + +class ProjectTemplateBasedTestWizard( + private val projectTemplate: ProjectTemplate, + private val buildSystem: BuildSystem, + private val projectDirectory: Path, + servicesManager: ServicesManager, + private val additionalYamlSettings: String? +) : Wizard( + Plugins.allPlugins, + servicesManager, + isUnitTestMode = true +) { + private val settingsWritingContext = SettingsWritingContext(context, servicesManager, isUnitTestMode = true) + + override fun apply( + services: List, + phases: Set, + onTaskExecuting: (PipelineTask) -> Unit + ): TaskResult = + computeM { + super.apply(services, setOf(GenerationPhase.PREPARE), onTaskExecuting).ensure() + with(settingsWritingContext) { + applyProjectTemplate(projectTemplate) + BuildSystemPlugin::type.reference.setValue(buildSystem.buildSystemType) + StructurePlugin::projectPath.reference.setValue(projectDirectory) + StructurePlugin::name.reference.setValue(projectTemplate.id) + StructurePlugin::groupId.reference.setValue(GROUP_ID) + StructurePlugin::artifactId.reference.setValue(ARTIFACT_ID) + applyAdditionalSettingsFromYaml().ensure() + } + + super.apply(services, phases, onTaskExecuting) + } + + private fun SettingsWritingContext.applyAdditionalSettingsFromYaml() = compute { + if (additionalYamlSettings != null) { + val (additionalSettings) = parseYaml(additionalYamlSettings, pluginSettings) + additionalSettings.forEach { (reference, value) -> reference.setValue(value) } + } + } + + companion object { + private const val GROUP_ID = "me.user" + private const val ARTIFACT_ID = "artifactId" + + fun createByDirectory( + directory: Path, + buildSystem: BuildSystem, + projectDirectory: Path, + servicesManager: ServicesManager + ): ProjectTemplateBasedTestWizard { + val projectTemplateId = directory.fileName.toString() + val projectTemplate = ProjectTemplate.byId(projectTemplateId) + ?: error("Directory name should be a valid template id but was $projectTemplateId") + val additionalYamlSettings = readSettingsYamlWithoutDefaultStructure(directory) + return ProjectTemplateBasedTestWizard(projectTemplate, buildSystem, projectDirectory, servicesManager, additionalYamlSettings) + } + } +} diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java new file mode 100644 index 00000000000..1bf9b9d1522 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010-2020 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.cli; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class ProjectTemplateBuildFileGenerationTestGenerated extends AbstractProjectTemplateBuildFileGenerationTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInProjectTemplatesBuildFileGeneration() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @TestMetadata("androidApplication") + public void testAndroidApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/androidApplication/"); + } + + @TestMetadata("emptyMultiplatform") + public void testEmptyMultiplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptyMultiplatform/"); + } + + @TestMetadata("emptySingleplatform") + public void testEmptySingleplatform() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/emptySingleplatform/"); + } + + @TestMetadata("jsBrowserApplication") + public void testJsBrowserApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jsBrowserApplication/"); + } + + @TestMetadata("jvmConsoleApplication") + public void testJvmConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmConsoleApplication/"); + } + + @TestMetadata("jvmServerJsClient") + public void testJvmServerJsClient() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/jvmServerJsClient/"); + } + + @TestMetadata("multiplatformLibrary") + public void testMultiplatformLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); + } + + @TestMetadata("nativeConsoleApplication") + public void testNativeConsoleApplication() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); + } +} diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/TestParameters.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/TestParameters.kt new file mode 100644 index 00000000000..e3ca53ceffb --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/TestParameters.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2020 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.cli + +import org.jetbrains.kotlin.test.InTextDirectivesUtils +import java.nio.file.Files +import java.nio.file.Path +import kotlin.reflect.KClass +import kotlin.reflect.KParameter +import kotlin.reflect.full.primaryConstructor + + +interface TestParameters { + companion object { + inline fun fromTestDataOrDefault( + directory: Path, + parametersFileName: String = "parameters.txt" + ): T = + fromTestData(directory, parametersFileName, T::class) ?: T::class.DEFAULT_VALUE + + val KClass.DEFAULT_VALUE + get() = primaryConstructorOrError.callBy(emptyMap()) + + fun fromTestData(directory: Path, parametersFileName: String, klass: KClass): T? { + val file = directory.resolve(parametersFileName) + if (!Files.exists(file) || !Files.isRegularFile(file)) return null + val text = file.readFile() + return parseTestParameters(text, klass) + } + + private fun parseTestParameters(text: String, klass: KClass): T { + val constructor = klass.primaryConstructorOrError + val parameters = constructor.parameters.associateWith { parameter -> + parameter.parseValue(text) + } + return constructor.callBy(parameters) + } + + private fun KParameter.parseValue(text: String): Any? = when (type.classifier as? KClass<*>) { + Boolean::class -> InTextDirectivesUtils.getPrefixedBoolean(text, name) ?: false + else -> error("Invalid test parameter $name with type $type") + } + + private val KClass.primaryConstructorOrError + get() = primaryConstructor ?: error("Primary constructor should present") + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/TestWizardService.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/TestWizardService.kt new file mode 100644 index 00000000000..13f5b74679f --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/TestWizardService.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2020 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.cli + +import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService + +interface TestWizardService : WizardService { +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/BuildFileGenerationTestGenerated.java b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/YamlBuildFileGenerationTestGenerated.java similarity index 90% rename from libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/BuildFileGenerationTestGenerated.java rename to libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/YamlBuildFileGenerationTestGenerated.java index 248618061da..0b68fcbbaf9 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/BuildFileGenerationTestGenerated.java +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/YamlBuildFileGenerationTestGenerated.java @@ -19,7 +19,7 @@ import java.util.regex.Pattern; @TestMetadata("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) -public class BuildFileGenerationTestGenerated extends AbstractBuildFileGenerationTest { +public class YamlBuildFileGenerationTestGenerated extends AbstractYamlBuildFileGenerationTest { private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } @@ -62,4 +62,9 @@ public class BuildFileGenerationTestGenerated extends AbstractBuildFileGeneratio public void testSimpleNativeTarget() throws Exception { runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/"); } + + @TestMetadata("singleplatformJs") + public void testSingleplatformJs() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/singleplatformJs/"); + } } diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/testUtils.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/testUtils.kt index 044f7da2394..472ee7644be 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/testUtils.kt +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/testUtils.kt @@ -5,8 +5,13 @@ package org.jetbrains.kotlin.tools.projectWizard.cli +import com.intellij.testFramework.UsefulTestCase import org.hamcrest.core.Is import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.tools.projectWizard.core.ExceptionError +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.onFailure +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.junit.Assert.assertThat import java.nio.file.Files import java.nio.file.Path @@ -34,4 +39,74 @@ internal fun compareFiles( for ((actualFile, expectedFile) in actualFilesSorted zip expectedFilesSorted) { KotlinTestUtils.assertEqualsToFile(expectedFile.toFile(), actualFile.readFile()) } +} + +fun readSettingsYaml(directory: Path, buildSystem: BuildSystem): String? = + readSettingsYamlWithoutDefaultStructure(directory)?.let { text -> + text + "\n" + + defaultStructure + "\n" + + buildSystem.yaml + } + +fun readSettingsYamlWithoutDefaultStructure(directory: Path): String? = + directory.resolve("settings.yaml").takeIf { Files.exists(it) }?.readFile() + + +enum class BuildSystem( + val buildFileName: String, + val additionalFileNames: List = emptyList(), + val yaml: String +) { + GRADLE_KOTLIN_DSL( + buildFileName = "build.gradle.kts", + additionalFileNames = listOf("settings.gradle.kts"), + yaml = """buildSystem: + type: GradleKotlinDsl + gradle: + version: 5.4.1""".trimIndent() + ), + GRADLE_GROOVY_DSL( + buildFileName = "build.gradle", + additionalFileNames = listOf("settings.gradle"), + yaml = """buildSystem: + type: GradleGroovyDsl + gradle: + version: 5.4.1""".trimIndent() + ), + MAVEN( + buildFileName = "pom.xml", + yaml = """buildSystem: + type: Maven""".trimIndent() + ) +} + +val BuildSystem.buildSystemType + get() = when (this) { + BuildSystem.GRADLE_KOTLIN_DSL -> BuildSystemType.GradleKotlinDsl + BuildSystem.GRADLE_GROOVY_DSL -> BuildSystemType.GradleGroovyDsl + BuildSystem.MAVEN -> BuildSystemType.Maven + } + +val BuildSystem.allBuildFileNames + get() = additionalFileNames + buildFileName + +val BuildSystem.isGradle + get() = this == BuildSystem.GRADLE_KOTLIN_DSL || this == BuildSystem.GRADLE_GROOVY_DSL + +private val defaultStructure = + """structure: + name: generatedProject + groupId: testGroupId + artifactId: testArtifactId + """.trimIndent() + +fun TaskResult.assertSuccess() { + onFailure { errors -> + errors.forEach { error -> + if (error is ExceptionError) { + throw error.exception + } + } + UsefulTestCase.fail(errors.joinToString("\n")) + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt index 75723a10d5c..5574b0607c4 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt @@ -84,6 +84,6 @@ inline fun SettingsOwner.enumSettingImpl( crossinline init: DropDownSettingType.Builder.() -> Unit = {} ) where E : Enum, E : DisplayableSettingItem = dropDownSetting(title, neededAtPhase, enumParser()) { values = enumValues().asList() - defaultValue = values.firstOrNull() + // init() } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt index 46d4f896bf5..c2df344b143 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt @@ -39,14 +39,13 @@ fun Parser.parse(context: ParsingContext, value: Any?, path: String inline fun enumParser(): Parser where E : Enum, E : DisplayableSettingItem = object : Parser() { override fun ParsingContext.parse(value: Any?, path: String): TaskResult = computeM { val (name) = value.parseAs(path) - val createError = { + enumValues().firstOrNull { enumValue -> + enumValue.name.equals(name, ignoreCase = true) || enumValue.text.equals(name, ignoreCase = true) + }.toResult { ParseError( "For setting `$path` one of [${enumValues().joinToString { it.name }}] was expected but `$name` was found" ) } - val byEnumName = safe { enumValueOf(name) }.mapFailure { createError() } - val byText = enumValues().firstOrNull { it.text == name }.toResult { createError() } - byEnumName.recover { byText } } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/context/ReadingContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/context/ReadingContext.kt index 4b860292957..28eebf220a1 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/context/ReadingContext.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/context/ReadingContext.kt @@ -57,13 +57,16 @@ open class ReadingContext( return serializer.fromString(savedValue) } - val Setting>.savedOrDefaultValue: V? - get() = getSavedValueForSetting() ?: defaultValue + val SettingReference>.savedOrDefaultValue: V? + get() = setting.getSavedValueForSetting() ?: when (val defaultValue = setting.defaultValue) { + is SettingDefaultValue.Value -> defaultValue.value + is SettingDefaultValue.Dynamic -> defaultValue.getter(this@ReadingContext, this) + null -> null + } val > SettingReference.setting: Setting get() = with(this) { getSetting() } - @PublishedApi internal val `access$context`: Context get() = context 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 4f053608c63..9703ccd26f1 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 @@ -133,7 +133,7 @@ class SettingContext(val onUpdated: (SettingReference<*, *>) -> Unit) { fun ReadingContext.initPluginSettings(settings: List>) { for (setting in settings) { - setting.savedOrDefaultValue?.let { values[setting.path] = it } + setting.reference.savedOrDefaultValue?.let { values[setting.path] = it } } } @@ -166,7 +166,7 @@ typealias AnySetting = Setting<*, *> interface Setting> : Entity, ActivityCheckerOwner, Validatable { val title: String - val defaultValue: V? + val defaultValue: SettingDefaultValue? val isRequired: Boolean val isSavable: Boolean var neededAtPhase: GenerationPhase @@ -176,7 +176,7 @@ interface Setting> : Entity, ActivityChecker data class InternalSetting>( override val path: String, override val title: String, - override val defaultValue: V?, + override val defaultValue: SettingDefaultValue?, override val isAvailable: Checker, override val isRequired: Boolean, override val isSavable: Boolean, @@ -200,6 +200,13 @@ class TemplateSetting>( ) : SettingImpl(), Setting by internal +sealed class SettingDefaultValue { + data class Value(val value: V) : SettingDefaultValue() + data class Dynamic( + val getter: ReadingContext.(SettingReference>) -> V + ) : SettingDefaultValue() +} + abstract class SettingBuilder>( private val path: String, @@ -207,10 +214,13 @@ abstract class SettingBuilder>( private val neededAtPhase: GenerationPhase ) { var isAvailable: ReadingContext.() -> Boolean = { true } - var defaultValue: V? = null + open var defaultValue: SettingDefaultValue? = null var isSavable: Boolean = false var isRequired: Boolean? = null + fun value(value: V) = SettingDefaultValue.Value(value) + fun dynamic(getter: ReadingContext.(SettingReference>) -> V) = SettingDefaultValue.Dynamic(getter) + protected var validator = SettingValidator { ValidationResult.OK } fun validate(validator: SettingValidator) { @@ -316,6 +326,16 @@ class DropDownSettingType( override val type get() = DropDownSettingType(values, filter, parser) + + + init { + defaultValue = dynamic { reference -> + values.first { + @Suppress("UNCHECKED_CAST") + filter(reference as SettingReference>, it) + } + } + } } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/errors.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/errors.kt index adfd14e93b0..35103b1f003 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/errors.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/errors.kt @@ -71,6 +71,10 @@ data class ValidationError(val validationMessage: String) : Error() { get() = validationMessage.capitalize() } + +data class ProjectImportingError(override val message: String) : Error() + + data class InvalidSourceSetName(val name: String) : Error() { override val message: String get() = "Source set name `$name` is invalid" 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 index 15cf8d3a388..c60b95c511b 100644 --- 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 @@ -7,10 +7,18 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemT import java.nio.file.Path interface ProjectImportingWizardService : BuildSystemWizardService { - fun importProject(path: Path, modulesIrs: List): TaskResult + fun importProject( + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ): TaskResult } class ProjectImportingWizardServiceImpl : ProjectImportingWizardService, IdeaIndependentWizardService { override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = true - override fun importProject(path: Path, modulesIrs: List) = UNIT_SUCCESS + override fun importProject( + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ) = UNIT_SUCCESS } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt index dea41683960..75b90e2b6ba 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt @@ -19,7 +19,7 @@ interface JSConfigurator : ModuleConfiguratorWithModuleType { override val moduleType: ModuleType get() = ModuleType.js } -object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests { +object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests, SinglePlatformModuleConfigurator { override val moduleKind = ModuleKind.singleplatformJs override val suggestedModuleName = "js" override val id = "jsSinglepaltform" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt index 125f23be172..a0c8648c848 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt @@ -169,8 +169,11 @@ interface ModuleConfiguratorWithSettings : ModuleConfigurator { fun SettingsWritingContext.initDefaultValuesFor(module: Module) { withSettingsOf(module) { getConfiguratorSettings().forEach { setting -> - val defaultValue = setting.defaultValue ?: return@forEach - setting.reference.setValue(defaultValue) + val reference = setting.reference + val defaultValue = reference.savedOrDefaultValue ?: return@forEach + if (reference.notRequiredSettingValue == null) { + reference.setValue(defaultValue) + } } } } @@ -247,6 +250,7 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { +JvmSinglePlatformModuleConfigurator +AndroidSinglePlatformModuleConfigurator +IOSSinglePlatformModuleConfigurator + +JsSingleplatformModuleConfigurator } init { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt index 28c3b8d860d..2c76e7579eb 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt @@ -6,8 +6,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext -import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting -import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSettingReference +import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType @@ -26,8 +25,6 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings { "Test Framework", neededAtPhase = GenerationPhase.PROJECT_GENERATION ) { - defaultValue = KotlinTestFramework.COMMON - filter = filter@{ reference, kotlinTestFramework -> if (reference !is ModuleConfiguratorSettingReference<*, *>) return@filter true diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt index 600516dd6e4..67f9c247c19 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle interface JvmModuleConfigurator : ModuleConfiguratorWithTests { companion object : ModuleConfiguratorSettings() { val targetJvmVersion by enumSetting("Target JVM Version", GenerationPhase.PROJECT_GENERATION) { - defaultValue = TargetJvmVersion.JVM_1_8 + defaultValue = value(TargetJvmVersion.JVM_1_8) } } 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 8dbabcab228..45772ca89cd 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 @@ -13,7 +13,7 @@ import java.nio.file.Paths class StructurePlugin(context: Context) : Plugin(context) { val projectPath by valueSetting("Root path", GenerationPhase.PROJECT_GENERATION, pathParser) { - defaultValue = Paths.get(".") + defaultValue = value(Paths.get(".")) } val name by stringSetting("Name", GenerationPhase.PROJECT_GENERATION) @@ -29,7 +29,7 @@ class StructurePlugin(context: Context) : Plugin(context) { val version by stringSetting("Version", GenerationPhase.PROJECT_GENERATION) { shouldNotBeBlank() validate(StringValidators.shouldBeValidIdentifier("Version", setOf('_', '-', '.'))) - defaultValue = "1.0-SNAPSHOT" + defaultValue = value("1.0-SNAPSHOT") } val createProjectDir by pipelineTask(GenerationPhase.PROJECT_GENERATION) { 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 f3f369a35ac..ff345051920 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 @@ -87,8 +87,8 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { runAfter(BuildSystemPlugin::createModules) withAction { val data = BuildSystemPlugin::buildSystemData.propertyValue.first { it.type == buildSystemType } - service { service -> service.isSuitableFor(data.type) }!! - .importProject(StructurePlugin::projectPath.reference.settingValue, allIRModules) + service { service -> service.isSuitableFor(data.type) } + .importProject(StructurePlugin::projectPath.reference.settingValue, allIRModules, buildSystemType) } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt index f85917167f7..1e08c6e6ff9 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt @@ -24,14 +24,8 @@ import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) { - val createGradleWrapper by booleanSetting("Create Gradle Wrapper", GenerationPhase.FIRST_STEP) { - defaultValue = true - isAvailable = isGradle - } - - val version by versionSetting("Gradle Version", GenerationPhase.FIRST_STEP) { - defaultValue = defaultVersions.first() + defaultValue = value(defaultVersions.first()) isAvailable = isGradle } @@ -92,7 +86,6 @@ abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) { runBefore(TemplatesPlugin::renderFileTemplates) isAvailable = isGradle withAction { - if (!GradlePlugin::createGradleWrapper.reference.settingValue) return@withAction UNIT_SUCCESS TemplatesPlugin::addFileTemplate.execute( FileTemplate( FileTemplateDescriptor( diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt index fca410280c0..a18999b3e6c 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt @@ -1,29 +1,30 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates import org.jetbrains.kotlin.tools.projectWizard.core.* -import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference +import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase -import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.CustomMultiplatformProjectTemplate +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate class ProjectTemplatesPlugin(context: Context) : Plugin(context) { val template by dropDownSetting( "Template", GenerationPhase.INIT_TEMPLATE, - valueParser { value, path -> - CustomMultiplatformProjectTemplate - }) { + parser = valueParserM { _, _ -> + Failure(ParseError("Project templates is not supported in yaml for now")) + } + ) { values = ProjectTemplate.ALL isRequired = false } +} - val initTemplate by pipelineTask(GenerationPhase.INIT_TEMPLATE) { - withAction { - val selectedTemplate = ProjectTemplatesPlugin::template.reference.notRequiredSettingValue - selectedTemplate?.setsValues?.forEach { (setting, value) -> - context.settingContext[setting] = value - } - UNIT_SUCCESS - } +fun SettingsWritingContext.applyProjectTemplate(projectTemplate: ProjectTemplate) { + projectTemplate.setsValues.forEach { (setting, value) -> + setting.setValue(value) + } + KotlinPlugin::modules.settingValue.withAllSubModules(includeSourcesets = true).forEach { module -> + module.apply { initDefaultValuesForSettings() } } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index 108000fd1f8..d6f09cb00ec 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -35,6 +35,8 @@ sealed class ProjectTemplate : DisplayableSettingItem { abstract val htmlDescription: String abstract val suggestedProjectName: String abstract val projectKind: ProjectKind + open val id: String + get() = this::class.simpleName.toString().removeSuffix("Template").removeSuffix("Project") val tags: List get() = setsPluginSettings .firstOrNull { it.setting == KotlinPlugin::modules.reference } @@ -74,8 +76,8 @@ sealed class ProjectTemplate : DisplayableSettingItem { companion object { val ALL = listOf( - CustomSingleplatformProjectTemplate, - CustomMultiplatformProjectTemplate, + EmptySingleplatformProjectTemplate, + EmptyMultiplatformProjectTemplate, JvmConsoleApplication, JvmServerJsClient, MultiplatformLibrary, @@ -84,6 +86,10 @@ sealed class ProjectTemplate : DisplayableSettingItem { NativeConsoleApplication, JsBrowserApplication ) + + fun byId(id: String): ProjectTemplate? = ALL.firstOrNull { + it.id.equals(id, ignoreCase = true) + } } } @@ -122,7 +128,7 @@ private fun ModuleType.createDefaultTarget( name: String = this.name ) = MultiplatformTargetModule(name, defaultTarget, createDefaultSourcesets()) -object CustomSingleplatformProjectTemplate : ProjectTemplate() { +object EmptySingleplatformProjectTemplate : ProjectTemplate() { override val title = "Empty Kotlin/JVM Project" override val htmlDescription = title override val suggestedProjectName = "myKotlinJvmProject" @@ -136,7 +142,7 @@ object CustomSingleplatformProjectTemplate : ProjectTemplate() { ) } -object CustomMultiplatformProjectTemplate : ProjectTemplate() { +object EmptyMultiplatformProjectTemplate : ProjectTemplate() { override val title = "Empty Kotlin Multiplatform Project" override val htmlDescription = "Multiplatform Gradle project without predefined targets" override val suggestedProjectName = "myKotlinMultiplatformProject" @@ -234,7 +240,6 @@ object AndroidApplication : ProjectTemplate() { KotlinPlugin::modules withValue listOf( Module( "app", - ModuleKind.singleplatformJvm, AndroidSinglePlatformModuleConfigurator, template = null, sourcesets = SourcesetType.ALL.map { type -> @@ -257,7 +262,6 @@ object NativeConsoleApplication : ProjectTemplate() { KotlinPlugin::modules withValue listOf( Module( "app", - ModuleKind.multiplatform, MppModuleConfigurator, template = null, sourcesets = emptyList(), @@ -282,7 +286,6 @@ object JsBrowserApplication : ProjectTemplate() { KotlinPlugin::modules withValue listOf( Module( "frontend", - ModuleKind.singleplatformJs, JsSingleplatformModuleConfigurator, template = SimpleJsClientTemplate(), sourcesets = SourcesetType.ALL.map { type -> @@ -308,7 +311,6 @@ object IOSApplication : ProjectTemplate() { KotlinPlugin::modules withValue listOf( Module( "iosApp", - ModuleKind.singleplatformJvm, IOSSinglePlatformModuleConfigurator, template = null, sourcesets = SourcesetType.ALL.map { type -> diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt index dc6dba56741..e545d808909 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt @@ -26,8 +26,7 @@ enum class ModuleKind : DisplayableSettingItem { // TODO separate to classes class Module( var name: String, - val kind: ModuleKind, - var configurator: ModuleConfigurator, + val configurator: ModuleConfigurator, var template: Template?, val sourcesets: List, subModules: List, @@ -35,6 +34,9 @@ class Module( override val identificator: Identificator = GeneratedIdentificator(name) ) : DisplayableSettingItem, Validatable, IdentificatorOwner { + val kind: ModuleKind + get() = configurator.moduleKind + override val validator: SettingValidator = settingValidator { module -> StringValidators.shouldNotBeBlank("Module name").validate(this, module.name) } and settingValidator { module -> @@ -42,12 +44,13 @@ class Module( } and settingValidator { module -> withSettingsOf(module) { allSettingsOfModuleConfigurator(configurator).map { setting -> - val value = when (setting) { - is PluginSetting> -> setting.reference.notRequiredSettingValue - is ModuleConfiguratorSetting> -> setting.reference.notRequiredSettingValue + val reference = when (setting) { + is PluginSetting> -> setting.reference + is ModuleConfiguratorSetting> -> setting.reference else -> null } - ?: setting.savedOrDefaultValue + val value = reference?.notRequiredSettingValue + ?: reference?.savedOrDefaultValue ?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank") (setting.validator as SettingValidator).validate(this@settingValidator, value) }.fold() @@ -57,7 +60,7 @@ class Module( org.jetbrains.kotlin.tools.projectWizard.templates.withSettingsOf(module) { template.settings.map { setting -> val value = setting.reference.notRequiredSettingValue - ?: setting.savedOrDefaultValue + ?: setting.reference.savedOrDefaultValue ?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank") (setting.validator as SettingValidator).validate(this@settingValidator, value) }.fold() @@ -100,19 +103,14 @@ class Module( val parser: Parser = mapParser { map, path -> val (name) = map.parseValue(path, "name") val identificator = GeneratedIdentificator(name) - val (kind) = map.parseValue(this, path, "kind", enumParser()) val (configurator) = map.parseValue(this, path, "type", ModuleConfigurator.getParser(identificator)) + val template = map["template"]?.let { Template.parser(identificator).parse(this, it, "$path.template") }.nullableValue() - val (sourcesets) = map.parseValue( - this, - path, - "sourcesets", - listParser(Sourceset.parser()) - ) { emptyList() } + val sourcesets = listOf(Sourceset(SourcesetType.main), Sourceset(SourcesetType.test)) val (submodules) = map.parseValue(this, path, "subModules", listParser(Module.parser)) { emptyList() } - Module(name, kind, configurator, template, sourcesets, submodules, identificator = identificator) + Module(name, configurator, template, sourcesets, submodules, identificator = identificator) } } @@ -142,7 +140,6 @@ val Module.isRootModule fun MultiplatformTargetModule(name: String, configurator: ModuleConfigurator, sourcesets: List) = Module( name, - ModuleKind.target, configurator, null, sourcesets, @@ -153,7 +150,6 @@ fun MultiplatformTargetModule(name: String, configurator: ModuleConfigurator, so fun MultiplatformModule(name: String, targets: List = emptyList()) = Module( name, - ModuleKind.multiplatform, MppModuleConfigurator, null, emptyList(), @@ -164,7 +160,6 @@ fun MultiplatformModule(name: String, targets: List = emptyList()) = fun SingleplatformModule(name: String, sourcesets: List) = Module( name, - ModuleKind.singleplatformJvm, JvmSinglePlatformModuleConfigurator, null, sourcesets, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt index fbbe97c1de9..0a4c48f003d 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt @@ -31,7 +31,7 @@ data class PathBasedSourcesetDependency(val path: ModulePath) : SourcesetDepende // A `main` or `test` sourceset for single or multiplatform projects class Sourceset( val sourcesetType: SourcesetType, - var dependencies: List, + var dependencies: List = emptyList(), var parent: Module? = null, override val identificator: Identificator = GeneratedIdentificator(sourcesetType.name) ) : DisplayableSettingItem, IdentificatorOwner { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt index aace30f4112..92d96a2f9a4 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt @@ -39,7 +39,7 @@ class SimpleJsClientTemplate : Template() { || module.configurator == JsSingleplatformModuleConfigurator val renderEngine by enumSetting("Rendering engine", GenerationPhase.PROJECT_GENERATION) { - defaultValue = RenderEngine.REACT_WITH_STYLED + defaultValue = value(RenderEngine.REACT_WITH_STYLED) } override val settings: List> = listOf(renderEngine) 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 022735175c5..a782f8f5e3b 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 @@ -78,8 +78,11 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor { fun SettingsWritingContext.initDefaultValuesFor(module: Module) { withSettingsOf(module) { settings.forEach { setting -> - val defaultValue = setting.savedOrDefaultValue ?: return@forEach - setting.reference.setValue(defaultValue) + val reference = setting.reference + val defaultValue = reference.savedOrDefaultValue ?: return@forEach + if (reference.notRequiredSettingValue == null) { + reference.setValue(defaultValue) + } } } } 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 2c2125521b7..3194a2785b5 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 @@ -3,33 +3,58 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.* +import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: ServicesManager, private val isUnitTestMode: Boolean) { val context = Context(createPlugins, EventManager()) - val valuesReadingContext = - ReadingContext(context, servicesManager, isUnitTestMode) + val valuesReadingContext = ReadingContext(context, servicesManager, isUnitTestMode) + private val settingsWritingContext = SettingsWritingContext(context, servicesManager, isUnitTestMode) protected val plugins = context.plugins protected val pluginSettings = plugins.flatMap { it.declaredSettings }.distinctBy { it.path } + inline fun settingValue(setting: PluginSettingReference>): V = + with(valuesReadingContext) { setting.settingValue } + private fun Context.checkAllRequiredSettingPresent(phases: Set): TaskResult = getUnspecifiedSettings(phases).let { unspecifiedSettings -> if (unspecifiedSettings.isEmpty()) UNIT_SUCCESS else Failure(RequiredSettingsIsNotPresentError(unspecifiedSettings.map { it.path })) } + + private fun initNonPluginDefaultValues() { + with(settingsWritingContext) { + KotlinPlugin::modules.reference.notRequiredSettingValue?.withAllSubModules(includeSourcesets = true)?.forEach { module -> + with(module) { initDefaultValuesForSettings() } + } + } + } + + private fun initPluginDefaultValues() { + with(settingsWritingContext) { + for (setting in pluginSettings) { + if (setting.reference.notRequiredSettingValue == null) { + val defaultValue = setting.reference.savedOrDefaultValue ?: continue + setting.reference.setValue(defaultValue) + } + } + } + } + @Suppress("UNUSED_PARAMETER") fun ReadingContext.validate(phases: Set): TaskResult = context.settingContext.allPluginSettings.map { setting -> val value = context.settingContext.pluginSettingValue(setting) ?: return@map ValidationResult.OK - when (setting.neededAtPhase) { - in phases -> (setting.validator as SettingValidator).validate(this, value) - else -> ValidationResult.OK - } + if (setting.neededAtPhase in phases && setting.isActive(this)) + (setting.validator as SettingValidator).validate(this, value) + else ValidationResult.OK }.fold(ValidationResult.OK, ValidationResult::and).toResult() private fun ReadingContext.saveSettingValues(phases: Set) { @@ -50,12 +75,10 @@ abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: Servic phases: Set, onTaskExecuting: (PipelineTask) -> Unit = {} ): TaskResult = computeM { + initPluginDefaultValues() + initNonPluginDefaultValues() context.checkAllRequiredSettingPresent(phases).ensure() - val taskRunningContext = WritingContext( - context, - servicesManager.withServices(services), - isUnitTestMode - ) + val taskRunningContext = WritingContext(context, servicesManager.withServices(services), isUnitTestMode) taskRunningContext.validate(phases).ensure() taskRunningContext.saveSettingValues(phases) val (tasksSorted) = context.sortTasks().map { tasks ->