diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt deleted file mode 100644 index b06ce9283a9..00000000000 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/MultiplatformGradleProjectTaskRunner.kt +++ /dev/null @@ -1,189 +0,0 @@ -/* - * 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.run - -import com.intellij.execution.configurations.JavaRunConfigurationModule -import com.intellij.execution.configurations.ModuleBasedConfiguration -import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager -import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType -import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil -import com.intellij.openapi.module.Module -import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ModuleOrderEntry -import com.intellij.openapi.roots.ModuleRootModel -import com.intellij.openapi.roots.OrderEnumerationHandler -import com.intellij.openapi.roots.OrderRootType -import com.intellij.openapi.vfs.VfsUtilCore -import com.intellij.task.* -import com.intellij.task.impl.ModuleBuildTaskImpl -import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider -import org.jetbrains.kotlin.config.TargetPlatformKind -import org.jetbrains.kotlin.idea.project.targetPlatform -import org.jetbrains.kotlin.idea.util.rootManager -import org.jetbrains.plugins.gradle.execution.build.GradleProjectTaskRunner -import org.jetbrains.plugins.gradle.model.ExternalSourceDirectorySet -import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache -import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings -import org.jetbrains.plugins.gradle.util.GradleConstants -import java.io.File -import kotlin.concurrent.getOrSet - -/** - * Ensures that build/run actions are always delegated to Gradle for multiplatform projects. - */ -class MultiplatformGradleProjectTaskRunner : GradleProjectTaskRunner() { - - override fun canRun(projectTask: ProjectTask) = - when (projectTask) { - is ModuleBuildTask -> - projectTask.module.isMultiplatformModule() - - is ExecuteRunConfigurationTask -> { - val runProfile = projectTask.runProfile - if (runProfile is ModuleBasedConfiguration<*>) { - runProfile.configurationModule.module?.isMultiplatformModule() == true - } else { - false - } - } - - - else -> false - } - - override fun run( - project: Project, - context: ProjectTaskContext, - callback: ProjectTaskNotification?, - tasks: Collection - ) { - val configuration = context.runConfiguration - if (configuration is ModuleBasedConfiguration<*> && - (configuration.configurationModule is JavaRunConfigurationModule || configuration is KotlinRunConfiguration) - ) { - - val module = configuration.configurationModule.module - if (module?.targetPlatform == TargetPlatformKind.Common) { - val implModule = module.findJvmImplementationModule() - if (implModule != null) { - val replacedTasks = tasks.map { it.replaceModule(module, implModule) } - super.run(project, context, callback, replacedTasks) - return - } - } - } - - super.run(project, context, callback, tasks) - } - - private fun ProjectTask.replaceModule(origin: Module, replacement: Module): ProjectTask = - when (this) { - is ModuleFilesBuildTask -> this - - is ModuleBuildTask -> - if (module == origin) - ModuleBuildTaskImpl(replacement, isIncrementalBuild, isIncludeDependentModules, isIncludeRuntimeDependencies) - else - this - - else -> this - } -} - -class MultiplatformGradleOrderEnumeratorHandler(val factory: MultiplatformGradleOrderEnumeratorHandler.FactoryImpl) : - OrderEnumerationHandler() { - override fun addCustomModuleRoots( - type: OrderRootType, - rootModel: ModuleRootModel, - result: MutableCollection, - includeProduction: Boolean, - includeTests: Boolean - ): Boolean { - if (factory.isEnumerating(rootModel.module)) return false - factory.startEnumerating(rootModel.module) - try { - if (type != OrderRootType.CLASSES) return false - if (!ExternalSystemApiUtil.isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, rootModel.module)) return false - - if (!GradleSystemRunningSettings.getInstance().isUseGradleAwareMake) { - val gradleProjectPath = - ExternalSystemModulePropertyManager.getInstance(rootModel.module).getRootProjectPath() ?: return false - val externalProjectDataCache = ExternalProjectDataCache.getInstance(rootModel.module.project)!! - val externalRootProject = externalProjectDataCache.getRootExternalProject( - GradleConstants.SYSTEM_ID, - File(gradleProjectPath) - ) ?: return false - - val externalSourceSets = externalProjectDataCache.findExternalProject(externalRootProject, rootModel.module) - - for (sourceSet in externalSourceSets.values) { - if (includeTests) { - addOutputModuleRoots(sourceSet.sources[ExternalSystemSourceType.TEST], result) - } - if (includeProduction) { - addOutputModuleRoots(sourceSet.sources[ExternalSystemSourceType.SOURCE], result) - } - } - } - - val implModule = rootModel.module.findJvmImplementationModule() - implModule - ?.rootManager - ?.orderEntries() - ?.satisfying { orderEntry -> (orderEntry as? ModuleOrderEntry)?.module != rootModel.module } - ?.compileOnly() - ?.classesRoots - ?.mapTo(result) { it.url } - - } finally { - factory.doneEnumerating(rootModel.module) - } - return false - } - - private fun addOutputModuleRoots(directorySet: ExternalSourceDirectorySet?, result: MutableCollection) { - directorySet?.gradleOutputDirs?.mapTo(result) { VfsUtilCore.pathToUrl(it.absolutePath) } - } - - class FactoryImpl : Factory() { - private val activeSet = ThreadLocal>() - - fun startEnumerating(module: Module) { - activeSet.getOrSet { hashSetOf() } += module - } - - fun doneEnumerating(module: Module) { - activeSet.get()?.remove(module) - } - - fun isEnumerating(module: Module) = activeSet.get()?.contains(module) ?: false - - override fun isApplicable(module: Module): Boolean { - return ExternalSystemApiUtil.isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, module) && - module.isMultiplatformModule() && - !isEnumerating(module) - } - - override fun createHandler(module: Module): OrderEnumerationHandler = - MultiplatformGradleOrderEnumeratorHandler(this) - } -} - -private fun Module.isMultiplatformModule(): Boolean { - val settings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this) - return settings.targetPlatformKind is TargetPlatformKind.Common || settings.implementedModuleNames.isNotEmpty() -} diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMultiplatformRunTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMultiplatformRunTest.kt deleted file mode 100644 index 7d56127d689..00000000000 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMultiplatformRunTest.kt +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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.codeInsight.gradle - -import com.intellij.compiler.options.CompileStepBeforeRun -import com.intellij.execution.Location -import com.intellij.execution.PsiLocation -import com.intellij.execution.actions.ConfigurationContext -import com.intellij.execution.actions.RunConfigurationProducer -import com.intellij.execution.configurations.JavaCommandLineState -import com.intellij.execution.executors.DefaultRunExecutor -import com.intellij.execution.runners.ExecutionEnvironmentBuilder -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.actionSystem.LangDataKeys -import com.intellij.openapi.application.invokeAndWaitIfNeed -import com.intellij.psi.PsiManager -import com.intellij.testFramework.MapDataContext -import org.jetbrains.kotlin.idea.run.KotlinRunConfigurationProducer -import org.jetbrains.kotlin.idea.util.module -import org.jetbrains.kotlin.psi.KtFile -import org.junit.Test - -class GradleMultiplatformRunTest : GradleImportingTestCase() { - @Test - fun testMultiplatformClasspath() { - createProjectSubFile( - "build.gradle", - """ - buildscript { - repositories { - jcenter() - mavenCentral() - } - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4") - } - } - - apply plugin: 'kotlin-platform-common' - - repositories { - jcenter() - mavenCentral() - } - - dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.1.4" - } - - """.trimIndent() - ) - createProjectSubFile( - "settings.gradle", - """ - rootProject.name = 'MultiTest' - include 'MultiTest-jvm', 'MultiTest-js' - """.trimIndent() - ) - createProjectSubFile( - "MultiTest-js/build.gradle", - """ - buildscript { - repositories { - jcenter() - mavenCentral() - } - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4") - } - } - - apply plugin: 'kotlin-platform-js' - - repositories { - jcenter() - mavenCentral() - } - - dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.1.4" - implement project(":") - } - - """.trimIndent() - ) - createProjectSubFile( - "MultiTest-jvm/build.gradle", - """ - buildscript { - repositories { - jcenter() - mavenCentral() - } - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4") - } - } - - apply plugin: 'kotlin-platform-jvm' - - repositories { - jcenter() - mavenCentral() - } - - dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:1.1.4" - implement project(":") - } - - """.trimIndent() - ) - val virtualFile = createProjectSubFile("src/main/kotlin/foo.kt", "fun main(args: Array) { println(\"Foo!\") }") - - importProject() - - val javaParameters = invokeAndWaitIfNeed { - val psiFile = PsiManager.getInstance(myProject).findFile(virtualFile) as KtFile - val function = psiFile.declarations.single() - val dataContext = MapDataContext().apply { - put(CommonDataKeys.PROJECT, myProject) - put(LangDataKeys.MODULE, function.module) - put(Location.DATA_KEY, PsiLocation.fromPsiElement(function)) - } - val configurationContext = ConfigurationContext.getFromContext(dataContext) - val producer = RunConfigurationProducer.getInstance(KotlinRunConfigurationProducer::class.java) - val configuration = producer.createConfigurationFromContext(configurationContext)!! - - val executionEnvironment = ExecutionEnvironmentBuilder.create( - myProject, - DefaultRunExecutor.getRunExecutorInstance(), - configuration.configuration - ) - .build() - - val compileStepBeforeRun = CompileStepBeforeRun(myProject) - compileStepBeforeRun.executeTask( - dataContext, configuration.configuration, executionEnvironment, - CompileStepBeforeRun.MakeBeforeRunTask() - ) - - val state = configuration.configuration.getState( - DefaultRunExecutor.getRunExecutorInstance(), - executionEnvironment - ) as JavaCommandLineState - state.javaParameters - - } - - val p = javaParameters.classPath - assertTrue(p.virtualFiles.any { it.findChild("FooKt.class") != null }) - } -} \ No newline at end of file diff --git a/idea/src/META-INF/gradle-java.xml.182 b/idea/src/META-INF/gradle-java.xml.182 index be87b9e4854..8d8b9b45656 100644 --- a/idea/src/META-INF/gradle-java.xml.182 +++ b/idea/src/META-INF/gradle-java.xml.182 @@ -50,9 +50,6 @@ - - - diff --git a/idea/src/META-INF/gradle.xml b/idea/src/META-INF/gradle.xml index f79cdc114cb..f62cfd06c45 100644 --- a/idea/src/META-INF/gradle.xml +++ b/idea/src/META-INF/gradle.xml @@ -58,9 +58,6 @@ - - - diff --git a/idea/src/META-INF/gradle.xml.172 b/idea/src/META-INF/gradle.xml.172 index 077b62ee12d..e980618a8bd 100644 --- a/idea/src/META-INF/gradle.xml.172 +++ b/idea/src/META-INF/gradle.xml.172 @@ -60,9 +60,6 @@ - - -