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) }
} else {
val autoReloadEnabled = KotlinScriptingSettings.getInstance(project).autoReloadConfigurations(scriptDefinition)
val postponeLoading = !skipNotification && !autoReloadEnabled && async.any { it.isPostponedLoad(virtualFile) }
val forceSkipNotification = skipNotification || autoReloadEnabled || postponeLoading
val forceSkipNotification = skipNotification || autoReloadEnabled
if (postponeLoading) {
LoadScriptConfigurationNotificationFactory.showNotification(virtualFile, project) {
runAsyncLoaders(file, virtualFile, scriptDefinition, async, forceSkipNotification)
val intercepted = !forceSkipNotification && async.any {
it.interceptBackgroundLoading(virtualFile) {
runAsyncLoaders(file, virtualFile, scriptDefinition, listOf(it), true)
}
} else {
}
if (!intercepted) {
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.
*/
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 interceptBackgroundLoading(file: VirtualFile, doLoad: () -> Unit): Boolean = false
/**
* 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 org.jetbrains.kotlin.idea.KotlinFileType
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.GradleBuildRootsManager
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"))
}
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")) {
rootsManager.updateStandaloneScripts {
removeStandaloneScript(file.path)
@@ -10,7 +10,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import kotlinx.coroutines.GlobalScope
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.loader.DefaultScriptConfigurationLoader
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) {
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
@@ -44,13 +60,16 @@ class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptCon
if (!isGradleKotlinScript(vFile)) return false
GradleStandaloneScriptActions.getInstance(project)
.byFile.remove(vFile)?.updateNotification()
if (!buildRootsManager.isAffectedGradleProjectFile(vFile.path)) {
// not known gradle file and not configured as standalone script
// skip
return true
}
// Gradle read files from FS
// Gradle read files from FS, so let's save all docs
GlobalScope.launch(EDT(project)) {
runWriteAction {
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."
defaultValue="true"
restartRequired="false"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"
serviceImplementation="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"/>
</extensions>
<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."
defaultValue="true"
restartRequired="false"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"
serviceImplementation="org.jetbrains.kotlin.idea.scripting.gradle.legacy.GradleStandaloneScriptActions"/>
</extensions>
<actions>