From c7ea4eead7ec4b3ed3f0ee65da42c8adc94e2d0d Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 26 Jan 2017 13:51:25 +0100 Subject: [PATCH] Add Gradle JavaScript configurator --- idea/src/META-INF/gradle.xml | 1 + .../GradleKotlinFrameworkSupportProvider.kt | 4 +- .../KotlinGradleModuleConfigurator.java | 19 ---------- .../KotlinJsGradleModuleConfigurator.kt | 38 +++++++++++++++++++ .../KotlinWithGradleConfigurator.kt | 21 ++++++++-- .../configuration/gradle/js_after.gradle | 18 +++++++++ .../configuration/gradle/js_before.gradle | 5 +++ ...radleConfigureProjectByChangingFileTest.kt | 3 +- ...ureProjectByChangingFileTestGenerated.java | 6 +++ 9 files changed, 90 insertions(+), 25 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJsGradleModuleConfigurator.kt create mode 100644 idea/testData/configuration/gradle/js_after.gradle create mode 100644 idea/testData/configuration/gradle/js_before.gradle diff --git a/idea/src/META-INF/gradle.xml b/idea/src/META-INF/gradle.xml index c8e5a584701..a5ab6928978 100644 --- a/idea/src/META-INF/gradle.xml +++ b/idea/src/META-INF/gradle.xml @@ -41,6 +41,7 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt index 5dbe2055f85..fb7cb1afaed 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt @@ -92,7 +92,9 @@ class GradleKotlinJavaFrameworkSupportProvider : GradleKotlinFrameworkSupportPro } class GradleKotlinJSFrameworkSupportProvider : GradleKotlinFrameworkSupportProvider("KOTLIN_JS", "Kotlin (JavaScript)") { - override fun getPluginDefinition() = "apply plugin: 'kotlin2js'" + override fun getPluginDefinition(): String { + return KotlinJsGradleModuleConfigurator.APPLY_KOTLIN_JS + } override fun getRuntimeLibrary(rootModel: ModifiableRootModel) = KotlinWithGradleConfigurator.getDependencySnippet(MAVEN_JS_STDLIB_ID) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.java index 49bd6a4c65d..35278e47474 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.java @@ -16,12 +16,9 @@ package org.jetbrains.kotlin.idea.configuration; -import com.intellij.openapi.module.Module; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.idea.KotlinPluginUtil; import org.jetbrains.kotlin.resolve.TargetPlatform; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; public class KotlinGradleModuleConfigurator extends KotlinWithGradleConfigurator { public static final String NAME = "gradle"; @@ -46,27 +43,11 @@ public class KotlinGradleModuleConfigurator extends KotlinWithGradleConfigurator return "Gradle"; } - @Override - public boolean isApplicable(@NotNull Module module) { - return KotlinPluginUtil.isGradleModule(module) && - !KotlinPluginUtil.isAndroidGradleModule(module); - } - @Override protected String getApplyPluginDirective() { return APPLY_KOTLIN; } - @Override - protected boolean addElementsToFile(@NotNull GroovyFile groovyFile, boolean isTopLevelProjectFile, @NotNull String version) { - if (!isTopLevelProjectFile) { - boolean wasModified = Companion.addElementsToProjectFile(groovyFile, version); - wasModified |= addElementsToModuleFile(groovyFile, version); - return wasModified; - } - return false; - } - KotlinGradleModuleConfigurator() { } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJsGradleModuleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJsGradleModuleConfigurator.kt new file mode 100644 index 00000000000..5772e4d6542 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJsGradleModuleConfigurator.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.configuration + +import com.intellij.openapi.projectRoots.Sdk +import org.jetbrains.kotlin.idea.versions.MAVEN_JS_STDLIB_ID +import org.jetbrains.kotlin.js.resolve.JsPlatform +import org.jetbrains.kotlin.resolve.TargetPlatform + +class KotlinJsGradleModuleConfigurator : KotlinWithGradleConfigurator() { + override val name: String = "gradle-js" + override val presentableText: String = "Gradle (JavaScript)" + override val targetPlatform: TargetPlatform = JsPlatform + + override val applyPluginDirective: String = APPLY_KOTLIN_JS + + override fun getDependencyDirective(sdk: Sdk?): String { + return KotlinWithGradleConfigurator.getDependencySnippet(MAVEN_JS_STDLIB_ID) + } + + companion object { + val APPLY_KOTLIN_JS = "apply plugin: 'kotlin2js'" + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt index 1f7598864cf..a183a62bc40 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt @@ -71,7 +71,9 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { return ConfigureKotlinStatus.BROKEN } - protected abstract fun isApplicable(module: Module): Boolean + protected open fun isApplicable(module: Module): Boolean { + return KotlinPluginUtil.isGradleModule(module) && !KotlinPluginUtil.isAndroidGradleModule(module) + } private fun isFileConfigured(projectGradleFile: GroovyFile): Boolean { val fileText = projectGradleFile.text @@ -146,18 +148,29 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { val dependenciesBlock = getDependenciesBlock(file) val sdk = ModuleUtil.findModuleForPsiElement(file)?.let { ModuleRootManager.getInstance(it).sdk } - wasModified = wasModified or addExpressionInBlockIfNeeded(getRuntimeLibrary(sdk), dependenciesBlock, false) + wasModified = wasModified or addExpressionInBlockIfNeeded(getDependencyDirective(sdk), dependenciesBlock, false) return wasModified } + protected open fun getDependencyDirective(sdk: Sdk?) = getRuntimeLibrary(sdk) + protected abstract val applyPluginDirective: String - protected abstract fun addElementsToFile( + protected open fun addElementsToFile( groovyFile: GroovyFile, isTopLevelProjectFile: Boolean, version: String - ): Boolean + ): Boolean { + if (!isTopLevelProjectFile) { + var wasModified = addElementsToProjectFile(groovyFile, version) + wasModified = wasModified or addElementsToModuleFile(groovyFile, version) + return wasModified + } + return false + } + + fun changeGradleFile( groovyFile: GroovyFile, diff --git a/idea/testData/configuration/gradle/js_after.gradle b/idea/testData/configuration/gradle/js_after.gradle new file mode 100644 index 00000000000..d535b0cf238 --- /dev/null +++ b/idea/testData/configuration/gradle/js_after.gradle @@ -0,0 +1,18 @@ +version = '1.0' + +repositories { + mavenCentral() +} +buildscript { + ext.kotlin_version = '$VERSION$' + repositories { + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} +apply plugin: 'kotlin2js' +dependencies { + compile "org.jetbrains.kotlin:kotlin-js-library:$kotlin_version" +} diff --git a/idea/testData/configuration/gradle/js_before.gradle b/idea/testData/configuration/gradle/js_before.gradle new file mode 100644 index 00000000000..c53a58d9db6 --- /dev/null +++ b/idea/testData/configuration/gradle/js_before.gradle @@ -0,0 +1,5 @@ +version = '1.0' + +repositories { + mavenCentral() +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractGradleConfigureProjectByChangingFileTest.kt b/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractGradleConfigureProjectByChangingFileTest.kt index 1ae9014c996..1038efa95f5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractGradleConfigureProjectByChangingFileTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractGradleConfigureProjectByChangingFileTest.kt @@ -23,7 +23,8 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyFile abstract class AbstractGradleConfigureProjectByChangingFileTest : AbstractConfigureProjectByChangingFileTest() { fun doTestGradle(path: String) { - doTest(path, path.replace("before", "after"), KotlinGradleModuleConfigurator()) + doTest(path, path.replace("before", "after"), + if ("js" in path) KotlinJsGradleModuleConfigurator() else KotlinGradleModuleConfigurator()) } override fun runConfigurator(module: Module, file: PsiFile, configurator: KotlinWithGradleConfigurator, version: String, collector: NotificationMessageCollector) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/GradleConfigureProjectByChangingFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/GradleConfigureProjectByChangingFileTestGenerated.java index bca1071487e..e9fa036f952 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/GradleConfigureProjectByChangingFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/GradleConfigureProjectByChangingFileTestGenerated.java @@ -48,6 +48,12 @@ public class GradleConfigureProjectByChangingFileTestGenerated extends AbstractG doTestGradle(fileName); } + @TestMetadata("js_before.gradle") + public void testJs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/gradle/js_before.gradle"); + doTestGradle(fileName); + } + @TestMetadata("m04Version_before.gradle") public void testM04Version() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/gradle/m04Version_before.gradle");