diff --git a/platform/configuration-store-impl/src/SaveAndSyncHandlerImpl.kt b/platform/configuration-store-impl/src/SaveAndSyncHandlerImpl.kt index 8b534d21f2d8..358da47e161c 100644 --- a/platform/configuration-store-impl/src/SaveAndSyncHandlerImpl.kt +++ b/platform/configuration-store-impl/src/SaveAndSyncHandlerImpl.kt @@ -22,7 +22,7 @@ import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.Task import com.intellij.openapi.project.Project -import com.intellij.openapi.project.ProjectManager +import com.intellij.openapi.project.processOpenedProjects import com.intellij.openapi.util.Disposer import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.newvfs.ManagingFS @@ -48,7 +48,7 @@ internal class SaveAndSyncHandlerImpl : BaseSaveAndSyncHandler(), Disposable { @Volatile private var refreshSessionId = -1L - private val saveQueue = ArrayDeque() + private val saveQueue = ArrayDeque() private val saveAlarm = pooledThreadSingleAlarm(delay = 300, parentDisposable = this) { val app = ApplicationManager.getApplication() @@ -147,13 +147,13 @@ internal class SaveAndSyncHandlerImpl : BaseSaveAndSyncHandler(), Disposable { }) } - override fun scheduleSave(task: SaveAndSyncHandler.SaveTask, forceExecuteImmediately: Boolean) { + override fun scheduleSave(task: SaveTask, forceExecuteImmediately: Boolean) { if (addToSaveQueue(task) || forceExecuteImmediately) { saveAlarm.cancelAndRequest(forceRun = forceExecuteImmediately) } } - private fun addToSaveQueue(task: SaveAndSyncHandler.SaveTask): Boolean { + private fun addToSaveQueue(task: SaveTask): Boolean { synchronized(saveQueue) { if (task.onlyProject == null) { saveQueue.removeAll(task::isMoreGenericThan) @@ -273,7 +273,7 @@ internal class SaveAndSyncHandlerImpl : BaseSaveAndSyncHandler(), Disposable { override fun refreshOpenFiles() { val files = ArrayList() - for (project in ProjectManager.getInstance().openProjects) { + processOpenedProjects { project -> FileEditorManager.getInstance(project).selectedFiles.filterTo(files) { it is NewVirtualFile } } diff --git a/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt b/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt index 5d968c4a6dda..236f2cc4c9bc 100644 --- a/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt +++ b/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt @@ -21,8 +21,8 @@ import com.intellij.openapi.diagnostic.runAndLogException import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectBundle -import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.ProjectReloadState +import com.intellij.openapi.project.processOpenedProjects import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.Key import com.intellij.openapi.util.Ref @@ -55,15 +55,11 @@ internal class StoreReloadManagerImpl : StoreReloadManager, Disposable { } val projectsToReload = THashSet() - for (project in ProjectManager.getInstance().openProjects) { - if (project.isDisposed) { - continue - } - + processOpenedProjects { project -> val changedSchemes = CHANGED_SCHEMES_KEY.getAndClear(project as UserDataHolderEx) val changedStorages = CHANGED_FILES_KEY.getAndClear(project as UserDataHolderEx) if ((changedSchemes == null || changedSchemes.isEmpty) && (changedStorages == null || changedStorages.isEmpty)) { - continue + return@processOpenedProjects } runBatchUpdate(project.messageBus) { diff --git a/platform/platform-api/src/com/intellij/openapi/project/ProjectUtil.kt b/platform/platform-api/src/com/intellij/openapi/project/ProjectUtil.kt index e1373983f600..f5228311ae6e 100644 --- a/platform/platform-api/src/com/intellij/openapi/project/ProjectUtil.kt +++ b/platform/platform-api/src/com/intellij/openapi/project/ProjectUtil.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. @file:JvmName("ProjectUtil") package com.intellij.openapi.project @@ -191,4 +191,14 @@ inline fun runWhenProjectOpened(project: Project? = null, crossinline handler: ( } } }) +} + +inline fun processOpenedProjects(processor: (Project) -> Unit) { + for (project in ProjectManager.getInstance().openProjects) { + if (!project.isInitialized || project.isDisposed) { + continue + } + + processor(project) + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/configurationStore/storeUtil.kt b/platform/platform-impl/src/com/intellij/configurationStore/storeUtil.kt index a8bd8cc972db..a8bab8dbbd75 100644 --- a/platform/platform-impl/src/com/intellij/configurationStore/storeUtil.kt +++ b/platform/platform-impl/src/com/intellij/configurationStore/storeUtil.kt @@ -18,7 +18,7 @@ import com.intellij.openapi.components.stateStore import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.project.Project -import com.intellij.openapi.project.ProjectManager +import com.intellij.openapi.project.processOpenedProjects import com.intellij.openapi.util.text.StringUtil import kotlinx.coroutines.runBlocking import org.jetbrains.annotations.CalledInAny @@ -157,10 +157,8 @@ suspend fun saveProjectsAndApp(forceSavingAllSettings: Boolean, onlyProject: Pro @CalledInAny private suspend fun saveAllProjects(forceSavingAllSettings: Boolean) { - for (project in ProjectManager.getInstance().openProjects) { - if (!project.isDisposed) { - saveSettings(project, forceSavingAllSettings) - } + processOpenedProjects { project -> + saveSettings(project, forceSavingAllSettings) } } diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateSettingsProvider.kt b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateSettingsProvider.kt index 76fbdc3e0b2b..4d7e99f2dcf6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateSettingsProvider.kt +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateSettingsProvider.kt @@ -1,33 +1,22 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. @file:JvmName("UpdateSettingsProviderHelper") package com.intellij.openapi.updateSettings.impl import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.diagnostic.runAndLogException -import com.intellij.openapi.extensions.ProjectExtensionPointName -import com.intellij.openapi.project.ProjectManager -import org.jetbrains.annotations.ApiStatus +import com.intellij.openapi.extensions.ExtensionPointName private val LOG = logger() +private val UPDATE_SETTINGS_PROVIDER_EP = ExtensionPointName("com.intellij.updateSettingsProvider") -@ApiStatus.Experimental -private val UPDATE_SETTINGS_PROVIDER_EP = ProjectExtensionPointName("com.intellij.updateSettingsProvider") - -@ApiStatus.Experimental interface UpdateSettingsProvider { fun getPluginRepositories(): List } internal fun addPluginRepositories(to: MutableList) { - for (project in ProjectManager.getInstance().openProjects) { - if (!project.isInitialized || project.isDisposed) { - continue - } - - for (provider in UPDATE_SETTINGS_PROVIDER_EP.getExtensions(project)) { - LOG.runAndLogException { - to.addAll(provider.getPluginRepositories()) - } + for (provider in UPDATE_SETTINGS_PROVIDER_EP.extensionList) { + LOG.runAndLogException { + to.addAll(provider.getPluginRepositories()) } } } \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index 52f07fb10ab2..20b3833def03 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -313,7 +313,7 @@ - + diff --git a/plugins/configuration-script/src/providers/updateSettingsProvider.kt b/plugins/configuration-script/src/providers/updateSettingsProvider.kt index 13ef479ec97b..4f55b907e866 100644 --- a/plugins/configuration-script/src/providers/updateSettingsProvider.kt +++ b/plugins/configuration-script/src/providers/updateSettingsProvider.kt @@ -6,24 +6,32 @@ import com.intellij.configurationScript.readObject import com.intellij.openapi.components.BaseState import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import com.intellij.openapi.project.processOpenedProjects import com.intellij.openapi.updateSettings.impl.UpdateSettingsProvider +import com.intellij.openapi.util.NotNullLazyKey +import com.intellij.util.SmartList import com.intellij.util.concurrency.SynchronizedClearableLazy import org.yaml.snakeyaml.nodes.MappingNode import org.yaml.snakeyaml.nodes.ScalarNode -private class MyUpdateSettingsProvider(project: Project) : UpdateSettingsProvider { - private val data = SynchronizedClearableLazy { - val node = project.service().getConfigurationNode() - ?: return@SynchronizedClearableLazy null +private val dataKey = NotNullLazyKey.create, Project>("MyUpdateSettingsProvider") { project -> + val data = SynchronizedClearableLazy { + val node = project.service().getConfigurationNode() ?: return@SynchronizedClearableLazy null readPluginsConfiguration(node) } + project.service().registerClearableLazyValue(data) + data +} - init { - project.service().registerClearableLazyValue(data) - } - +private class MyUpdateSettingsProvider : UpdateSettingsProvider { override fun getPluginRepositories(): List { - return data.value?.repositories ?: emptyList() + val result = SmartList() + processOpenedProjects { project -> + dataKey.getValue(project).value?.repositories?.let { + result.addAll(it) + } + } + return result } } @@ -38,8 +46,7 @@ internal fun readPluginsConfiguration(rootNode: MappingNode): PluginsConfigurati val keyNode = tuple.keyNode if (keyNode is ScalarNode && keyNode.value == Keys.plugins) { val valueNode = tuple.valueNode as? MappingNode ?: continue - return readObject(PluginsConfiguration(), - valueNode) as PluginsConfiguration + return readObject(PluginsConfiguration(), valueNode) as PluginsConfiguration } } return null