diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptNotificationProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptNotificationProvider.kt index ad5a52a75bd..7c35cc9b969 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptNotificationProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptNotificationProvider.kt @@ -6,19 +6,26 @@ package org.jetbrains.kotlin.idea.scripting.gradle import com.intellij.icons.AllIcons +import com.intellij.ide.actions.ImportModuleAction +import com.intellij.ide.util.PropertiesComponent +import com.intellij.openapi.externalSystem.service.project.wizard.AbstractExternalProjectImportProvider +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.fileEditor.FileEditor import com.intellij.openapi.project.Project import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VirtualFile +import com.intellij.projectImport.ProjectImportProvider import com.intellij.ui.EditorNotificationPanel import com.intellij.ui.EditorNotifications import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle import org.jetbrains.kotlin.idea.core.util.KotlinIdeaCoreBundle +import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID import org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions +import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsLocator import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsLocator.NotificationKind.* import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager -import org.jetbrains.kotlin.idea.scripting.gradle.roots.Imported +import java.io.File class GradleScriptNotificationProvider(private val project: Project) : EditorNotifications.Provider() { @@ -43,7 +50,7 @@ class GradleScriptNotificationProvider(private val project: Project) : outsideAnything -> EditorNotificationPanel().apply { text(KotlinIdeaGradleBundle.message("notification.outsideAnything.text")) createActionLabel(KotlinIdeaGradleBundle.message("notification.outsideAnything.linkAction")) { - linkProject(project) + linkProject(project, scriptUnderRoot) } } wasNotImportedAfterCreation -> EditorNotificationPanel().apply { @@ -73,7 +80,7 @@ class GradleScriptNotificationProvider(private val project: Project) : // todo: this actions will be usefull only when gradle fix https://github.com/gradle/gradle/issues/12640 // suggest to choose new gradle project // createActionLabel(KotlinIdeaGradleBundle.message("notification.outsideAnything.linkAction")) { -// linkProject(project) +// linkProject(project, scriptUnderRoot) // } createActionLabel(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.addAsStandaloneAction")) { @@ -115,8 +122,57 @@ class GradleScriptNotificationProvider(private val project: Project) : } } - private fun linkProject(project: Project) { - TODO() + private fun linkProject( + project: Project, + scriptUnderRoot: GradleBuildRootsLocator.ScriptUnderRoot + ) { + val settingsFile: File? = tryFindGradleSettings(scriptUnderRoot) + + // from AttachExternalProjectAction + + val manager = ExternalSystemApiUtil.getManager(GRADLE_SYSTEM_ID) ?: return + val provider = ProjectImportProvider.PROJECT_IMPORT_PROVIDER.extensions.find { + it is AbstractExternalProjectImportProvider && GRADLE_SYSTEM_ID == it.externalSystemId + } ?: return + val projectImportProviders = arrayOf(provider) + + if (settingsFile != null) { + PropertiesComponent.getInstance().setValue( + "last.imported.location", + settingsFile.canonicalPath + ) + } + + val wizard = ImportModuleAction.selectFileAndCreateWizard( + project, + null, + manager.externalProjectDescriptor, + projectImportProviders + ) ?: return + + if (wizard.stepCount <= 0 || wizard.showAndGet()) { + ImportModuleAction.createFromWizard(project, wizard) + } + } + + private fun tryFindGradleSettings(scriptUnderRoot: GradleBuildRootsLocator.ScriptUnderRoot): File? { + try { + var parent = File(scriptUnderRoot.filePath).canonicalFile.parentFile + while (parent.isDirectory) { + listOf("settings.gradle", "settings.gradle.kts").forEach { + val settings = parent.resolve(it) + if (settings.isFile) { + return settings + } + } + + parent = parent.parentFile + } + } catch (t: Throwable) { + // ignore + } + + return null } private fun EditorNotificationPanel.contextHelp(text: String) {