gradle.kts standalone scripts: show actions inside single notification
This commit is contained in:
+7
-6
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-7
@@ -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`.
|
||||||
*
|
*
|
||||||
|
|||||||
+22
-1
@@ -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)
|
||||||
|
|||||||
+22
-3
@@ -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()
|
||||||
|
|||||||
+62
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user