From 7286fcbf39b751d72fdca6927f1416d1596a17ce Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 24 Apr 2020 17:40:44 +0300 Subject: [PATCH] Wizard: use new api from gradle to import project on >= 193 --- .../wizard/service/IdeaGradleWizardService.kt | 71 ++++----------- .../service/IdeaGradleWizardService.kt.191 | 88 +++++++++++++++++++ .../service/IdeaGradleWizardService.kt.192 | 88 +++++++++++++++++++ .../service/IdeaGradleWizardService.kt.201 | 48 ++++++++++ 4 files changed, 240 insertions(+), 55 deletions(-) create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.191 create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.192 create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.201 diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt index bb7f390e701..6d485c9908c 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt @@ -5,27 +5,15 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.service -import com.intellij.execution.executors.DefaultRunExecutor -import com.intellij.openapi.actionSystem.ActionPlaces -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.actionSystem.impl.SimpleDataContext -import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings -import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode -import com.intellij.openapi.externalSystem.util.ExternalSystemUtil import com.intellij.openapi.project.Project -import com.intellij.openapi.vfs.LocalFileSystem -import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.tools.projectWizard.core.Reader import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult -import org.jetbrains.kotlin.tools.projectWizard.core.andThen -import org.jetbrains.kotlin.tools.projectWizard.core.safe +import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle -import org.jetbrains.plugins.gradle.action.ImportProjectFromScriptAction -import org.jetbrains.plugins.gradle.util.GradleConstants +import org.jetbrains.plugins.gradle.service.project.open.linkAndRefreshGradleProject import java.nio.file.Path class IdeaGradleWizardService(private val project: Project) : ProjectImportingWizardService, @@ -33,54 +21,27 @@ class IdeaGradleWizardService(private val project: Project) : ProjectImportingWi override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = buildSystemType.isGradle - // We have to call action directly as there is no common way - // to import Gradle project in all IDEAs from 183 to 193 override fun importProject( reader: Reader, path: Path, modulesIrs: List, buildSystem: BuildSystemType - ): TaskResult = performImport(path) andThen createGradleWrapper(path) - - private fun performImport(path: Path) = safe { - val virtualFile = LocalFileSystem.getInstance().findFileByPath(path.toString())!! - val dataContext = SimpleDataContext.getSimpleContext( - mapOf( - CommonDataKeys.PROJECT.name to project, - CommonDataKeys.VIRTUAL_FILE.name to virtualFile - ), - null - ) - val action = ImportProjectFromScriptAction() - val event = AnActionEvent.createFromAnAction( - action, - null, - ActionPlaces.UNKNOWN, - dataContext - ) - action.actionPerformed(event) - } - - - private fun createGradleWrapper(path: Path) = safe { - val settings = ExternalSystemTaskExecutionSettings().apply { - externalProjectPath = path.toString() - taskNames = listOf(WRAPPER_TASK_NAME) - externalSystemIdString = GradleConstants.SYSTEM_ID.id + ): TaskResult { + withGradleWrapperEnabled { + linkAndRefreshGradleProject(path.toString(), project) } - - ExternalSystemUtil.runTask( - settings, - DefaultRunExecutor.EXECUTOR_ID, - project, - GradleConstants.SYSTEM_ID, - /*callback=*/ null, - ProgressExecutionMode.NO_PROGRESS_ASYNC - ) + return UNIT_SUCCESS } - companion object { - @NonNls - private const val WRAPPER_TASK_NAME = "wrapper" + private fun withGradleWrapperEnabled(action: () -> Unit) { + val oldGradleDistributionType = System.getProperty("idea.gradle.distributionType") + System.setProperty("idea.gradle.distributionType", "WRAPPED") + try { + action() + } finally { + if (oldGradleDistributionType != null) { + System.setProperty("idea.gradle.distributionType", oldGradleDistributionType) + } + } } } \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.191 b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.191 new file mode 100644 index 00000000000..6c88c973647 --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.191 @@ -0,0 +1,88 @@ +/* + * Copyright 2010-2019 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.service + +import com.intellij.execution.executors.DefaultRunExecutor +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.actionSystem.impl.SimpleDataContext +import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings +import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode +import com.intellij.openapi.externalSystem.util.ExternalSystemUtil +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.LocalFileSystem +import org.jetbrains.annotations.NonNls +import org.jetbrains.kotlin.tools.projectWizard.core.Reader +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.andThen +import org.jetbrains.kotlin.tools.projectWizard.core.safe +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle +import org.jetbrains.plugins.gradle.action.ImportProjectFromScriptAction +import org.jetbrains.plugins.gradle.util.GradleConstants +import java.nio.file.Path + +// BUNCH: 191 +class IdeaGradleWizardService(private val project: Project) : ProjectImportingWizardService, + IdeaWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType.isGradle + + // We have to call action directly as there is no common way + // to import Gradle project in all IDEAs from 183 to 193 + override fun importProject( + reader: Reader, + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ): TaskResult = performImport(path) andThen createGradleWrapper(path) + + private fun performImport(path: Path) = safe { + val virtualFile = LocalFileSystem.getInstance().findFileByPath(path.toString()) + ?: error("No virtual file found for path $path") + val dataContext = SimpleDataContext.getSimpleContext( + mapOf( + CommonDataKeys.PROJECT.name to project, + CommonDataKeys.VIRTUAL_FILE.name to virtualFile + ), + null + ) + val action = ImportProjectFromScriptAction() + val event = AnActionEvent.createFromAnAction( + action, + /*event=*/ null, + ActionPlaces.UNKNOWN, + dataContext + ) + action.actionPerformed(event) + } + + + private fun createGradleWrapper(path: Path) = safe { + val settings = ExternalSystemTaskExecutionSettings().apply { + externalProjectPath = path.toString() + taskNames = listOf(WRAPPER_TASK_NAME) + externalSystemIdString = GradleConstants.SYSTEM_ID.id + } + + ExternalSystemUtil.runTask( + settings, + DefaultRunExecutor.EXECUTOR_ID, + project, + GradleConstants.SYSTEM_ID, + /*callback=*/ null, + ProgressExecutionMode.NO_PROGRESS_ASYNC + ) + } + + companion object { + @NonNls + private const val WRAPPER_TASK_NAME = "wrapper" + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.192 b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.192 new file mode 100644 index 00000000000..9ab38c1ab00 --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.192 @@ -0,0 +1,88 @@ +/* + * Copyright 2010-2019 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.service + +import com.intellij.execution.executors.DefaultRunExecutor +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.actionSystem.impl.SimpleDataContext +import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings +import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode +import com.intellij.openapi.externalSystem.util.ExternalSystemUtil +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.LocalFileSystem +import org.jetbrains.annotations.NonNls +import org.jetbrains.kotlin.tools.projectWizard.core.Reader +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.andThen +import org.jetbrains.kotlin.tools.projectWizard.core.safe +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle +import org.jetbrains.plugins.gradle.action.ImportProjectFromScriptAction +import org.jetbrains.plugins.gradle.util.GradleConstants +import java.nio.file.Path + +// BUNCH: 192 +class IdeaGradleWizardService(private val project: Project) : ProjectImportingWizardService, + IdeaWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType.isGradle + + // We have to call action directly as there is no common way + // to import Gradle project in all IDEAs from 183 to 193 + override fun importProject( + reader: Reader, + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ): TaskResult = performImport(path) andThen createGradleWrapper(path) + + private fun performImport(path: Path) = safe { + val virtualFile = LocalFileSystem.getInstance().findFileByPath(path.toString()) + ?: error("No virtual file found for path $path") + val dataContext = SimpleDataContext.getSimpleContext( + mapOf( + CommonDataKeys.PROJECT.name to project, + CommonDataKeys.VIRTUAL_FILE.name to virtualFile + ), + null + ) + val action = ImportProjectFromScriptAction() + val event = AnActionEvent.createFromAnAction( + action, + /*event=*/ null, + ActionPlaces.UNKNOWN, + dataContext + ) + action.actionPerformed(event) + } + + + private fun createGradleWrapper(path: Path) = safe { + val settings = ExternalSystemTaskExecutionSettings().apply { + externalProjectPath = path.toString() + taskNames = listOf(WRAPPER_TASK_NAME) + externalSystemIdString = GradleConstants.SYSTEM_ID.id + } + + ExternalSystemUtil.runTask( + settings, + DefaultRunExecutor.EXECUTOR_ID, + project, + GradleConstants.SYSTEM_ID, + /*callback=*/ null, + ProgressExecutionMode.NO_PROGRESS_ASYNC + ) + } + + companion object { + @NonNls + private const val WRAPPER_TASK_NAME = "wrapper" + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.201 b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.201 new file mode 100644 index 00000000000..7b681dec1ec --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaGradleWizardService.kt.201 @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2019 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.service + +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.tools.projectWizard.core.Reader +import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult +import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS +import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle +import org.jetbrains.plugins.gradle.service.project.open.linkAndRefreshGradleProject +import java.nio.file.Path + +// BUNCH: 201 +class IdeaGradleWizardService(private val project: Project) : ProjectImportingWizardService, + IdeaWizardService { + override fun isSuitableFor(buildSystemType: BuildSystemType): Boolean = + buildSystemType.isGradle + + override fun importProject( + reader: Reader, + path: Path, + modulesIrs: List, + buildSystem: BuildSystemType + ): TaskResult { + withGradleWrapperEnabled { + linkAndRefreshGradleProject(path.toString(), project) + } + return UNIT_SUCCESS + } + + private fun withGradleWrapperEnabled(action: () -> Unit) { + val oldGradleDistributionType = System.getProperty("idea.gradle.distributionType") + System.setProperty("idea.gradle.distributionType", "WRAPPED") + try { + action() + } finally { + if (oldGradleDistributionType != null) { + System.setProperty("idea.gradle.distributionType", oldGradleDistributionType) + } + } + } +} \ No newline at end of file