gradle.kts legacy: don't start loading without prompt on first opening

This commit is contained in:
Sergey Rostov
2020-06-14 20:51:07 +03:00
parent 0234678804
commit b2e629dceb
7 changed files with 70 additions and 31 deletions
@@ -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 ->
@@ -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
) )
} }
} }
@@ -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
/** /**
@@ -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,
@@ -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)
} }
} }
} }
@@ -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()
} }
@@ -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()