From b2e629dceb242661ba4658d7e6698fec0f123e4c Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Sun, 14 Jun 2020 20:51:07 +0300 Subject: [PATCH] gradle.kts legacy: don't start loading without prompt on first opening --- ...dScriptConfigurationNotificationFactory.kt | 14 +++++ .../configuration/DefaultScriptingSupport.kt | 14 +---- .../loader/ScriptConfigurationLoader.kt | 8 +++ .../GradleLegacyScriptConfigurationLoader.kt | 4 ++ .../legacy/GradleLegacyScriptListener.kt | 2 +- .../gradle/GradleScriptListenerTest.kt | 57 +++++++++++++------ .../AbstractScriptConfigurationLoadingTest.kt | 2 +- 7 files changed, 70 insertions(+), 31 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt index 1342d62b0ac..4c9a5901694 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt @@ -14,6 +14,7 @@ import com.intellij.openapi.util.Ref import com.intellij.openapi.vfs.VirtualFile import com.intellij.ui.EditorNotificationPanel 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.util.KotlinIdeaCoreBundle import org.jetbrains.kotlin.psi.UserDataProperty @@ -30,6 +31,19 @@ object LoadScriptConfigurationNotificationFactory { 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) { withSelectedEditor(project) { manager -> diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt index 3f5cadae0ea..70b645af6d2 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt @@ -158,7 +158,6 @@ class DefaultScriptingSupport(manager: CompositeScriptConfigurationManager) : De file: KtFile, isFirstLoad: Boolean, forceSync: Boolean, - isPostponedLoad: Boolean, fromCacheOnly: Boolean ): Boolean { val virtualFile = file.originalFile.virtualFile ?: return false @@ -175,7 +174,7 @@ class DefaultScriptingSupport(manager: CompositeScriptConfigurationManager) : De loaders.firstOrNull { it.loadDependencies(isFirstLoad, file, scriptDefinition, loadingContext) } } else { val autoReloadEnabled = KotlinScriptingSettings.getInstance(project).autoReloadConfigurations(scriptDefinition) - val postponeLoading = isPostponedLoad && !autoReloadEnabled + val postponeLoading = !autoReloadEnabled && async.any { it.isPostponedLoad(virtualFile) } if (postponeLoading) { LoadScriptConfigurationNotificationFactory.showNotification(virtualFile, project) { @@ -390,7 +389,6 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura file: KtFile, isFirstLoad: Boolean = getAppliedConfiguration(file.originalFile.virtualFile) == null, forceSync: Boolean = false, - isPostponedLoad: Boolean = false, fromCacheOnly: Boolean = false ): Boolean @@ -431,13 +429,6 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura 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) { if (!ScriptDefinitionsManager.getInstance(project).isReady()) return @@ -448,8 +439,7 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura if (state == null || !state.isUpToDate(project, virtualFile, file)) { reloadOutOfDateConfiguration( file, - isFirstLoad = state == null, - isPostponedLoad = isPostponedLoad + isFirstLoad = state == null ) } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoader.kt index 7fb919b2d35..d35702497b5 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoader.kt @@ -5,6 +5,7 @@ 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.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. */ 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 /** diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptConfigurationLoader.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptConfigurationLoader.kt index 4dabbc8c3cb..ace4243c23e 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptConfigurationLoader.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptConfigurationLoader.kt @@ -30,6 +30,10 @@ 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 shouldRunInBackground(scriptDefinition: ScriptDefinition) = true + override fun loadDependencies( isFirstLoad: Boolean, ktFile: KtFile, diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptListener.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptListener.kt index dd6a1bbb31b..88b49b6d449 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptListener.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/legacy/GradleLegacyScriptListener.kt @@ -31,7 +31,7 @@ class GradleLegacyScriptListener(project: Project) : ScriptChangeListener(projec val file = getAnalyzableKtFileForScript(vFile) if (file != null) { // *.gradle.kts file was changed - default.suggestToUpdateConfigurationIfOutOfDate(file) + default.ensureUpToDatedConfigurationSuggested(file) } } } \ No newline at end of file diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListenerTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListenerTest.kt index d6d9f15b050..0a5e782d1ee 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListenerTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListenerTest.kt @@ -5,11 +5,13 @@ 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.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile 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.script.AbstractScriptConfigurationLoadingTest import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager @@ -84,7 +86,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeBuildKtsInsideSections() - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } fun testSpacesInSectionsChange() { @@ -116,7 +118,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeSettingsKtsInsideSections() - assertConfigurationUpdateWasDone(testFiles.settings) + assertConfigurationUpdateWasDoneAfterClick(testFiles.settings) } fun testOutsideSectionsInSettingsChange() { @@ -134,7 +136,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeBuildKtsOutsideSections() assertConfigurationUpToDate(testFiles.buildKts) - assertConfigurationUpdateWasDone(testFiles.settings) + assertConfigurationUpdateWasDoneAfterClick(testFiles.settings) } fun testChangeInsideSectionsInvalidatesOtherFiles() { @@ -143,8 +145,8 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeBuildKtsInsideSections() - assertConfigurationUpdateWasDone(testFiles.buildKts) - assertConfigurationUpdateWasDone(testFiles.settings) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.settings) } fun testChangeInsideNonKtsFileInvalidatesOtherFiles() { @@ -152,7 +154,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changePropertiesFile() - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } fun testTwoFilesChanged() { @@ -162,7 +164,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changePropertiesFile() changeSettingsKtsOutsideSections() - assertConfigurationUpdateWasDone(testFiles.settings) + assertConfigurationUpdateWasDoneAfterClick(testFiles.settings) } fun testFileAttributes() { @@ -180,7 +182,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeBuildKtsInsideSections() - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } fun testFileAttributesUpToDateAfterChangeOutsideSections() { @@ -202,7 +204,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeSettingsKtsOutsideSections() assertConfigurationUpToDate(testFiles.settings) - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } fun testConfigurationUpdateAfterProjectClosing() { @@ -212,7 +214,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changeSettingsKtsOutsideSections() assertConfigurationUpToDate(testFiles.settings) - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } fun testConfigurationUpdateAfterProjectClosing2() { @@ -225,8 +227,8 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { markFileChanged(testFiles.buildKts.virtualFile, ts) markFileChanged(testFiles.settings.virtualFile, ts) - assertConfigurationUpdateWasDone(testFiles.settings) - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.settings) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } fun testConfigurationUpdateAfterProjectClosing3() { @@ -239,8 +241,8 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changePropertiesFile() - assertConfigurationUpdateWasDone(testFiles.settings) - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.settings) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) } private fun markFileChanged(virtualFile: VirtualFile, ts: Long) { @@ -252,7 +254,7 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { changePropertiesFile() - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(testFiles.buildKts) assertConfigurationUpToDate(testFiles.buildKts) } @@ -261,18 +263,39 @@ open class GradleScriptListenerTest : AbstractScriptConfigurationLoadingTest() { markFileChanged(testFiles.gradleWrapperProperties, System.currentTimeMillis()) - assertConfigurationUpdateWasDone(testFiles.buildKts) + assertConfigurationUpdateWasDoneAfterClick(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) { scriptConfigurationManager.default.ensureUpToDatedConfigurationSuggested(file) assertNoBackgroundTasks() assertNoLoading() } - private fun assertConfigurationUpdateWasDone(file: KtFile) { + private fun assertConfigurationUpdateWasDoneAfterClick(file: KtFile) { scriptConfigurationManager.default.ensureUpToDatedConfigurationSuggested(file) + assertReloadingSuggestedAndDoReload(file) assertAndDoAllBackgroundTasks() assertSingleLoading() } diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationLoadingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationLoadingTest.kt index da27468a763..8b644a32195 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationLoadingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationLoadingTest.kt @@ -142,7 +142,7 @@ abstract class AbstractScriptConfigurationLoadingTest : AbstractScriptConfigurat occurredLoadings = 0 } - protected fun assertAndLoadInitialConfiguration(file: KtFile = myFile as KtFile) { + protected open fun assertAndLoadInitialConfiguration(file: KtFile = myFile as KtFile) { assertNull(scriptConfigurationManager.getConfiguration(file)) assertAndDoAllBackgroundTasks() assertSingleLoading()