gradle scripts: "link project" action implementation
This commit is contained in:
+61
-5
@@ -6,19 +6,26 @@
|
|||||||
package org.jetbrains.kotlin.idea.scripting.gradle
|
package org.jetbrains.kotlin.idea.scripting.gradle
|
||||||
|
|
||||||
import com.intellij.icons.AllIcons
|
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.fileEditor.FileEditor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
import com.intellij.projectImport.ProjectImportProvider
|
||||||
import com.intellij.ui.EditorNotificationPanel
|
import com.intellij.ui.EditorNotificationPanel
|
||||||
import com.intellij.ui.EditorNotifications
|
import com.intellij.ui.EditorNotifications
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
|
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
|
||||||
import org.jetbrains.kotlin.idea.core.util.KotlinIdeaCoreBundle
|
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.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.GradleBuildRootsLocator.NotificationKind.*
|
||||||
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
|
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) :
|
class GradleScriptNotificationProvider(private val project: Project) :
|
||||||
EditorNotifications.Provider<EditorNotificationPanel>() {
|
EditorNotifications.Provider<EditorNotificationPanel>() {
|
||||||
@@ -43,7 +50,7 @@ class GradleScriptNotificationProvider(private val project: Project) :
|
|||||||
outsideAnything -> EditorNotificationPanel().apply {
|
outsideAnything -> EditorNotificationPanel().apply {
|
||||||
text(KotlinIdeaGradleBundle.message("notification.outsideAnything.text"))
|
text(KotlinIdeaGradleBundle.message("notification.outsideAnything.text"))
|
||||||
createActionLabel(KotlinIdeaGradleBundle.message("notification.outsideAnything.linkAction")) {
|
createActionLabel(KotlinIdeaGradleBundle.message("notification.outsideAnything.linkAction")) {
|
||||||
linkProject(project)
|
linkProject(project, scriptUnderRoot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wasNotImportedAfterCreation -> EditorNotificationPanel().apply {
|
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
|
// todo: this actions will be usefull only when gradle fix https://github.com/gradle/gradle/issues/12640
|
||||||
// suggest to choose new gradle project
|
// suggest to choose new gradle project
|
||||||
// createActionLabel(KotlinIdeaGradleBundle.message("notification.outsideAnything.linkAction")) {
|
// createActionLabel(KotlinIdeaGradleBundle.message("notification.outsideAnything.linkAction")) {
|
||||||
// linkProject(project)
|
// linkProject(project, scriptUnderRoot)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
createActionLabel(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.addAsStandaloneAction")) {
|
createActionLabel(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.addAsStandaloneAction")) {
|
||||||
@@ -115,8 +122,57 @@ class GradleScriptNotificationProvider(private val project: Project) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun linkProject(project: Project) {
|
private fun linkProject(
|
||||||
TODO()
|
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) {
|
private fun EditorNotificationPanel.contextHelp(text: String) {
|
||||||
|
|||||||
Reference in New Issue
Block a user