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) }
|
||||
} 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)
|
||||
}
|
||||
}
|
||||
|
||||
+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.
|
||||
*/
|
||||
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`.
|
||||
*
|
||||
|
||||
+22
-1
@@ -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)
|
||||
|
||||
+22
-3
@@ -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()
|
||||
|
||||
+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."
|
||||
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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user