gradle.kts legacy: don't start loading without prompt on first opening
This commit is contained in:
+14
@@ -14,6 +14,7 @@ import com.intellij.openapi.util.Ref
|
|||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.ui.EditorNotificationPanel
|
import com.intellij.ui.EditorNotificationPanel
|
||||||
import com.intellij.ui.HyperlinkLabel
|
import com.intellij.ui.HyperlinkLabel
|
||||||
|
import org.jetbrains.annotations.TestOnly
|
||||||
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
||||||
import org.jetbrains.kotlin.idea.core.util.KotlinIdeaCoreBundle
|
import org.jetbrains.kotlin.idea.core.util.KotlinIdeaCoreBundle
|
||||||
import org.jetbrains.kotlin.psi.UserDataProperty
|
import org.jetbrains.kotlin.psi.UserDataProperty
|
||||||
@@ -30,6 +31,19 @@ object LoadScriptConfigurationNotificationFactory {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestOnly
|
||||||
|
fun hasNotification(file: VirtualFile, project: Project): Boolean {
|
||||||
|
return FileEditorManager.getInstance(project).getSelectedEditor(file)?.notificationPanel != null
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestOnly
|
||||||
|
fun performSuggestedLoading(file: VirtualFile, project: Project): Boolean {
|
||||||
|
val notificationPanel = FileEditorManager.getInstance(project).getSelectedEditor(file)?.notificationPanel
|
||||||
|
?: return false
|
||||||
|
notificationPanel.onClick.invoke()
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
private fun VirtualFile.removeLoadConfigurationNotificationPanel(project: Project) {
|
private fun VirtualFile.removeLoadConfigurationNotificationPanel(project: Project) {
|
||||||
withSelectedEditor(project) { manager ->
|
withSelectedEditor(project) { manager ->
|
||||||
|
|||||||
+2
-12
@@ -158,7 +158,6 @@ class DefaultScriptingSupport(manager: CompositeScriptConfigurationManager) : De
|
|||||||
file: KtFile,
|
file: KtFile,
|
||||||
isFirstLoad: Boolean,
|
isFirstLoad: Boolean,
|
||||||
forceSync: Boolean,
|
forceSync: Boolean,
|
||||||
isPostponedLoad: Boolean,
|
|
||||||
fromCacheOnly: Boolean
|
fromCacheOnly: Boolean
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val virtualFile = file.originalFile.virtualFile ?: return false
|
val virtualFile = file.originalFile.virtualFile ?: return false
|
||||||
@@ -175,7 +174,7 @@ 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 = isPostponedLoad && !autoReloadEnabled
|
val postponeLoading = !autoReloadEnabled && async.any { it.isPostponedLoad(virtualFile) }
|
||||||
|
|
||||||
if (postponeLoading) {
|
if (postponeLoading) {
|
||||||
LoadScriptConfigurationNotificationFactory.showNotification(virtualFile, project) {
|
LoadScriptConfigurationNotificationFactory.showNotification(virtualFile, project) {
|
||||||
@@ -390,7 +389,6 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura
|
|||||||
file: KtFile,
|
file: KtFile,
|
||||||
isFirstLoad: Boolean = getAppliedConfiguration(file.originalFile.virtualFile) == null,
|
isFirstLoad: Boolean = getAppliedConfiguration(file.originalFile.virtualFile) == null,
|
||||||
forceSync: Boolean = false,
|
forceSync: Boolean = false,
|
||||||
isPostponedLoad: Boolean = false,
|
|
||||||
fromCacheOnly: Boolean = false
|
fromCacheOnly: Boolean = false
|
||||||
): Boolean
|
): Boolean
|
||||||
|
|
||||||
@@ -431,13 +429,6 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura
|
|||||||
reloadIfOutOfDate(file)
|
reloadIfOutOfDate(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show notification about changed script configuration with action to start loading it
|
|
||||||
*/
|
|
||||||
fun suggestToUpdateConfigurationIfOutOfDate(file: KtFile) {
|
|
||||||
reloadIfOutOfDate(file, isPostponedLoad = true)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun reloadIfOutOfDate(file: KtFile, isPostponedLoad: Boolean = false) {
|
private fun reloadIfOutOfDate(file: KtFile, isPostponedLoad: Boolean = false) {
|
||||||
if (!ScriptDefinitionsManager.getInstance(project).isReady()) return
|
if (!ScriptDefinitionsManager.getInstance(project).isReady()) return
|
||||||
|
|
||||||
@@ -448,8 +439,7 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura
|
|||||||
if (state == null || !state.isUpToDate(project, virtualFile, file)) {
|
if (state == null || !state.isUpToDate(project, virtualFile, file)) {
|
||||||
reloadOutOfDateConfiguration(
|
reloadOutOfDateConfiguration(
|
||||||
file,
|
file,
|
||||||
isFirstLoad = state == null,
|
isFirstLoad = state == null
|
||||||
isPostponedLoad = isPostponedLoad
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.core.script.configuration.loader
|
package org.jetbrains.kotlin.idea.core.script.configuration.loader
|
||||||
|
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||||
|
|
||||||
@@ -14,6 +15,13 @@ 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
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+4
@@ -30,6 +30,10 @@ 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 shouldRunInBackground(scriptDefinition: ScriptDefinition) = true
|
||||||
|
|
||||||
override fun loadDependencies(
|
override fun loadDependencies(
|
||||||
isFirstLoad: Boolean,
|
isFirstLoad: Boolean,
|
||||||
ktFile: KtFile,
|
ktFile: KtFile,
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@ class GradleLegacyScriptListener(project: Project) : ScriptChangeListener(projec
|
|||||||
val file = getAnalyzableKtFileForScript(vFile)
|
val file = getAnalyzableKtFileForScript(vFile)
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
// *.gradle.kts file was changed
|
// *.gradle.kts file was changed
|
||||||
default.suggestToUpdateConfigurationIfOutOfDate(file)
|
default.ensureUpToDatedConfigurationSuggested(file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+40
-17
@@ -5,11 +5,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.scripting.gradle
|
package org.jetbrains.kotlin.idea.scripting.gradle
|
||||||
|
|
||||||
|
import com.intellij.openapi.application.impl.LaterInvocator
|
||||||
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
||||||
import com.intellij.openapi.vfs.LocalFileSystem
|
import com.intellij.openapi.vfs.LocalFileSystem
|
||||||
import com.intellij.openapi.vfs.VfsUtil
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
|
import org.jetbrains.kotlin.idea.core.script.LoadScriptConfigurationNotificationFactory
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
|
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationLoadingTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationLoadingTest
|
||||||
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
|
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
|
||||||
@@ -84,7 +86,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changeBuildKtsInsideSections()
|
changeBuildKtsInsideSections()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testSpacesInSectionsChange() {
|
fun testSpacesInSectionsChange() {
|
||||||
@@ -116,7 +118,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changeSettingsKtsInsideSections()
|
changeSettingsKtsInsideSections()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.settings)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testOutsideSectionsInSettingsChange() {
|
fun testOutsideSectionsInSettingsChange() {
|
||||||
@@ -134,7 +136,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
changeBuildKtsOutsideSections()
|
changeBuildKtsOutsideSections()
|
||||||
|
|
||||||
assertConfigurationUpToDate(testFiles.buildKts)
|
assertConfigurationUpToDate(testFiles.buildKts)
|
||||||
assertConfigurationUpdateWasDone(testFiles.settings)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testChangeInsideSectionsInvalidatesOtherFiles() {
|
fun testChangeInsideSectionsInvalidatesOtherFiles() {
|
||||||
@@ -143,8 +145,8 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changeBuildKtsInsideSections()
|
changeBuildKtsInsideSections()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
assertConfigurationUpdateWasDone(testFiles.settings)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testChangeInsideNonKtsFileInvalidatesOtherFiles() {
|
fun testChangeInsideNonKtsFileInvalidatesOtherFiles() {
|
||||||
@@ -152,7 +154,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changePropertiesFile()
|
changePropertiesFile()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testTwoFilesChanged() {
|
fun testTwoFilesChanged() {
|
||||||
@@ -162,7 +164,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
changePropertiesFile()
|
changePropertiesFile()
|
||||||
changeSettingsKtsOutsideSections()
|
changeSettingsKtsOutsideSections()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.settings)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testFileAttributes() {
|
fun testFileAttributes() {
|
||||||
@@ -180,7 +182,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changeBuildKtsInsideSections()
|
changeBuildKtsInsideSections()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testFileAttributesUpToDateAfterChangeOutsideSections() {
|
fun testFileAttributesUpToDateAfterChangeOutsideSections() {
|
||||||
@@ -202,7 +204,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
changeSettingsKtsOutsideSections()
|
changeSettingsKtsOutsideSections()
|
||||||
|
|
||||||
assertConfigurationUpToDate(testFiles.settings)
|
assertConfigurationUpToDate(testFiles.settings)
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testConfigurationUpdateAfterProjectClosing() {
|
fun testConfigurationUpdateAfterProjectClosing() {
|
||||||
@@ -212,7 +214,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
changeSettingsKtsOutsideSections()
|
changeSettingsKtsOutsideSections()
|
||||||
|
|
||||||
assertConfigurationUpToDate(testFiles.settings)
|
assertConfigurationUpToDate(testFiles.settings)
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testConfigurationUpdateAfterProjectClosing2() {
|
fun testConfigurationUpdateAfterProjectClosing2() {
|
||||||
@@ -225,8 +227,8 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
markFileChanged(testFiles.buildKts.virtualFile, ts)
|
markFileChanged(testFiles.buildKts.virtualFile, ts)
|
||||||
markFileChanged(testFiles.settings.virtualFile, ts)
|
markFileChanged(testFiles.settings.virtualFile, ts)
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.settings)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.settings)
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testConfigurationUpdateAfterProjectClosing3() {
|
fun testConfigurationUpdateAfterProjectClosing3() {
|
||||||
@@ -239,8 +241,8 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changePropertiesFile()
|
changePropertiesFile()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.settings)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.settings)
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun markFileChanged(virtualFile: VirtualFile, ts: Long) {
|
private fun markFileChanged(virtualFile: VirtualFile, ts: Long) {
|
||||||
@@ -252,7 +254,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
changePropertiesFile()
|
changePropertiesFile()
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
assertConfigurationUpToDate(testFiles.buildKts)
|
assertConfigurationUpToDate(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,18 +263,39 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() {
|
|||||||
|
|
||||||
markFileChanged(testFiles.gradleWrapperProperties, System.currentTimeMillis())
|
markFileChanged(testFiles.gradleWrapperProperties, System.currentTimeMillis())
|
||||||
|
|
||||||
assertConfigurationUpdateWasDone(testFiles.buildKts)
|
assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts)
|
||||||
assertConfigurationUpToDate(testFiles.buildKts)
|
assertConfigurationUpToDate(testFiles.buildKts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun assertAndLoadInitialConfiguration(file: KtFile) {
|
||||||
|
assertNull(scriptConfigurationManager.getConfiguration(file))
|
||||||
|
assertReloadingSuggestedAndDoReload(file)
|
||||||
|
assertAndDoAllBackgroundTasks()
|
||||||
|
assertSingleLoading()
|
||||||
|
assertAppliedConfiguration(file.text, file)
|
||||||
|
|
||||||
|
checkHighlighting(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun assertReloadingSuggestedAndDoReload(file: KtFile = myFile as KtFile) {
|
||||||
|
LaterInvocator.ensureFlushRequested()
|
||||||
|
LaterInvocator.dispatchPendingFlushes()
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
"reloading configuration should be suggested",
|
||||||
|
LoadScriptConfigurationNotificationFactory.performSuggestedLoading(file.virtualFile, project)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun assertConfigurationUpToDate(file: KtFile) {
|
private fun assertConfigurationUpToDate(file: KtFile) {
|
||||||
scriptConfigurationManager.default.ensureUpToDatedConfigurationSuggested(file)
|
scriptConfigurationManager.default.ensureUpToDatedConfigurationSuggested(file)
|
||||||
assertNoBackgroundTasks()
|
assertNoBackgroundTasks()
|
||||||
assertNoLoading()
|
assertNoLoading()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun assertConfigurationUpdateWasDone(file: KtFile) {
|
private fun assertConfigurationUpdateWasDoneAfterClick(file: KtFile) {
|
||||||
scriptConfigurationManager.default.ensureUpToDatedConfigurationSuggested(file)
|
scriptConfigurationManager.default.ensureUpToDatedConfigurationSuggested(file)
|
||||||
|
assertReloadingSuggestedAndDoReload(file)
|
||||||
assertAndDoAllBackgroundTasks()
|
assertAndDoAllBackgroundTasks()
|
||||||
assertSingleLoading()
|
assertSingleLoading()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -142,7 +142,7 @@ abstract class AbstractScriptConfigurationLoadingTest : AbstractScriptConfigurat
|
|||||||
occurredLoadings = 0
|
occurredLoadings = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun assertAndLoadInitialConfiguration(file: KtFile = myFile as KtFile) {
|
protected open fun assertAndLoadInitialConfiguration(file: KtFile = myFile as KtFile) {
|
||||||
assertNull(scriptConfigurationManager.getConfiguration(file))
|
assertNull(scriptConfigurationManager.getConfiguration(file))
|
||||||
assertAndDoAllBackgroundTasks()
|
assertAndDoAllBackgroundTasks()
|
||||||
assertSingleLoading()
|
assertSingleLoading()
|
||||||
|
|||||||
Reference in New Issue
Block a user