gradle scripts: "link project" action implementation
This commit is contained in:
+61
-5
@@ -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<EditorNotificationPanel>() {
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user