prevent iteration errors

no need to make a copy.
This commit is contained in:
Raymond 2021-09-12 20:33:49 -04:00
parent e7b7da7cca
commit 058522edec

View file

@ -41,10 +41,6 @@ namespace Dalamud.Plugin.Internal
private readonly DirectoryInfo devPluginDirectory;
private readonly BannedPlugin[] bannedPlugins;
private readonly List<LocalPlugin> installedPlugins = new();
private List<RemotePluginManifest> availablePlugins = new();
private List<AvailablePluginUpdate> updatablePlugins = new();
/// <summary>
/// Initializes a new instance of the <see cref="PluginManager"/> class.
/// </summary>
@ -130,7 +126,7 @@ namespace Dalamud.Plugin.Internal
/// <inheritdoc/>
public void Dispose()
{
foreach (var plugin in this.installedPlugins.ToArray())
foreach (var plugin in this.InstalledPlugins)
{
try
{
@ -271,10 +267,8 @@ namespace Dalamud.Plugin.Internal
{
var aggregate = new List<Exception>();
for (var i = 0; i < this.installedPlugins.Count; i++)
foreach (var plugin in this.InstalledPlugins)
{
var plugin = this.installedPlugins[i];
if (plugin.IsLoaded)
{
try
@ -314,11 +308,11 @@ namespace Dalamud.Plugin.Internal
/// <param name="notify">Whether to notify that available plugins have changed afterwards.</param>
public void RefilterPluginMasters(bool notify = true)
{
this.availablePlugins = this.Repos
this.AvailablePlugins = this.Repos
.SelectMany(repo => repo.PluginMaster)
.Where(this.IsManifestEligible)
.Where(this.IsManifestVisible)
.ToList();
.ToImmutableList();
if (notify)
{
@ -570,7 +564,7 @@ namespace Dalamud.Plugin.Internal
}
}
this.installedPlugins.Add(plugin);
this.InstalledPlugins = this.InstalledPlugins.Add(plugin);
return plugin;
}
@ -583,7 +577,7 @@ namespace Dalamud.Plugin.Internal
if (plugin.State != PluginState.Unloaded)
throw new InvalidPluginOperationException($"Unable to remove {plugin.Name}, not unloaded");
this.installedPlugins.Remove(plugin);
this.InstalledPlugins = this.InstalledPlugins.Remove(plugin);
PluginLocations.Remove(plugin.AssemblyName.FullName);
this.NotifyInstalledPluginsChanged();
@ -696,9 +690,9 @@ namespace Dalamud.Plugin.Internal
var updatedList = new List<PluginUpdateStatus>();
// Prevent collection was modified errors
for (var i = 0; i < this.updatablePlugins.Count; i++)
foreach (var plugin in this.UpdatablePlugins)
{
var result = await this.UpdateSinglePluginAsync(this.updatablePlugins[i], false, dryRun);
var result = await this.UpdateSinglePluginAsync(plugin, false, dryRun);
if (result != null)
updatedList.Add(result);
}
@ -758,7 +752,7 @@ namespace Dalamud.Plugin.Internal
try
{
plugin.Disable();
this.installedPlugins.Remove(plugin);
this.InstalledPlugins = this.InstalledPlugins.Remove(plugin);
}
catch (Exception ex)
{
@ -930,15 +924,13 @@ namespace Dalamud.Plugin.Internal
{
var updatablePlugins = new List<AvailablePluginUpdate>();
for (var i = 0; i < this.installedPlugins.Count; i++)
foreach (var plugin in this.InstalledPlugins)
{
var plugin = this.installedPlugins[i];
var installedVersion = plugin.IsTesting
? plugin.Manifest.TestingAssemblyVersion
: plugin.Manifest.AssemblyVersion;
var updates = this.availablePlugins
var updates = this.AvailablePlugins
.Where(remoteManifest => plugin.Manifest.InternalName == remoteManifest.InternalName)
.Select(remoteManifest =>
{
@ -960,7 +952,7 @@ namespace Dalamud.Plugin.Internal
}
}
this.updatablePlugins = updatablePlugins;
this.UpdatablePlugins = updatablePlugins.ToImmutableList();
}
private void NotifyAvailablePluginsChanged()
@ -969,8 +961,6 @@ namespace Dalamud.Plugin.Internal
try
{
this.AvailablePlugins = ImmutableList.CreateRange(this.availablePlugins);
this.UpdatablePlugins = ImmutableList.CreateRange(this.updatablePlugins);
this.OnAvailablePluginsChanged?.Invoke();
}
catch (Exception ex)
@ -985,8 +975,6 @@ namespace Dalamud.Plugin.Internal
try
{
this.InstalledPlugins = ImmutableList.CreateRange(this.installedPlugins);
this.UpdatablePlugins = ImmutableList.CreateRange(this.updatablePlugins);
this.OnInstalledPluginsChanged?.Invoke();
}
catch (Exception ex)