gradle.kts standalone scripts: show actions inside single notification

This commit is contained in:
Sergey Rostov
2020-06-16 19:35:08 +03:00
parent 64b1cc7fd4
commit 3d86e92bf5
7 changed files with 121 additions and 17 deletions
@@ -175,14 +175,15 @@ class DefaultScriptingSupport(manager: CompositeScriptConfigurationManager) : De
loaders.firstOrNull { it.loadDependencies(isFirstLoad, file, scriptDefinition, loadingContext) } loaders.firstOrNull { it.loadDependencies(isFirstLoad, file, scriptDefinition, loadingContext) }
} else { } else {
val autoReloadEnabled = KotlinScriptingSettings.getInstance(project).autoReloadConfigurations(scriptDefinition) val autoReloadEnabled = KotlinScriptingSettings.getInstance(project).autoReloadConfigurations(scriptDefinition)
val postponeLoading = !skipNotification && !autoReloadEnabled && async.any { it.isPostponedLoad(virtualFile) } val forceSkipNotification = skipNotification || autoReloadEnabled
val forceSkipNotification = skipNotification || autoReloadEnabled || postponeLoading
if (postponeLoading) { val intercepted = !forceSkipNotification && async.any {
LoadScriptConfigurationNotificationFactory.showNotification(virtualFile, project) { it.interceptBackgroundLoading(virtualFile) {
runAsyncLoaders(file, virtualFile, scriptDefinition, async, forceSkipNotification) runAsyncLoaders(file, virtualFile, scriptDefinition, listOf(it), true)
} }
} else { }
if (!intercepted) {
runAsyncLoaders(file, virtualFile, scriptDefinition, async, forceSkipNotification) runAsyncLoaders(file, virtualFile, scriptDefinition, async, forceSkipNotification)
} }
} }
@@ -15,15 +15,10 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
* @see [org.jetbrains.kotlin.idea.core.script.configuration.DefaultScriptConfigurationManager] for more details. * @see [org.jetbrains.kotlin.idea.core.script.configuration.DefaultScriptConfigurationManager] for more details.
*/ */
interface ScriptConfigurationLoader { interface ScriptConfigurationLoader {
/**
* Show notification before doing load
*
* (by default loading notification will be shown only after loading, to check that configuration is changed)
*/
fun isPostponedLoad(virtualFile: VirtualFile): Boolean = false
fun shouldRunInBackground(scriptDefinition: ScriptDefinition): Boolean = false fun shouldRunInBackground(scriptDefinition: ScriptDefinition): Boolean = false
fun interceptBackgroundLoading(file: VirtualFile, doLoad: () -> Unit): Boolean = false
/** /**
* Implementation should load configuration and call `context.suggestNewConfiguration` or `saveNewConfiguration`. * Implementation should load configuration and call `context.suggestNewConfiguration` or `saveNewConfiguration`.
* *
@@ -14,6 +14,8 @@ 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.scripting.gradle.legacy.GradleStandaloneScriptActions
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 org.jetbrains.kotlin.idea.scripting.gradle.roots.Imported
@@ -77,7 +79,26 @@ class GradleScriptNotificationProvider(private val project: Project) :
contextHelp(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.info")) contextHelp(KotlinIdeaGradleBundle.message("notification.notEvaluatedInLastImport.info"))
} }
standalone -> EditorNotificationPanel().apply { standalone -> EditorNotificationPanel().apply {
text(KotlinIdeaGradleBundle.message("notification.standalone.text")) val actions = GradleStandaloneScriptActions.getInstance(project).byFile[file]
if (actions != null) {
text(
KotlinIdeaGradleBundle.message("notification.standalone.text") +
". " +
KotlinIdeaCoreBundle.message("notification.text.script.configuration.has.been.changed")
)
createActionLabel(KotlinIdeaCoreBundle.message("notification.action.text.load.script.configuration")) {
actions.reload()
}
createActionLabel(KotlinIdeaCoreBundle.message("notification.action.text.enable.auto.reload")) {
actions.toggleAutoReload()
}
} else {
text(KotlinIdeaGradleBundle.message("notification.standalone.text"))
}
createActionLabel(KotlinIdeaGradleBundle.message("notification.standalone.disableScriptAction")) { createActionLabel(KotlinIdeaGradleBundle.message("notification.standalone.disableScriptAction")) {
rootsManager.updateStandaloneScripts { rootsManager.updateStandaloneScripts {
removeStandaloneScript(file.path) removeStandaloneScript(file.path)
@@ -10,7 +10,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager import org.jetbrains.kotlin.idea.core.script.LoadScriptConfigurationNotificationFactory
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
import org.jetbrains.kotlin.idea.core.script.configuration.loader.DefaultScriptConfigurationLoader import org.jetbrains.kotlin.idea.core.script.configuration.loader.DefaultScriptConfigurationLoader
import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoadingContext import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoadingContext
@@ -30,7 +30,23 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptConfigurationLoader(project) { class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptConfigurationLoader(project) {
private val buildRootsManager = GradleBuildRootsManager.getInstance(project) private val buildRootsManager = GradleBuildRootsManager.getInstance(project)
override fun isPostponedLoad(virtualFile: VirtualFile): Boolean = isGradleKotlinScript(virtualFile) override fun interceptBackgroundLoading(file: VirtualFile, doLoad: () -> Unit): Boolean {
if (!isGradleKotlinScript(file)) return false
val info = buildRootsManager.findScriptBuildRoot(file) ?: return false
if (info.standalone) {
val actionsManager = GradleStandaloneScriptActions.getInstance(project)
val fileActions = actionsManager.ForFile(file, doLoad)
actionsManager.byFile[file] = fileActions
fileActions.updateNotification()
} else {
LoadScriptConfigurationNotificationFactory.showNotification(file, project) {
doLoad()
}
}
return true
}
override fun shouldRunInBackground(scriptDefinition: ScriptDefinition) = true override fun shouldRunInBackground(scriptDefinition: ScriptDefinition) = true
@@ -44,13 +60,16 @@ class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptCon
if (!isGradleKotlinScript(vFile)) return false if (!isGradleKotlinScript(vFile)) return false
GradleStandaloneScriptActions.getInstance(project)
.byFile.remove(vFile)?.updateNotification()
if (!buildRootsManager.isAffectedGradleProjectFile(vFile.path)) { if (!buildRootsManager.isAffectedGradleProjectFile(vFile.path)) {
// not known gradle file and not configured as standalone script // not known gradle file and not configured as standalone script
// skip // skip
return true return true
} }
// Gradle read files from FS // Gradle read files from FS, so let's save all docs
GlobalScope.launch(EDT(project)) { GlobalScope.launch(EDT(project)) {
runWriteAction { runWriteAction {
FileDocumentManager.getInstance().saveAllDocuments() FileDocumentManager.getInstance().saveAllDocuments()
@@ -0,0 +1,62 @@
/*
* Copyright 2010-2020 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.idea.scripting.gradle.legacy
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
class GradleStandaloneScriptActions(val project: Project) {
val byFile = mutableMapOf<VirtualFile, ForFile>()
inner class ForFile(
val file: VirtualFile,
private val doLoad: () -> Unit
) {
private val scriptDefinition
get() = file.findScriptDefinition(project)
val isAutoReloadAvailable: Boolean
val isAutoReloadEnabled: Boolean
init {
val scriptDefinition = scriptDefinition
if (scriptDefinition != null) {
isAutoReloadAvailable = true
isAutoReloadEnabled = KotlinScriptingSettings.getInstance(project)
.autoReloadConfigurations(scriptDefinition)
} else {
isAutoReloadAvailable = false
isAutoReloadEnabled = false
}
}
fun toggleAutoReload() {
KotlinScriptingSettings.getInstance(project).setAutoReloadConfigurations(scriptDefinition!!, !isAutoReloadEnabled)
updateNotification()
}
fun reload() {
byFile.remove(file)
doLoad()
updateNotification()
}
fun updateNotification() {
GradleBuildRootsManager.getInstance(project).updateNotifications(false) {
it == file.path
}
}
}
companion object {
fun getInstance(project: Project) =
ServiceManager.getService(project, GradleStandaloneScriptActions::class.java)
}
}
+3
View File
@@ -37,6 +37,9 @@
This setting currently affects only HMPP projects. You may need to delete existing test configurations for the change to take place." This setting currently affects only HMPP projects. You may need to delete existing test configurations for the change to take place."
defaultValue="true" defaultValue="true"
restartRequired="false"/> restartRequired="false"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"
serviceImplementation="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"/>
</extensions> </extensions>
<actions> <actions>
+3
View File
@@ -39,6 +39,9 @@
This setting currently affects only HMPP projects. You may need to delete existing test configurations for the change to take place." This setting currently affects only HMPP projects. You may need to delete existing test configurations for the change to take place."
defaultValue="true" defaultValue="true"
restartRequired="false"/> restartRequired="false"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"
serviceImplementation="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"/>
</extensions> </extensions>
<actions> <actions>