Wizard: add module dependencies to modules from jvm -> jvm dependencies

This commit is contained in:
Ilya Kirillov
2020-03-12 12:58:23 +03:00
parent 356dc2ad42
commit 45b01f7fc4
55 changed files with 1157 additions and 105 deletions
@@ -11,10 +11,7 @@ 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.BuildSystem
import org.jetbrains.kotlin.tools.projectWizard.cli.TestWizardService
import org.jetbrains.kotlin.tools.projectWizard.cli.assertSuccess
import org.jetbrains.kotlin.tools.projectWizard.cli.isGradle
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
@@ -64,7 +61,7 @@ abstract class AbstractNewWizardProjectImportTest : PlatformTestCase() {
private fun doTest(directoryPath: String, buildSystem: BuildSystem) {
val directory = Paths.get(directoryPath)
val parameters = ProjectImportingTestParameters.fromTestDataOrDefault(directory)
val parameters = DefaultTestParameters.fromTestDataOrDefault(directory)
if (!parameters.runForMaven && buildSystem == BuildSystem.MAVEN) return
val tempDirectory = Files.createTempDirectory(null)
@@ -1,18 +0,0 @@
/*
* 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"
}
}
@@ -50,6 +50,16 @@ public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWiza
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("jvmToJvmDependency")
public void testJvmToJvmDependency() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependency/");
}
@TestMetadata("jvmToJvmDependencyWithSingleRoot")
public void testJvmToJvmDependencyWithSingleRoot() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependencyWithSingleRoot/");
}
@TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -108,6 +118,16 @@ public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWiza
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("jvmToJvmDependency")
public void testJvmToJvmDependency() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependency/");
}
@TestMetadata("jvmToJvmDependencyWithSingleRoot")
public void testJvmToJvmDependencyWithSingleRoot() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependencyWithSingleRoot/");
}
@TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -166,6 +186,16 @@ public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWiza
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("jvmToJvmDependency")
public void testJvmToJvmDependency() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependency/");
}
@TestMetadata("jvmToJvmDependencyWithSingleRoot")
public void testJvmToJvmDependencyWithSingleRoot() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependencyWithSingleRoot/");
}
@TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -0,0 +1,20 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation project(':b')
implementation project(':c')
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
tasks.withType(KotlinCompile) {
kotlinOptions.jvmTarget = '1.8'
}
@@ -0,0 +1,20 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.3.70"
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation(project(":b"))
implementation(project(":c"))
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>a</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>a</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<artifactId>b</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>c</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,20 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation project(':c')
implementation project(':d')
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
tasks.withType(KotlinCompile) {
kotlinOptions.jvmTarget = '1.8'
}
@@ -0,0 +1,20 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.3.70"
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation(project(":c"))
implementation(project(":d"))
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>b</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>b</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<artifactId>c</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>d</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,6 @@
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
@@ -0,0 +1,6 @@
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
@@ -0,0 +1,18 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}
group = 'testGroupId'
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'
}
@@ -0,0 +1,18 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.3.70"
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>c</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>c</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,19 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation project(':a')
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
tasks.withType(KotlinCompile) {
kotlinOptions.jvmTarget = '1.8'
}
@@ -0,0 +1,19 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.3.70"
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation(project(":a"))
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>d</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>d</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<artifactId>a</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>testArtifactId</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>generatedProject</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<modules>
<module>a</module>
<module>b</module>
<module>c</module>
<module>d</module>
</modules>
</project>
@@ -0,0 +1,9 @@
rootProject.name = 'generatedProject'
include(':a')
include(':b')
include(':c')
include(':d')
@@ -0,0 +1,9 @@
rootProject.name = "generatedProject"
include(":a")
include(":b")
include(":c")
include(":d")
@@ -0,0 +1,19 @@
kotlin:
projectKind: Singleplatform
modules:
- type: JVM Module
name: a
dependencies:
- b
- c
- type: JVM Module
name: b
dependencies:
- c
- d
- type: JVM Module
name: c
- type: JVM Module
name: d
dependencies:
- a
@@ -0,0 +1,19 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm'
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
rootProject
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
tasks.withType(KotlinCompile) {
kotlinOptions.jvmTarget = '1.8'
}
@@ -0,0 +1,19 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm")
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
rootProject
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,19 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm'
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation project(':b')
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
tasks.withType(KotlinCompile) {
kotlinOptions.jvmTarget = '1.8'
}
@@ -0,0 +1,19 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm")
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation(project(":b"))
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>c</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>c</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<artifactId>b</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>b</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>b</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<artifactId>a</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,18 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}
group = 'testGroupId'
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'
}
@@ -0,0 +1,18 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.3.70"
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>a</artifactId>
<groupId>testGroupId</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>a</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.70</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>1.3.70</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.70</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,7 @@
rootProject.name = 'generatedProject'
include(':b:c')
include(':b')
@@ -0,0 +1,7 @@
rootProject.name = "generatedProject"
include(":b:c")
include(":b")
@@ -0,0 +1,15 @@
kotlin:
projectKind: Singleplatform
modules:
- type: JVM Module
name: a
subModules:
- type: JVM Module
name: b
dependencies:
- a
subModules:
- type: JVM Module
name: c
dependencies:
- a.b
@@ -19,12 +19,17 @@ abstract class AbstractBuildFileGenerationTest : UsefulTestCase() {
fun doTest(directoryPath: String) {
val directory = Paths.get(directoryPath)
val expectedDirectory = expectedDirectory(directory)
for (buildSystem in BuildSystem.values()) {
if (Files.exists(expectedDirectory / buildSystem.buildFileName)) {
doTest(directory, buildSystem)
}
val testParameters = DefaultTestParameters.fromTestDataOrDefault(directory)
val buildSystemsToRunFor = listOfNotNull(
BuildSystem.GRADLE_KOTLIN_DSL,
BuildSystem.GRADLE_GROOVY_DSL,
if (testParameters.runForMaven) BuildSystem.MAVEN else null
)
for (buildSystem in buildSystemsToRunFor) {
doTest(directory, buildSystem)
}
}
@@ -36,7 +41,7 @@ abstract class AbstractBuildFileGenerationTest : UsefulTestCase() {
val expectedDirectory = expectedDirectory(directory)
compareFiles(
compareFilesAndGenerateMissing(
expectedDirectory.allBuildFiles(buildSystem), expectedDirectory,
tempDirectory.allBuildFiles(buildSystem), tempDirectory
)
@@ -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.cli
import java.nio.file.Path
data class DefaultTestParameters(val runForMaven: Boolean = false) : TestParameters {
companion object {
fun fromTestDataOrDefault(directory: Path): DefaultTestParameters =
TestParameters.fromTestDataOrDefault(directory, PARAMETERS_FILE_NAME)
private const val PARAMETERS_FILE_NAME = "parameters.txt"
}
}
@@ -48,6 +48,16 @@ public class YamlBuildFileGenerationTestGenerated extends AbstractYamlBuildFileG
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("jvmToJvmDependency")
public void testJvmToJvmDependency() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependency/");
}
@TestMetadata("jvmToJvmDependencyWithSingleRoot")
public void testJvmToJvmDependencyWithSingleRoot() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmToJvmDependencyWithSingleRoot/");
}
@TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -10,9 +10,11 @@ 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.div
import org.jetbrains.kotlin.tools.projectWizard.core.onFailure
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.junit.Assert.assertThat
import org.junit.Assert.fail
import java.nio.file.Files
import java.nio.file.Path
import java.util.stream.Collectors
@@ -24,17 +26,24 @@ internal fun Path.listFiles(filter: (Path) -> Boolean) =
Files.isRegularFile(path) && filter(path)
}.collect(Collectors.toList()).sorted()
internal fun compareFiles(
internal fun compareFilesAndGenerateMissing(
expectedFiles: List<Path>, expectedDir: Path,
actualFiles: List<Path>, actualDir: Path
) {
val expectedFilesSorted = expectedFiles.sorted()
val actualFilesSorted = actualFiles.sorted()
assertThat(
actualFilesSorted.map { actualDir.relativize(it) },
Is.`is`(expectedFilesSorted.map { expectedDir.relativize(it) })
)
val missingFiles =
actualFiles.map(actualDir::relativize).toSet() - expectedFiles.map(expectedDir::relativize).toSet()
if (missingFiles.isNotEmpty()) {
missingFiles.forEach { missingFile ->
val targetFile = expectedDir / missingFile
Files.createDirectories(targetFile.parent)
Files.copy(actualDir / missingFile, targetFile)
}
fail("The following files was missed: $missingFiles and thus was generated")
}
for ((actualFile, expectedFile) in actualFilesSorted zip expectedFilesSorted) {
KotlinTestUtils.assertEqualsToFile(expectedFile.toFile(), actualFile.readFile())
@@ -23,7 +23,6 @@ fun <V> inValidatorContext(validator: Reader.(V) -> SettingValidator<V>) =
}
object StringValidators {
fun shouldNotBeBlank(name: String) = settingValidator { value: String ->
if (value.isBlank()) ValidationResult.ValidationError("${name.capitalize()} should not be blank ")
@@ -69,6 +68,9 @@ sealed class ValidationResult {
companion object {
fun create(condition: Boolean, message: String) =
if (condition) OK else ValidationError(message)
inline fun create(condition: Boolean, message: () -> String) =
if (condition) OK else ValidationError(message())
}
}
@@ -1,6 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core
import java.io.IOException
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
abstract class Error {
abstract val message: String
@@ -55,4 +56,9 @@ data class ValidationError(val validationMessage: String) : Error() {
get() = validationMessage.capitalize()
}
data class ProjectImportingError(override val message: String) : Error()
data class ProjectImportingError(override val message: String) : Error()
data class InvalidModuleDependencyError(val from: Module, val to: Module) : Error() {
override val message: String
get() = "Invalid module dependency from module ${from.name} to ${to.name}"
}
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.AndroidPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
@@ -49,7 +49,7 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
override fun createBuildFileIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
) = buildList<BuildSystemIR> {
+GradleOnlyPluginByNameIR(reader.createAndroidPlugin(module).pluginName)
@@ -73,7 +73,7 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
override fun createModuleIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> =
buildList {
@@ -85,7 +85,7 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
}
override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? =
override fun createStdlibType(configurationData: ModulesToIrConversionData, module: Module): StdlibType? =
StdlibType.StdlibJdk7
object FileTemplateDescriptors {
@@ -137,7 +137,7 @@ object AndroidTargetConfigurator : TargetConfigurator,
}
override fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module,
modulePath: Path
): TaskResult<Unit> = computeM {
@@ -5,7 +5,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
@@ -27,7 +27,7 @@ object AndroidSinglePlatformModuleConfigurator :
override fun createBuildFileIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
) = buildList<BuildSystemIR> {
+super<AndroidModuleConfigurator>.createBuildFileIRs(reader, configurationData, module)
@@ -47,7 +47,7 @@ object AndroidSinglePlatformModuleConfigurator :
override fun createModuleIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
) = buildList<BuildSystemIR> {
+super<AndroidModuleConfigurator>.createModuleIRs(reader, configurationData, module)
@@ -66,7 +66,7 @@ object AndroidSinglePlatformModuleConfigurator :
}
override fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module,
modulePath: Path
): TaskResult<Unit> = computeM {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
@@ -26,7 +26,7 @@ object IOSSinglePlatformModuleConfigurator :
override val requiresRootBuildFile: Boolean = true
override fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module,
modulePath: Path
): TaskResult<Unit> {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
@@ -30,7 +30,7 @@ object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWi
override val canContainSubModules = false
override fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? =
override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
KotlinBuildSystemPluginIR(
KotlinBuildSystemPluginIR.Type.js,
version = configurationData.kotlinVersion
@@ -38,7 +38,7 @@ object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWi
override fun createBuildFileIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> = buildList {
+RawGradleIR {
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.correspondingStdlib
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
@@ -206,27 +206,27 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
fun createBuildFileIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> =
emptyList()
fun createModuleIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> =
emptyList()
fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? =
fun createStdlibType(configurationData: ModulesToIrConversionData, module: Module): StdlibType? =
safeAs<ModuleConfiguratorWithModuleType>()?.moduleType?.correspondingStdlib()
fun createRootBuildFileIrs(configurationData: ModuleConfigurationData): List<BuildSystemIR> = emptyList()
fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? =
fun createRootBuildFileIrs(configurationData: ModulesToIrConversionData): List<BuildSystemIR> = emptyList()
fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
null
fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module,
modulePath: Path
): TaskResult<Unit> = UNIT_SUCCESS
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinArbitraryDependencyIR
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.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
@@ -40,7 +40,7 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
override fun createModuleIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> =
withSettingsOf(module) {
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleImpo
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.NonDefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
@@ -80,7 +80,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
override fun createBuildFileIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> = buildList {
if (configurationData.buildSystemType == BuildSystemType.GradleGroovyDsl) {
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenProper
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
@@ -59,7 +59,7 @@ object MppModuleConfigurator : ModuleConfigurator {
override val text = "Multiplatform"
override val canContainSubModules = true
override fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? =
override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
KotlinBuildSystemPluginIR(
KotlinBuildSystemPluginIR.Type.multiplatform,
version = configurationData.kotlinVersion
@@ -83,7 +83,7 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
override val canContainSubModules = true
override fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? =
override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
KotlinBuildSystemPluginIR(
KotlinBuildSystemPluginIR.Type.jvm,
version = configurationData.kotlinVersion
@@ -92,7 +92,7 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
override fun createBuildFileIRs(
reader: Reader,
configurationData: ModuleConfigurationData,
configurationData: ModulesToIrConversionData,
module: Module
): List<BuildSystemIR> =
buildList {
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.fold
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
@@ -57,6 +58,8 @@ class KotlinPlugin(context: Context) : Plugin(context) {
)
}.fold()
}
validate(moduleDependenciesValidator)
}
@@ -103,7 +106,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
private fun Writer.createBuildFiles(modules: List<Module>): TaskResult<List<BuildFileIR>> =
with(
ModulesToIRsConverter(
ModuleConfigurationData(
ModulesToIrConversionData(
modules,
projectPath,
StructurePlugin::name.settingValue,
@@ -120,6 +123,19 @@ class KotlinPlugin(context: Context) : Plugin(context) {
// TODO update default versions
private val DEFAULT_VERSION = Version.fromString("1.3.61")
private val moduleDependenciesValidator = settingValidator<List<Module>> { modules ->
val allModules = modules.withAllSubModules(includeSourcesets = true).toSet()
val allModulePaths = allModules.map(Module::path).toSet()
allModules.flatMap { module ->
module.dependencies.map { dependency ->
val isValidModule = when (dependency) {
is ModuleReference.ByPath -> dependency.path in allModulePaths
is ModuleReference.ByModule -> dependency.module in allModules
}
ValidationResult.create(isValidModule) { "Invalid module dependency $dependency of module ${module.path}" }
}
}.fold()
}
}
}
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.nio.file.Path
data class ModuleConfigurationData(
data class ModulesToIrConversionData(
val rootModules: List<Module>,
val projectPath: Path,
val projectName: String,
@@ -24,6 +24,9 @@ data class ModuleConfigurationData(
val writer: Writer
) {
val allModules = rootModules.withAllSubModules()
val isSingleRootModuleMode = rootModules.size == 1
val moduleByPath = rootModules.withAllSubModules(includeSourcesets = true).associateBy(Module::path)
}
private data class ModulesToIrsState(
@@ -38,9 +41,8 @@ private fun ModulesToIrsState.stateForSubModule(currentModulePath: Path) =
)
class ModulesToIRsConverter(
val data: ModuleConfigurationData
val data: ModulesToIrConversionData
) {
private val isSingleRootModuleMode = data.rootModules.size == 1
// TODO get rid of mutable state
private val rootBuildFileIrs = mutableListOf<BuildSystemIR>()
@@ -53,7 +55,7 @@ class ModulesToIRsConverter(
if ( // We want to have root build file for android or ios projects
data.allModules.any { it.configurator.requiresRootBuildFile }
) return false
return isSingleRootModuleMode
return data.isSingleRootModuleMode
}
private fun calculatePathForModule(module: Module, rootPath: Path) = when {
@@ -99,22 +101,26 @@ class ModulesToIRsConverter(
module: Module,
configurator: SinglePlatformModuleConfigurator,
state: ModulesToIrsState
): TaskResult<List<BuildFileIR>> = with(data) {
): TaskResult<List<BuildFileIR>> = computeM {
val modulePath = calculatePathForModule(module, state.parentPath)
writer.mutateProjectStructureByModuleConfigurator(module, modulePath)
val (moduleDependencies) = module.dependencies.mapCompute { dependency ->
val to = data.moduleByPath.getValue(dependency.path)
val (dependencyType) = ModuleDependencyType.getPossibleDependencyType(module, to)
.toResult { InvalidModuleDependencyError(module, to) }
dependencyType.createDependencyIrs(module, to, data)
}.sequence()
data.writer.mutateProjectStructureByModuleConfigurator(module, modulePath)
val buildFileIR = run {
if (!configurator.needCreateBuildFile) return@run null
val dependenciesIRs = buildPersistenceList<BuildSystemIR> {
+module.sourcesets.flatMap { sourceset ->
sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) }
}
+moduleDependencies
with(configurator) { +createModuleIRs(this@createSinglePlatformModule, data, module) }
addIfNotNull(
configurator.createStdlibType(data, module)?.let { stdlibType ->
KotlinStdlibDependencyIR(
type = stdlibType,
isInMppModule = false,
version = kotlinVersion,
version = data.kotlinVersion,
dependencyType = DependencyType.MAIN
)
}
@@ -122,7 +128,7 @@ class ModulesToIRsConverter(
}
val moduleIr = SingleplatformModuleIR(
if (modulePath == projectPath) projectName else module.name,
if (modulePath == data.projectPath) data.projectName else module.name,
modulePath,
dependenciesIRs,
module.template,
@@ -131,7 +137,7 @@ class ModulesToIRsConverter(
SingleplatformSourcesetIR(
sourceset.sourcesetType,
modulePath / Defaults.SRC_DIR / sourceset.sourcesetType.name,
sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) }.toPersistentList(),
persistentListOf(),
sourceset
)
}
@@ -143,17 +149,17 @@ class ModulesToIRsConverter(
moduleIr,
persistentListOf()
),
pomIr.copy(artifactId = module.name),
data.pomIr.copy(artifactId = module.name),
createBuildFileIRs(module, state)
)
}
return module.subModules.mapSequence { subModule ->
createBuildFileForModule(
subModule,
state.stateForSubModule(modulePath)
)
}.map { it.flatten() }
module.subModules.mapSequence { subModule ->
createBuildFileForModule(
subModule,
state.stateForSubModule(modulePath)
)
}.map { it.flatten() }
.map { children ->
buildFileIR?.let { children + it } ?: children
}
@@ -194,7 +200,6 @@ class ModulesToIRsConverter(
val sourcesetss = target.sourcesets.map { sourceset ->
val sourcesetName = target.name + sourceset.sourcesetType.name.capitalize()
val sourcesetIrs = buildList<BuildSystemIR> {
+sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) }
if (sourceset.sourcesetType == SourcesetType.main) {
addIfNotNull(
target.configurator.createStdlibType(data, target)?.let { stdlibType ->
@@ -257,21 +262,4 @@ class ModulesToIRsConverter(
addIfNotNull(kotlinPlugin)
+with(module.configurator) { createBuildFileIRs(this@createBuildFileIRs, data, module) }
}
private fun SourcesetDependency.toIR(type: DependencyType): DependencyIR = with(data) {
val path = when (this@toIR) {
is ModuleBasedSourcesetDependency -> module.path
is PathBasedSourcesetDependency -> path
}
val modulePomIr = when (this@toIR) {
is ModuleBasedSourcesetDependency -> pomIr.copy(artifactId = module.name)
is PathBasedSourcesetDependency -> pomIr.copy(artifactId = path.parts.last())
}
return when {
isSingleRootModuleMode
&& path.parts.singleOrNull() == rootModules.single().name
&& buildSystemType.isGradle -> GradleRootProjectDependencyIR(type)
else -> ModuleDependencyIR(path, modulePomIr, type)
}
}
}
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner
@@ -33,6 +34,7 @@ class Module(
var template: Template?,
val sourcesets: List<Sourceset>,
subModules: List<Module>,
val dependencies: MutableList<ModuleReference> = mutableListOf(),
var parent: Module? = null,
override val identificator: Identificator = GeneratedIdentificator(name)
) : DisplayableSettingItem, Validatable<Module>, IdentificatorOwner {
@@ -86,7 +88,16 @@ class Module(
}.nullableValue()
val sourcesets = listOf(Sourceset(SourcesetType.main), Sourceset(SourcesetType.test))
val (submodules) = map.parseValue(this, path, "subModules", listParser(Module.parser)) { emptyList() }
Module(name, configurator, template, sourcesets, submodules, identificator = identificator)
val (dependencies) = map.parseValue(this, path, "dependencies", listParser(ModuleReference.ByPath.parser)) { emptyList() }
Module(
name,
configurator,
template,
sourcesets,
submodules,
dependencies = dependencies.toMutableList(),
identificator = identificator
)
}
private val moduleNameValidator = settingValidator<Module> { module ->
@@ -138,6 +149,7 @@ val Module.path
.asReversed()
.let(::ModulePath)
val Sourceset.path
get() = ModulePath(parent?.path?.parts.orEmpty() + sourcesetType.name)
@@ -0,0 +1,54 @@
/*
* 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.settings.buildsystem
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.GradleRootProjectDependencyIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleDependencyIR
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JvmSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import kotlin.reflect.KClass
sealed class ModuleDependencyType(
val from: KClass<out ModuleConfigurator>,
val to: KClass<out ModuleConfigurator>
) {
fun accepts(from: Module, to: Module) =
this.from.isInstance(from.configurator) && this.to.isInstance(to.configurator)
open fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): BuildSystemIR {
val path = to.path
val modulePomIr = data.pomIr.copy(artifactId = to.name)
return when {
data.isSingleRootModuleMode
&& to.path.parts.singleOrNull() == data.rootModules.single().name
&& data.buildSystemType.isGradle -> GradleRootProjectDependencyIR(DependencyType.MAIN)
else -> ModuleDependencyIR(
path.considerSingleRootModuleMode(data.isSingleRootModuleMode),
modulePomIr,
DependencyType.MAIN
)
}
}
object JVMSinglePlatformToJVMSinglePlatform : ModuleDependencyType(
from = JvmSinglePlatformModuleConfigurator::class,
to = JvmSinglePlatformModuleConfigurator::class
)
companion object {
private val ALL = listOf(
JVMSinglePlatformToJVMSinglePlatform
)
fun getPossibleDependencyType(from: Module, to: Module): ModuleDependencyType? =
ALL.firstOrNull { it.accepts(from, to) }
}
}
@@ -0,0 +1,29 @@
/*
* 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.settings.buildsystem
import org.jetbrains.kotlin.tools.projectWizard.core.parse
import org.jetbrains.kotlin.tools.projectWizard.core.valueParser
sealed class ModuleReference {
abstract val path: ModulePath
data class ByPath(override val path: ModulePath) : ModuleReference() {
companion object {
val parser = valueParser { value, path ->
val (modulePath) = ModulePath.parser.parse(this, value, path)
ByPath(modulePath)
}
}
override fun toString(): String = path.toString()
}
data class ByModule(val module: Module) : ModuleReference() {
override val path: ModulePath get() = module.path
override fun toString(): String = module.name
}
}
@@ -11,8 +11,22 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemP
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
inline class ModulePath(val parts: List<String>) {
constructor(path: String) : this(path.trim().split('.'))
fun asString(separator: String = ".") = parts.joinToString(separator)
override fun toString(): String = asString()
companion object {
val parser = valueParser { value, path ->
val (stringPath) = value.parseAs<String>(path)
ModulePath(stringPath)
}
}
}
fun ModulePath.considerSingleRootModuleMode(isSingleRootMode: Boolean) = when {
isSingleRootMode && parts.size > 1 -> ModulePath(parts.subList(1, parts.size))
else -> this
}
@@ -55,7 +69,7 @@ class Sourceset(
}
@Suppress("EnumEntryName")
enum class SourcesetType: DisplayableSettingItem {
enum class SourcesetType : DisplayableSettingItem {
main, test;
override val text: String