From 43ee2bd9c4ab9cacf110d1fa2980be8acb57c97c Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Thu, 27 Jul 2017 00:05:03 +0300 Subject: [PATCH] Add new Gradle with Kotlin DSL project wizard for Kotlin, KotlinJS, Java, Groovy #KT-20308 Fixed Target Version 1.2 --- idea/idea-gradle/idea-gradle.iml | 1 + .../Gradle Kotlin DSL Build Script.gradle.ft | 4 +- .../Gradle Kotlin DSL Settings.gradle.ft | 3 + .../kotlin/gradle/kdsl/GradleConstants.kt | 21 ++++ .../kdsl/GradleFrameworksWizardStep.form | 2 +- .../kdsl/GradleFrameworksWizardStep.java | 14 +-- .../gradle/kdsl/GradleModuleBuilder.java | 32 +++-- .../gradle/kdsl/GradleModuleWizardStep.form | 2 +- .../gradle/kdsl/GradleModuleWizardStep.java | 9 +- .../GradleProjectImportProvider.kt} | 4 +- .../GradleProjectOpenProcessor.kt} | 4 +- .../BuildScriptDataBuilder.java | 6 +- .../GradleFrameworkSupportProvider.java | 12 +- .../GradleGroovyFrameworkSupportProvider.java | 14 +-- .../GradleJavaFrameworkSupportProvider.java | 13 +- .../GradleKotlinFrameworkSupportProvider.kt | 116 ++++++++++++++++++ .../KotlinBuildScriptDataBuilder.kt | 93 ++++++++++++++ .../KotlinBuildScriptManipulator.kt | 25 ++-- idea/src/META-INF/extensions/common.xml | 2 + idea/src/META-INF/plugin.xml | 11 +- .../ConfigureKotlinInProjectUtils.kt | 4 +- 21 files changed, 310 insertions(+), 82 deletions(-) create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleConstants.kt rename idea/idea-gradle/src/org/jetbrains/kotlin/gradle/{GradleKotlinDSLProjectImportProvider.kt => kdsl/GradleProjectImportProvider.kt} (91%) rename idea/idea-gradle/src/org/jetbrains/kotlin/gradle/{GradleKotlinDSLProjectOpenProcessor.kt => kdsl/GradleProjectOpenProcessor.kt} (89%) create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleKotlinFrameworkSupportProvider.kt create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/KotlinBuildScriptDataBuilder.kt diff --git a/idea/idea-gradle/idea-gradle.iml b/idea/idea-gradle/idea-gradle.iml index d3009207901..018e6d6eeaa 100644 --- a/idea/idea-gradle/idea-gradle.iml +++ b/idea/idea-gradle/idea-gradle.iml @@ -4,6 +4,7 @@ + diff --git a/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Build Script.gradle.ft b/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Build Script.gradle.ft index a7226056799..ebc627176ec 100644 --- a/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Build Script.gradle.ft +++ b/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Build Script.gradle.ft @@ -1,6 +1,6 @@ #if (${MODULE_GROUP} && ${MODULE_GROUP} != "") -group '${MODULE_GROUP}' +group = "${MODULE_GROUP}" #end #if (${MODULE_VERSION} && ${MODULE_VERSION} != "") -version '${MODULE_VERSION}' +version = "${MODULE_VERSION}" #end diff --git a/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Settings.gradle.ft b/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Settings.gradle.ft index 0dc6b90a653..f69ee4ccb47 100644 --- a/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Settings.gradle.ft +++ b/idea/idea-gradle/res/fileTemplates/Gradle Kotlin DSL Settings.gradle.ft @@ -14,4 +14,7 @@ include '${MODULE_PATH}' findProject(':${MODULE_PATH}')?.name = '${MODULE_NAME}' #end #end +#if (${BUILD_FILE_NAME} && ${BUILD_FILE_NAME} != "") +rootProject.buildFileName = '${BUILD_FILE_NAME}' +#end diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleConstants.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleConstants.kt new file mode 100644 index 00000000000..0e47c8a1a5d --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleConstants.kt @@ -0,0 +1,21 @@ +/* + * 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. + */ + +@file:JvmName("GradleKotlinDSLConstants") + +package org.jetbrains.kotlin.gradle.kdsl + +const val DEFAULT_SCRIPT_NAME = "build.gradle.kts" diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.form b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.form index ad9e68681c8..814609f97dd 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.form +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.form @@ -1,5 +1,5 @@ -
+ diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.java index c5a3c49c521..3cb08deadb5 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleFrameworksWizardStep.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * 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. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.service.project.wizard; +package org.jetbrains.kotlin.gradle.kdsl; import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider; import com.intellij.ide.util.newProjectWizard.AddSupportForFrameworksPanel; @@ -32,18 +32,14 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.components.JBLabel; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.gradle.frameworkSupport.GradleFrameworkSupportProvider; -import org.jetbrains.plugins.gradle.frameworkSupport.GradleJavaFrameworkSupportProvider; +import org.jetbrains.kotlin.gradle.kdsl.frameworkSupport.GradleFrameworkSupportProvider; +import org.jetbrains.kotlin.gradle.kdsl.frameworkSupport.GradleJavaFrameworkSupportProvider; import javax.swing.*; import java.awt.*; import java.util.Collections; import java.util.List; -/** - * @author Vladislav.Soroka - * @since 4/20/2015 - */ public class GradleFrameworksWizardStep extends ModuleWizardStep implements Disposable { private JPanel myPanel; @@ -52,7 +48,7 @@ public class GradleFrameworksWizardStep extends ModuleWizardStep implements Disp private JPanel myOptionsPanel; @SuppressWarnings("unused") private JBLabel myFrameworksLabel; - public GradleFrameworksWizardStep(WizardContext context, final GradleModuleBuilder builder) { + public GradleFrameworksWizardStep(WizardContext context, final ModuleBuilder builder) { Project project = context.getProject(); final LibrariesContainer container = LibrariesContainerFactory.createContainer(context.getProject()); diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleBuilder.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleBuilder.java index a8f19a2976c..48be5be61c2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleBuilder.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2017 JetBrains s.r.o. + * 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. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.service.project.wizard; +package org.jetbrains.kotlin.gradle.kdsl; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; @@ -68,7 +68,8 @@ import org.gradle.util.GradleVersion; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.gradle.frameworkSupport.BuildScriptDataBuilder; +import org.jetbrains.kotlin.gradle.kdsl.frameworkSupport.BuildScriptDataBuilder; +import org.jetbrains.kotlin.gradle.kdsl.frameworkSupport.KotlinBuildScriptDataBuilder; import org.jetbrains.plugins.gradle.service.settings.GradleProjectSettingsControl; import org.jetbrains.plugins.gradle.settings.DistributionType; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; @@ -79,18 +80,16 @@ import java.io.File; import java.io.IOException; import java.util.Map; -/** - * @author Denis Zhdanov - * @since 6/26/13 11:10 AM - */ +import static org.jetbrains.kotlin.gradle.kdsl.GradleKotlinDSLConstants.DEFAULT_SCRIPT_NAME; + public class GradleModuleBuilder extends AbstractExternalModuleBuilder { private static final Logger LOG = Logger.getInstance(GradleModuleBuilder.class); - private static final String TEMPLATE_GRADLE_SETTINGS = "Gradle Settings.gradle"; + private static final String TEMPLATE_GRADLE_SETTINGS = "Gradle Kotlin DSL Settings.gradle"; private static final String TEMPLATE_GRADLE_SETTINGS_MERGE = "Gradle Settings merge.gradle"; private static final String TEMPLATE_GRADLE_BUILD_WITH_WRAPPER = "Gradle Build Script with wrapper.gradle"; - private static final String DEFAULT_TEMPLATE_GRADLE_BUILD = "Gradle Build Script.gradle"; + private static final String DEFAULT_TEMPLATE_GRADLE_BUILD = "Gradle Kotlin DSL Build Script.gradle"; private static final String TEMPLATE_ATTRIBUTE_PROJECT_NAME = "PROJECT_NAME"; private static final String TEMPLATE_ATTRIBUTE_MODULE_PATH = "MODULE_PATH"; @@ -99,8 +98,9 @@ public class GradleModuleBuilder extends AbstractExternalModuleBuilder BUILD_SCRIPT_DATA = - Key.create("gradle.module.buildScriptData"); + private static final String TEMPLATE_ATTRIBUTE_BUILD_FILE_NAME = "BUILD_FILE_NAME"; + private static final Key BUILD_SCRIPT_DATA = + Key.create("gradle.module.kotlinBuildScriptData"); private WizardContext myWizardContext; @@ -115,6 +115,11 @@ public class GradleModuleBuilder extends AbstractExternalModuleBuilder 4.0 doesn't need this saveFile(file, TEMPLATE_GRADLE_SETTINGS, attributes); } else { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.form b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.form index 4755ffd4a1f..b94d1e0017f 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.form +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.form @@ -1,5 +1,5 @@ - + diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.java index 13a5fab66cb..f540c42a4d1 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleModuleWizardStep.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * 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. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.service.project.wizard; +package org.jetbrains.kotlin.gradle.kdsl; import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.projectWizard.ModuleWizardStep; @@ -31,16 +31,13 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.service.project.wizard.GradleParentProjectForm; import org.jetbrains.plugins.gradle.util.GradleConstants; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -/** - * @author Vladislav.Soroka - * @since 4/15/2015 - */ public class GradleModuleWizardStep extends ModuleWizardStep { private static final Icon WIZARD_ICON = null; diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/GradleKotlinDSLProjectImportProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleProjectImportProvider.kt similarity index 91% rename from idea/idea-gradle/src/org/jetbrains/kotlin/gradle/GradleKotlinDSLProjectImportProvider.kt rename to idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleProjectImportProvider.kt index 7ca503561f4..13960c76f1d 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/GradleKotlinDSLProjectImportProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleProjectImportProvider.kt @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.kotlin.gradle +package org.jetbrains.kotlin.gradle.kdsl import com.intellij.openapi.externalSystem.service.project.wizard.AbstractExternalProjectImportProvider import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.plugins.gradle.service.project.wizard.GradleProjectImportBuilder import org.jetbrains.plugins.gradle.util.GradleConstants -class GradleKotlinDSLProjectImportProvider(builder: GradleProjectImportBuilder) +class GradleProjectImportProvider(builder: GradleProjectImportBuilder) : AbstractExternalProjectImportProvider(builder, GradleConstants.SYSTEM_ID) { override fun canImportFromFile(file: VirtualFile): Boolean = file.name.endsWith(".${GradleConstants.EXTENSION}.kts") diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/GradleKotlinDSLProjectOpenProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleProjectOpenProcessor.kt similarity index 89% rename from idea/idea-gradle/src/org/jetbrains/kotlin/gradle/GradleKotlinDSLProjectOpenProcessor.kt rename to idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleProjectOpenProcessor.kt index cff4a93a35e..36d21acef73 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/GradleKotlinDSLProjectOpenProcessor.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/GradleProjectOpenProcessor.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.jetbrains.kotlin.gradle +package org.jetbrains.kotlin.gradle.kdsl import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.plugins.gradle.service.project.wizard.GradleProjectImportBuilder import org.jetbrains.plugins.gradle.service.project.wizard.GradleProjectOpenProcessor import org.jetbrains.plugins.gradle.util.GradleConstants -class GradleKotlinDSLProjectOpenProcessor(builder: GradleProjectImportBuilder) : GradleProjectOpenProcessor(builder) { +class GradleProjectOpenProcessor(builder: GradleProjectImportBuilder) : GradleProjectOpenProcessor(builder) { override fun canOpenProject(file: VirtualFile): Boolean = when { !file.isDirectory -> file.name.endsWith(".gradle.kts") supportedExtensions.any { file.findChild(it) != null } -> true diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/BuildScriptDataBuilder.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/BuildScriptDataBuilder.java index c4175f2505c..679e583b4c3 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/BuildScriptDataBuilder.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/BuildScriptDataBuilder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.frameworkSupport; +package org.jetbrains.kotlin.gradle.kdsl.frameworkSupport; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -24,10 +24,6 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Set; -/** - * @author Vladislav.Soroka - * @since 4/24/2015 - */ public class BuildScriptDataBuilder { @NotNull private final VirtualFile myBuildScriptFile; private final Set plugins = ContainerUtil.newTreeSet(); diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleFrameworkSupportProvider.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleFrameworkSupportProvider.java index c160fb22060..cfe1c3eef59 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleFrameworkSupportProvider.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleFrameworkSupportProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2017 JetBrains s.r.o. + * 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. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.frameworkSupport; +package org.jetbrains.kotlin.gradle.kdsl.frameworkSupport; import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable; import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider; @@ -28,16 +28,12 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -import static org.jetbrains.plugins.gradle.service.project.wizard.GradleModuleBuilder.getBuildScriptData; +import static org.jetbrains.kotlin.gradle.kdsl.GradleModuleBuilder.getBuildScriptData; -/** - * @author Vladislav.Soroka - * @since 4/23/2015 - */ public abstract class GradleFrameworkSupportProvider extends FrameworkSupportInModuleProvider { public static final ExtensionPointName EP_NAME = - ExtensionPointName.create("org.jetbrains.plugins.gradle.frameworkSupport"); + ExtensionPointName.create("org.jetbrains.kotlin.gradleFrameworkSupport"); public abstract void addSupport(@NotNull Module module, @NotNull ModifiableRootModel rootModel, @NotNull ModifiableModelsProvider modifiableModelsProvider, diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleGroovyFrameworkSupportProvider.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleGroovyFrameworkSupportProvider.java index 8a1af87f508..7d9daced59c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleGroovyFrameworkSupportProvider.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleGroovyFrameworkSupportProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * 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. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.frameworkSupport; +package org.jetbrains.kotlin.gradle.kdsl.frameworkSupport; import com.intellij.framework.FrameworkTypeEx; import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider; @@ -25,10 +25,6 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; -/** - * @author Vladislav.Soroka - * @since 4/24/2015 - */ public class GradleGroovyFrameworkSupportProvider extends GradleFrameworkSupportProvider { public static final String ID = "groovy"; @@ -63,9 +59,9 @@ public class GradleGroovyFrameworkSupportProvider extends GradleFrameworkSupport @NotNull ModifiableModelsProvider modifiableModelsProvider, @NotNull BuildScriptDataBuilder buildScriptData) { buildScriptData - .addPluginDefinition("apply plugin: 'groovy'") + .addPluginDefinition("plugin(\"groovy\")") .addRepositoriesDefinition("mavenCentral()") - .addDependencyNotation("compile 'org.codehaus.groovy:groovy-all:2.3.11'") - .addDependencyNotation("testCompile group: 'junit', name: 'junit', version: '4.12'"); + .addDependencyNotation("compile(\"org.codehaus.groovy:groovy-all:2.3.11\")") + .addDependencyNotation("testCompile(\"junit\", \"junit\", \"4.12\")"); } } \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleJavaFrameworkSupportProvider.java b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleJavaFrameworkSupportProvider.java index 44d3910499c..0bde690ccc1 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleJavaFrameworkSupportProvider.java +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleJavaFrameworkSupportProvider.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.plugins.gradle.frameworkSupport; +package org.jetbrains.kotlin.gradle.kdsl.frameworkSupport; import com.intellij.framework.FrameworkTypeEx; import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider; @@ -25,10 +25,6 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; -/** - * @author Vladislav.Soroka - * @since 4/23/2015 - */ public class GradleJavaFrameworkSupportProvider extends GradleFrameworkSupportProvider { public static final String ID = "java"; @@ -63,9 +59,10 @@ public class GradleJavaFrameworkSupportProvider extends GradleFrameworkSupportPr @NotNull ModifiableModelsProvider modifiableModelsProvider, @NotNull BuildScriptDataBuilder buildScriptData) { buildScriptData - .addPluginDefinition("apply plugin: 'java'") - .addPropertyDefinition("sourceCompatibility = 1.8") + .addPluginDefinition("plugin(\"java\")") + // TODO: in gradle > 4.0 it is just 'java { ... }' + .addOther("configure {\n sourceCompatibility = JavaVersion.VERSION_1_8\n}") .addRepositoriesDefinition("mavenCentral()") - .addDependencyNotation("testCompile group: 'junit', name: 'junit', version: '4.12'"); + .addDependencyNotation("testCompile(\"junit\", \"junit\", \"4.12\")"); } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleKotlinFrameworkSupportProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleKotlinFrameworkSupportProvider.kt new file mode 100644 index 00000000000..0790e06bd38 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/GradleKotlinFrameworkSupportProvider.kt @@ -0,0 +1,116 @@ +/* + * 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.gradle.kdsl.frameworkSupport + +import com.intellij.framework.FrameworkTypeEx +import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider +import com.intellij.openapi.module.Module +import com.intellij.openapi.roots.ModifiableModelsProvider +import com.intellij.openapi.roots.ModifiableRootModel +import com.intellij.openapi.vfs.VfsUtil +import org.jetbrains.kotlin.idea.KotlinIcons +import org.jetbrains.kotlin.idea.configuration.* +import org.jetbrains.kotlin.idea.configuration.KotlinBuildScriptManipulator.Companion.GSK_KOTLIN_VERSION_PROPERTY_NAME +import org.jetbrains.kotlin.idea.configuration.KotlinBuildScriptManipulator.Companion.getCompileDependencySnippet +import org.jetbrains.kotlin.idea.configuration.KotlinBuildScriptManipulator.Companion.getKotlinGradlePluginClassPathSnippet +import org.jetbrains.kotlin.idea.versions.MAVEN_JS_STDLIB_ID +import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion +import org.jetbrains.kotlin.idea.versions.getDefaultJvmTarget +import org.jetbrains.kotlin.idea.versions.getStdlibArtifactId +import javax.swing.Icon + +abstract class GradleKotlinDSLKotlinFrameworkSupportProvider( + val frameworkTypeId: String, + val displayName: String, + val frameworkIcon: Icon +) : GradleFrameworkSupportProvider() { + override fun getFrameworkType(): FrameworkTypeEx = object : FrameworkTypeEx(frameworkTypeId) { + override fun getIcon(): Icon = frameworkIcon + override fun getPresentableName(): String = displayName + override fun createProvider(): FrameworkSupportInModuleProvider = this@GradleKotlinDSLKotlinFrameworkSupportProvider + } + + override fun addSupport(module: Module, + rootModel: ModifiableRootModel, + modifiableModelsProvider: ModifiableModelsProvider, + buildScriptData: BuildScriptDataBuilder) { + var kotlinVersion = bundledRuntimeVersion() + val additionalRepository = getRepositoryForVersion(kotlinVersion) + if (isSnapshot(bundledRuntimeVersion())) { + kotlinVersion = "1.1-SNAPSHOT" + } + + if (additionalRepository != null) { + val repository = additionalRepository.toKotlinRepositorySnippet() + buildScriptData.addBuildscriptRepositoriesDefinition(repository) + buildScriptData.addRepositoriesDefinition("mavenCentral()") + buildScriptData.addRepositoriesDefinition(repository) + } + + buildScriptData + .addPropertyDefinition("val $GSK_KOTLIN_VERSION_PROPERTY_NAME: String by extra") + .addPluginDefinition(getPluginDefinition()) + .addBuildscriptRepositoriesDefinition("mavenCentral()") + .addRepositoriesDefinition("mavenCentral()") + // TODO: in gradle > 4.1 this could be single declaration e.g. 'val kotlin_version: String by extra { "1.1.11" }' + .addBuildscriptPropertyDefinition("var $GSK_KOTLIN_VERSION_PROPERTY_NAME: String by extra\n$GSK_KOTLIN_VERSION_PROPERTY_NAME = \"$kotlinVersion\"") + .addDependencyNotation(getRuntimeLibrary(rootModel)) + .addBuildscriptDependencyNotation(getKotlinGradlePluginClassPathSnippet()) + } + + protected abstract fun getRuntimeLibrary(rootModel: ModifiableRootModel): String + + protected abstract fun getPluginDefinition(): String +} + +class GradleKotlinDSLKotlinJavaFrameworkSupportProvider : + GradleKotlinDSLKotlinFrameworkSupportProvider("KOTLIN", "Kotlin (Java)", KotlinIcons.SMALL_LOGO) { + + override fun getPluginDefinition() = "plugin(\"${KotlinGradleModuleConfigurator.KOTLIN}\")" + + override fun getRuntimeLibrary(rootModel: ModifiableRootModel) = + getCompileDependencySnippet(KOTLIN_GROUP_ID, getStdlibArtifactId(rootModel.sdk, bundledRuntimeVersion())) + + override fun addSupport( + module: Module, + rootModel: ModifiableRootModel, + modifiableModelsProvider: ModifiableModelsProvider, + buildScriptData: BuildScriptDataBuilder + ) { + super.addSupport(module, rootModel, modifiableModelsProvider, buildScriptData) + val jvmTarget = getDefaultJvmTarget(rootModel.sdk, bundledRuntimeVersion()) + if (jvmTarget != null) { + buildScriptData + .addImports("import org.jetbrains.kotlin.gradle.tasks.KotlinCompile") + .addOther("tasks.withType {\n kotlinOptions.jvmTarget = \"1.8\"\n}\n") + } + } + + private fun BuildScriptDataBuilder.addImports(vararg import: String): BuildScriptDataBuilder = apply { + val text = VfsUtil.loadText(buildScriptFile) + VfsUtil.saveText(buildScriptFile, import.joinToString(separator = "\n") + "\n\n" + text) + } +} + +class GradleKotlinDSLKotlinJSFrameworkSupportProvider : + GradleKotlinDSLKotlinFrameworkSupportProvider("KOTLIN_JS", "Kotlin (JavaScript)", KotlinIcons.JS) { + + override fun getPluginDefinition(): String = "plugin(\"${KotlinJsGradleModuleConfigurator.KOTLIN_JS}\")" + + override fun getRuntimeLibrary(rootModel: ModifiableRootModel) = + getCompileDependencySnippet(KOTLIN_GROUP_ID, MAVEN_JS_STDLIB_ID.removePrefix("kotlin-")) +} diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/KotlinBuildScriptDataBuilder.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/KotlinBuildScriptDataBuilder.kt new file mode 100644 index 00000000000..950eb9ae738 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/gradle/kdsl/frameworkSupport/KotlinBuildScriptDataBuilder.kt @@ -0,0 +1,93 @@ +/* + * 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.gradle.kdsl.frameworkSupport + +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.util.containers.ContainerUtil + +class KotlinBuildScriptDataBuilder(buildScriptFile: VirtualFile) : BuildScriptDataBuilder(buildScriptFile) { + private val plugins: MutableSet = ContainerUtil.newTreeSet() + private val properties: MutableSet = ContainerUtil.newTreeSet() + private val repositories: MutableSet = ContainerUtil.newTreeSet() + private val dependencies: MutableSet = ContainerUtil.newTreeSet() + + private val buildScriptProperties: MutableSet = ContainerUtil.newTreeSet() + private val buildScriptRepositories: MutableSet = ContainerUtil.newTreeSet() + private val buildScriptDependencies: MutableSet = ContainerUtil.newTreeSet() + private val other: MutableSet = ContainerUtil.newTreeSet() + + override fun addPluginDefinition(definition: String): BuildScriptDataBuilder = apply { plugins.add(definition) } + + override fun addRepositoriesDefinition(definition: String): BuildScriptDataBuilder = apply { repositories.add(definition) } + + override fun addPropertyDefinition(definition: String): BuildScriptDataBuilder = apply { properties.add(definition) } + + override fun addDependencyNotation(notation: String): BuildScriptDataBuilder = apply { dependencies.add(notation) } + + override fun addBuildscriptPropertyDefinition(definition: String): BuildScriptDataBuilder = apply { buildScriptProperties.add(definition) } + + override fun addBuildscriptRepositoriesDefinition(definition: String): BuildScriptDataBuilder = apply { buildScriptRepositories.add(definition) } + + override fun addBuildscriptDependencyNotation(notation: String): BuildScriptDataBuilder = apply { buildScriptDependencies.add(notation) } + + override fun addOther(definition: String): BuildScriptDataBuilder = apply { other.add(definition) } + + override fun buildMainPart(): String = buildString { + + appendlnIfNotNull(buildBuildScriptBlock()) + + appendlnIfNotNull(buildBlock("apply", plugins)) + + if (properties.isNotEmpty()) { + properties.forEach { appendln(it) } + appendln() + } + + appendlnIfNotNull(buildBlock("repositories", repositories)) + + appendlnIfNotNull(buildBlock("dependencies", dependencies)) + + other.forEach { appendln(it) } + } + + private fun buildBuildScriptBlock(): String? = buildString { + if (buildScriptProperties.isEmpty() || buildScriptRepositories.isEmpty() || buildScriptDependencies.isEmpty()) { + return null + } + + appendln("buildscript {") + buildScriptProperties.forEach { appendln(it.withMargin) } + appendln() + appendlnIfNotNull(buildBlock("repositories", buildScriptRepositories)?.withMargin) + appendlnIfNotNull(buildBlock("dependencies", buildScriptDependencies)?.withMargin) + appendln("}") + } + + private fun buildBlock(name: String, lines: Set): String? = buildString { + if (lines.isEmpty()) { + return null + } + + appendln("$name {") + lines.forEach { appendln(it.withMargin) } + appendln("}") + } + + private val String.withMargin: String + get() = lines().joinToString(separator = "\n") { " " + it } + + private fun StringBuilder.appendlnIfNotNull(text: String?) = text?.let { appendln(it) } +} diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt index cea62f5815e..18ae067e60a 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt @@ -125,15 +125,6 @@ class KotlinBuildScriptManipulator(private val kotlinScript: KtFile) : GradleBui private fun KtCallExpression.getBlock(): KtBlockExpression? = (valueArguments.singleOrNull()?.getArgumentExpression() as? KtLambdaExpression)?.bodyExpression - private fun getCompileDependencySnippet(groupId: String, artifactId: String, compileScope: String = "compile", version: String? = null): String = - if (groupId == KOTLIN_GROUP_ID) - "$compileScope(${getKotlinModuleDependencySnippet(artifactId, version)})" - else - "$compileScope(\"$groupId:$artifactId:$version\")" - - private fun getKotlinModuleDependencySnippet(artifactId: String, version: String? = null): String = - "kotlinModule(\"${artifactId.removePrefix("kotlin-")}\", ${version?.let { "\"$it\"" } ?: GSK_KOTLIN_VERSION_PROPERTY_NAME})" - private fun KtFile.getKotlinStdlibVersion(): String? { return findScriptInitializer("dependencies")?.getBlock()?.let { val expression = it.findCompileStdLib()?.valueArguments?.firstOrNull()?.getArgumentExpression() @@ -233,8 +224,7 @@ class KotlinBuildScriptManipulator(private val kotlinScript: KtFile) : GradleBui } private fun KtBlockExpression.addPluginToClassPathIfMissing(): KtCallExpression? = - addExpressionIfMissing("classpath(${getKotlinModuleDependencySnippet("gradle-plugin")})") as? KtCallExpression - + addExpressionIfMissing(getKotlinGradlePluginClassPathSnippet()) as? KtCallExpression private fun KtBlockExpression.addBlock(name: String): KtBlockExpression? { return add(psiFactory.createExpression("$name {\n}")) @@ -313,6 +303,17 @@ class KotlinBuildScriptManipulator(private val kotlinScript: KtFile) : GradleBui companion object { private val STDLIB_ARTIFACT_PREFIX = "org.jetbrains.kotlin:kotlin-stdlib" - private val GSK_KOTLIN_VERSION_PROPERTY_NAME = "kotlin_version" + val GSK_KOTLIN_VERSION_PROPERTY_NAME = "kotlin_version" + + fun getKotlinGradlePluginClassPathSnippet(): String = "classpath(${getKotlinModuleDependencySnippet("gradle-plugin")})" + + fun getKotlinModuleDependencySnippet(artifactId: String, version: String? = null): String = + "kotlinModule(\"${artifactId.removePrefix("kotlin-")}\", ${version?.let { "\"$it\"" } ?: GSK_KOTLIN_VERSION_PROPERTY_NAME})" + + fun getCompileDependencySnippet(groupId: String, artifactId: String, compileScope: String = "compile", version: String? = null): String = + if (groupId == KOTLIN_GROUP_ID) + "$compileScope(${Companion.getKotlinModuleDependencySnippet(artifactId, version)})" + else + "$compileScope(\"$groupId:$artifactId:$version\")" } } diff --git a/idea/src/META-INF/extensions/common.xml b/idea/src/META-INF/extensions/common.xml index d7f8606e21d..f90a599ff4f 100644 --- a/idea/src/META-INF/extensions/common.xml +++ b/idea/src/META-INF/extensions/common.xml @@ -49,5 +49,7 @@ interface="org.jetbrains.kotlin.idea.completion.CompletionInformationProvider" /> + diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 3e03d311c65..e1b70fa0e58 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -2626,10 +2626,12 @@ - - + + + + @@ -2657,6 +2659,11 @@ + + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index aab667de1c3..6050707fbec 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -90,9 +90,9 @@ fun DependencyScope.toGradleCompileScope(isAndroidModule: Boolean) = when (this) else -> "compile" } -fun RepositoryDescription.toGroovyRepositorySnippet() = "maven {\nurl '$url'\n}" +fun RepositoryDescription.toGroovyRepositorySnippet() = "maven {\n url '$url'\n}" -fun RepositoryDescription.toKotlinRepositorySnippet() = "maven {\nsetUrl(\"$url\")\n}" +fun RepositoryDescription.toKotlinRepositorySnippet() = "maven {\n setUrl(\"$url\")\n}" fun getRepositoryForVersion(version: String): RepositoryDescription? = when { isSnapshot(version) -> SNAPSHOT_REPOSITORY