diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index 2de96d88980..a27b589919b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -30,6 +30,22 @@ import org.jetbrains.kotlin.idea.util.projectStructure.allModules import org.jetbrains.kotlin.idea.versions.getKotlinRuntimeMarkerClass import org.jetbrains.kotlin.utils.ifEmpty +data class RepositoryDescription(val id: String, val name: String, val url: String, val isSnapshot: Boolean) + +@JvmField +val SNAPSHOT_REPOSITORY = RepositoryDescription( + "sonatype.oss.snapshots", + "Sonatype OSS Snapshot Repository", + "http://oss.sonatype.org/content/repositories/snapshots", + isSnapshot = true) + +@JvmField +val EAP_REPOSITORY = RepositoryDescription( + "bintray.kotlin.eap", + "Bintray Kotlin EAP Repository", + "http://dl.bintray.com/kotlin/kotlin-eap", + isSnapshot = false) + fun isProjectConfigured(project: Project): Boolean { val modules = getModulesWithKotlinFiles(project) return modules.all { isModuleConfigured(it) } @@ -119,3 +135,12 @@ fun hasKotlinFilesOnlyInTests(module: Module): Boolean { fun hasKotlinFilesInSources(module: Module): Boolean { return FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(false)) } + +fun isSnapshot(version: String): Boolean { + return version.contains("SNAPSHOT") +} + +fun isEap(version: String): Boolean { + return version.contains("rc") || version.contains("eap") +} + diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt index 6df9350f747..4d351402ce5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt @@ -41,14 +41,26 @@ class GradleKotlinJavaFrameworkSupportProvider() : GradleFrameworkSupportProvide modifiableModelsProvider: ModifiableModelsProvider, buildScriptData: BuildScriptDataBuilder) { var kotlinVersion = bundledRuntimeVersion() - if (kotlinVersion == "@snapshot@") { - kotlinVersion = "0.1-SNAPSHOT" - val snapshotRepository = KotlinWithGradleConfigurator.SNAPSHOT_REPOSITORY.replace('\n', ' ') - buildScriptData.addBuildscriptRepositoriesDefinition(snapshotRepository) + val additionalRepository: String? = when { + kotlinVersion == "@snapshot@" -> { + kotlinVersion = "0.1-SNAPSHOT" + KotlinWithGradleConfigurator.SNAPSHOT_REPOSITORY + } + isEap(kotlinVersion) -> { + KotlinWithGradleConfigurator.EAP_REPOSITORY + } + else -> { + null + } + } + + if (additionalRepository != null) { + val oneLineRepository = additionalRepository.replace('\n', ' ') + buildScriptData.addBuildscriptRepositoriesDefinition(oneLineRepository) buildScriptData.addRepositoriesDefinition("mavenCentral()") - buildScriptData.addRepositoriesDefinition(snapshotRepository) + buildScriptData.addRepositoriesDefinition(oneLineRepository) } buildScriptData diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java index 2f3c3d882c3..9acdf764155 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java @@ -43,7 +43,6 @@ import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.*; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.jps.model.java.JavaSourceRootType; -import org.jetbrains.kotlin.cli.common.KotlinVersion; import org.jetbrains.kotlin.idea.KotlinPluginUtil; import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion; @@ -56,7 +55,6 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat private static final String GROUP_ID = "org.jetbrains.kotlin"; private static final String MAVEN_PLUGIN_ID = "kotlin-maven-plugin"; private static final String KOTLIN_VERSION_PROPERTY = "kotlin.version"; - private static final String SNAPSHOT_REPOSITORY_ID = "sonatype.oss.snapshots"; private static final String PROCESS_TEST_SOURCES_PHASE = "process-test-sources"; private static final String PROCESS_SOURCES_PHASE = "process-sources"; @@ -161,9 +159,14 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat protected void run(@NotNull Result result) { addKotlinVersionPropertyIfNeeded(domModel, version); - if (isSnapshot(version)) { - addPluginRepositoryIfNeeded(domModel); - addLibraryRepositoryIfNeeded(domModel); + if (ConfigureKotlinInProjectUtilsKt.isSnapshot(version)) { + addPluginRepositoryIfNeeded(domModel, ConfigureKotlinInProjectUtilsKt.SNAPSHOT_REPOSITORY); + addLibraryRepositoryIfNeeded(domModel, ConfigureKotlinInProjectUtilsKt.SNAPSHOT_REPOSITORY); + } + + if (ConfigureKotlinInProjectUtilsKt.isEap(version)) { + addPluginRepositoryIfNeeded(domModel, ConfigureKotlinInProjectUtilsKt.EAP_REPOSITORY); + addLibraryRepositoryIfNeeded(domModel, ConfigureKotlinInProjectUtilsKt.EAP_REPOSITORY); } addPluginIfNeeded(domModel, module, virtualFile); @@ -251,19 +254,19 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat createTagIfNeeded(domModel.getProperties(), KOTLIN_VERSION_PROPERTY, version); } - private static void addLibraryRepositoryIfNeeded(MavenDomProjectModel domModel) { + private static void addLibraryRepositoryIfNeeded(MavenDomProjectModel domModel, RepositoryDescription description) { MavenDomRepositories repositories = domModel.getRepositories(); - if (!isRepositoryConfigured(repositories.getRepositories())) { + if (!isRepositoryConfigured(repositories.getRepositories(), description.getId())) { MavenDomRepository newPluginRepository = repositories.addRepository(); - configureRepository(newPluginRepository); + configureRepository(newPluginRepository, description); } } - private static void addPluginRepositoryIfNeeded(MavenDomProjectModel domModel) { + private static void addPluginRepositoryIfNeeded(MavenDomProjectModel domModel, RepositoryDescription description) { MavenDomPluginRepositories pluginRepositories = domModel.getPluginRepositories(); - if (!isRepositoryConfigured(pluginRepositories.getPluginRepositories())) { + if (!isRepositoryConfigured(pluginRepositories.getPluginRepositories(), description.getId())) { MavenDomRepository newPluginRepository = pluginRepositories.addPluginRepository(); - configureRepository(newPluginRepository); + configureRepository(newPluginRepository, description); } } @@ -294,21 +297,25 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat createExecutions(virtualFile, kotlinPlugin, module); } - private static boolean isRepositoryConfigured(List pluginRepositories) { + private static boolean isRepositoryConfigured(List pluginRepositories, String repositoryId) { for (MavenDomRepository repository : pluginRepositories) { - if (SNAPSHOT_REPOSITORY_ID.equals(repository.getId().getStringValue())) { + if (repositoryId.equals(repository.getId().getStringValue())) { return true; } } return false; } - private static void configureRepository(@NotNull MavenDomRepository repository) { - repository.getId().setStringValue(SNAPSHOT_REPOSITORY_ID); - repository.getName().setStringValue("Sonatype OSS Snapshot Repository"); - repository.getUrl().setStringValue("http://oss.sonatype.org/content/repositories/snapshots"); - createTagIfNeeded(repository.getReleases(), "enabled", "false"); - createTagIfNeeded(repository.getSnapshots(), "enabled", "true"); + private static void configureRepository( + @NotNull MavenDomRepository repository, + @NotNull RepositoryDescription repositoryDescription + ) { + repository.getId().setStringValue(repositoryDescription.getId()); + repository.getName().setStringValue(repositoryDescription.getName()); + repository.getUrl().setStringValue(repositoryDescription.getUrl()); + + createTagIfNeeded(repository.getReleases(), "enabled", Boolean.toString(!repositoryDescription.isSnapshot())); + createTagIfNeeded(repository.getSnapshots(), "enabled", Boolean.toString(repositoryDescription.isSnapshot())); } @NotNull @@ -337,10 +344,6 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat return null; } - private static boolean isSnapshot(@NotNull String version) { - return version.contains("SNAPSHOT"); - } - @NotNull private static XmlTag createTagIfNeeded(@NotNull DomElement parent, @NotNull String tagName, @NotNull String value) { XmlTag parentTag = parent.ensureTagExists(); diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java index 25e5c00290e..a6ad5a790e9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java @@ -58,7 +58,10 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi private static final String VERSION_TEMPLATE = "$VERSION$"; protected static final String CLASSPATH = "classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\""; - protected static final String SNAPSHOT_REPOSITORY = "maven {\nurl 'http://oss.sonatype.org/content/repositories/snapshots'\n}"; + + protected static final String SNAPSHOT_REPOSITORY = "maven {\nurl '" + ConfigureKotlinInProjectUtilsKt.SNAPSHOT_REPOSITORY.getUrl() + "'\n}"; + protected static final String EAP_REPOSITORY = "maven {\nurl '" + ConfigureKotlinInProjectUtilsKt.EAP_REPOSITORY.getUrl() + "'\n}"; + private static final String MAVEN_CENTRAL = "mavenCentral()\n"; private static final String JCENTER = "jcenter()\n"; public static final String LIBRARY = "compile \"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version\""; @@ -219,9 +222,12 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi wasModified = addFirstExpressionInBlockIfNeeded(VERSION.replace(VERSION_TEMPLATE, version), buildScriptBlock); GrClosableBlock buildScriptRepositoriesBlock = getBuildScriptRepositoriesBlock(file); - if (isSnapshot(version)) { + if (ConfigureKotlinInProjectUtilsKt.isSnapshot(version)) { wasModified |= addLastExpressionInBlockIfNeeded(SNAPSHOT_REPOSITORY, buildScriptRepositoriesBlock); } + else if (ConfigureKotlinInProjectUtilsKt.isEap(version)) { + wasModified |= addLastExpressionInBlockIfNeeded(EAP_REPOSITORY, buildScriptRepositoriesBlock); + } else if (!isRepositoryConfigured(buildScriptRepositoriesBlock)) { wasModified |= addLastExpressionInBlockIfNeeded(MAVEN_CENTRAL, buildScriptRepositoriesBlock); } @@ -262,9 +268,12 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi } GrClosableBlock repositoriesBlock = getRepositoriesBlock(file); - if (isSnapshot(version)) { + if (ConfigureKotlinInProjectUtilsKt.isSnapshot(version)) { wasModified |= addLastExpressionInBlockIfNeeded(SNAPSHOT_REPOSITORY, repositoriesBlock); } + else if (ConfigureKotlinInProjectUtilsKt.isEap(version)) { + wasModified |= addLastExpressionInBlockIfNeeded(EAP_REPOSITORY, repositoriesBlock); + } else if (!isRepositoryConfigured(repositoriesBlock)) { wasModified |= addLastExpressionInBlockIfNeeded(MAVEN_CENTRAL, repositoriesBlock); } @@ -332,10 +341,6 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi return null; } - private static boolean isSnapshot(@NotNull String version) { - return version.contains("SNAPSHOT"); - } - protected boolean changeGradleFile( @NotNull final GroovyFile groovyFile, final boolean isTopLevelProjectFile, diff --git a/idea/testData/configuration/gradle/eapVersion_after.gradle b/idea/testData/configuration/gradle/eapVersion_after.gradle new file mode 100644 index 00000000000..4e0d7d7fa0d --- /dev/null +++ b/idea/testData/configuration/gradle/eapVersion_after.gradle @@ -0,0 +1,33 @@ +apply plugin: 'java' +apply plugin: 'kotlin' + +sourceCompatibility = 1.5 +version = '1.0' + +repositories { + mavenCentral() + maven { + url 'http://dl.bintray.com/kotlin/kotlin-eap' + } +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.11' + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" +} +buildscript { + ext.kotlin_version = '$VERSION$' + repositories { + maven { + url 'http://dl.bintray.com/kotlin/kotlin-eap' + } + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} +sourceSets { + main.java.srcDirs += 'src/main/kotlin' +} + +// VERSION: $VERSION$ diff --git a/idea/testData/configuration/gradle/eapVersion_before.gradle b/idea/testData/configuration/gradle/eapVersion_before.gradle new file mode 100644 index 00000000000..159e1273773 --- /dev/null +++ b/idea/testData/configuration/gradle/eapVersion_before.gradle @@ -0,0 +1,14 @@ +apply plugin: 'java' + +sourceCompatibility = 1.5 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.11' +} + +// VERSION: 1.0.2-eap-14-IJ143-14 \ No newline at end of file diff --git a/idea/testData/configuration/gradle/rcVersion_after.gradle b/idea/testData/configuration/gradle/rcVersion_after.gradle new file mode 100644 index 00000000000..4e0d7d7fa0d --- /dev/null +++ b/idea/testData/configuration/gradle/rcVersion_after.gradle @@ -0,0 +1,33 @@ +apply plugin: 'java' +apply plugin: 'kotlin' + +sourceCompatibility = 1.5 +version = '1.0' + +repositories { + mavenCentral() + maven { + url 'http://dl.bintray.com/kotlin/kotlin-eap' + } +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.11' + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" +} +buildscript { + ext.kotlin_version = '$VERSION$' + repositories { + maven { + url 'http://dl.bintray.com/kotlin/kotlin-eap' + } + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} +sourceSets { + main.java.srcDirs += 'src/main/kotlin' +} + +// VERSION: $VERSION$ diff --git a/idea/testData/configuration/gradle/rcVersion_before.gradle b/idea/testData/configuration/gradle/rcVersion_before.gradle new file mode 100644 index 00000000000..b0c5387aec6 --- /dev/null +++ b/idea/testData/configuration/gradle/rcVersion_before.gradle @@ -0,0 +1,14 @@ +apply plugin: 'java' + +sourceCompatibility = 1.5 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.11' +} + +// VERSION: 1.0.1-rc-26-IJ143-42 \ No newline at end of file diff --git a/idea/testData/configuration/maven/simpleProjectEAP/pom.xml b/idea/testData/configuration/maven/simpleProjectEAP/pom.xml new file mode 100644 index 00000000000..f8101a5a088 --- /dev/null +++ b/idea/testData/configuration/maven/simpleProjectEAP/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + + diff --git a/idea/testData/configuration/maven/simpleProjectEAP/pom_after.xml b/idea/testData/configuration/maven/simpleProjectEAP/pom_after.xml new file mode 100644 index 00000000000..ec3da32c8c1 --- /dev/null +++ b/idea/testData/configuration/maven/simpleProjectEAP/pom_after.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + + + + + + test-compile + test-compile + + test-compile + + + + + + + + + + + + + true + + + false + + bintray.kotlin.eap + Bintray Kotlin EAP Repository + http://dl.bintray.com/kotlin/kotlin-eap + + + + + + true + + + false + + bintray.kotlin.eap + Bintray Kotlin EAP Repository + http://dl.bintray.com/kotlin/kotlin-eap + + + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + + $VERSION$ + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/maven/simpleProjectRc/pom.xml b/idea/testData/configuration/maven/simpleProjectRc/pom.xml new file mode 100644 index 00000000000..7a61deb139c --- /dev/null +++ b/idea/testData/configuration/maven/simpleProjectRc/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + + diff --git a/idea/testData/configuration/maven/simpleProjectRc/pom_after.xml b/idea/testData/configuration/maven/simpleProjectRc/pom_after.xml new file mode 100644 index 00000000000..d55ecdc5d21 --- /dev/null +++ b/idea/testData/configuration/maven/simpleProjectRc/pom_after.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + + + + + + test-compile + test-compile + + test-compile + + + + + + + + + + + + + true + + + false + + bintray.kotlin.eap + Bintray Kotlin EAP Repository + http://dl.bintray.com/kotlin/kotlin-eap + + + + + + true + + + false + + bintray.kotlin.eap + Bintray Kotlin EAP Repository + http://dl.bintray.com/kotlin/kotlin-eap + + + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + + $VERSION$ + + + + + diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureProjectByChangingFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureProjectByChangingFileTestGenerated.java index 475fad293f7..849f74fd03d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureProjectByChangingFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureProjectByChangingFileTestGenerated.java @@ -43,6 +43,12 @@ public class ConfigureProjectByChangingFileTestGenerated extends AbstractConfigu doTestGradle(fileName); } + @TestMetadata("eapVersion_before.gradle") + public void testEapVersion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/gradle/eapVersion_before.gradle"); + doTestGradle(fileName); + } + @TestMetadata("missedLibrary_before.gradle") public void testMissedLibrary() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/gradle/missedLibrary_before.gradle"); @@ -54,6 +60,12 @@ public class ConfigureProjectByChangingFileTestGenerated extends AbstractConfigu String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/gradle/plugin_present_before.gradle"); doTestGradle(fileName); } + + @TestMetadata("rcVersion_before.gradle") + public void testRcVersion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/gradle/rcVersion_before.gradle"); + doTestGradle(fileName); + } } @TestMetadata("idea/testData/configuration/maven") @@ -82,6 +94,18 @@ public class ConfigureProjectByChangingFileTestGenerated extends AbstractConfigu doTestWithMaven(fileName); } + @TestMetadata("simpleProjectEAP") + public void testSimpleProjectEAP() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/maven/simpleProjectEAP/"); + doTestWithMaven(fileName); + } + + @TestMetadata("simpleProjectRc") + public void testSimpleProjectRc() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/maven/simpleProjectRc/"); + doTestWithMaven(fileName); + } + @TestMetadata("simpleProjectSnapshot") public void testSimpleProjectSnapshot() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/maven/simpleProjectSnapshot/");