diff --git a/src/Microsoft.VisualStudio.SolutionPersistence/Model/ConfigurationRuleFollower.cs b/src/Microsoft.VisualStudio.SolutionPersistence/Model/ConfigurationRuleFollower.cs
index 85247146..6d65615a 100644
--- a/src/Microsoft.VisualStudio.SolutionPersistence/Model/ConfigurationRuleFollower.cs
+++ b/src/Microsoft.VisualStudio.SolutionPersistence/Model/ConfigurationRuleFollower.cs
@@ -6,7 +6,7 @@ namespace Microsoft.VisualStudio.SolutionPersistence.Model;
///
/// Helper to process configuration rules.
///
-internal readonly struct ConfigurationRuleFollower(IReadOnlyList? configurationRules)
+internal readonly ref struct ConfigurationRuleFollower(IReadOnlyList? configurationRules)
{
private readonly IReadOnlyList? configurationRules = configurationRules;
diff --git a/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.Rules.cs b/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.Rules.cs
index 907de597..d374a1fd 100644
--- a/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.Rules.cs
+++ b/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.Rules.cs
@@ -31,7 +31,7 @@ internal sealed partial class SolutionConfigurationMap
///
/// The mappings to update.
/// The rules to run, scoped to their effect.
- private void ApplyRules(in SolutionToProjectMappings projectMappings, in ScopedRules scopedRules)
+ private void ApplyRules(in SolutionToProjectMappings projectMappings, scoped in ScopedRules scopedRules)
{
int iBuildTypeBegin = scopedRules.BuildTypeIndex == ScopedRules.All ? 0 : scopedRules.BuildTypeIndex;
int iBuildTypeEnd = scopedRules.BuildTypeIndex == ScopedRules.All ? this.BuildTypesCount : scopedRules.BuildTypeIndex + 1;
diff --git a/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.cs b/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.cs
index 3a84e19e..1334316f 100644
--- a/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.cs
+++ b/src/Microsoft.VisualStudio.SolutionPersistence/Model/SolutionConfigurationMap.cs
@@ -9,8 +9,8 @@ namespace Microsoft.VisualStudio.SolutionPersistence.Model;
internal sealed partial class SolutionConfigurationMap
{
private readonly SolutionModel solutionModel;
- private readonly Dictionary buildTypesIndex = [];
- private readonly Dictionary platformsIndex = [];
+ private readonly Dictionary buildTypesIndex;
+ private readonly Dictionary platformsIndex;
private readonly Dictionary perProjectCurrent = [];
@@ -19,11 +19,13 @@ internal sealed partial class SolutionConfigurationMap
internal SolutionConfigurationMap(SolutionModel solutionModel)
{
this.solutionModel = solutionModel;
+ this.buildTypesIndex = new Dictionary(solutionModel.BuildTypes.Count);
for (int i = 0; i < solutionModel.BuildTypes.Count; i++)
{
this.buildTypesIndex.Add(solutionModel.BuildTypes[i], i);
}
+ this.platformsIndex = new Dictionary(solutionModel.Platforms.Count);
for (int i = 0; i < solutionModel.Platforms.Count; i++)
{
this.platformsIndex.Add(PlatformNames.Canonical(solutionModel.Platforms[i]), i);
diff --git a/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/SlnV12/SlnV12Extensions.cs b/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/SlnV12/SlnV12Extensions.cs
index bb5b8823..055f2b5e 100644
--- a/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/SlnV12/SlnV12Extensions.cs
+++ b/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/SlnV12/SlnV12Extensions.cs
@@ -265,8 +265,6 @@ static void SetProjectConfigurationPlatforms(SolutionModel solution, SolutionPro
{
ParseProjectConfigLine(solution, projectKey, projectValue);
}
-
- solution.DistillProjectConfigurations();
}
// Applies a .SLN configuration line to the current project configuration.
diff --git a/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/Xml/SlnXMLSerializer.Writer.cs b/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/Xml/SlnXMLSerializer.Writer.cs
index f34ab761..1207ab8e 100644
--- a/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/Xml/SlnXMLSerializer.Writer.cs
+++ b/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/Xml/SlnXMLSerializer.Writer.cs
@@ -43,6 +43,8 @@ internal static async Task SaveAsync(
model.RemoveObsoleteProperties();
}
+ model.DistillProjectConfigurations();
+
// If this started as an XML document, merge the changes back into the original document.
SlnxFile root = modelExtension?.Root ?? CreateNewSlnFile(fullPath, xmlSerializerSettings, model.StringTable);
diff --git a/test/Microsoft.VisualStudio.SolutionPersistence.Tests/Serialization/ManipulateXmlKitchenSink.cs b/test/Microsoft.VisualStudio.SolutionPersistence.Tests/Serialization/ManipulateXmlKitchenSink.cs
index 349717c3..b3fdd143 100644
--- a/test/Microsoft.VisualStudio.SolutionPersistence.Tests/Serialization/ManipulateXmlKitchenSink.cs
+++ b/test/Microsoft.VisualStudio.SolutionPersistence.Tests/Serialization/ManipulateXmlKitchenSink.cs
@@ -41,7 +41,7 @@ static void CreateModifiedModel(SolutionModel solution)
SolutionProjectModel? project = solution.FindProject(Path.Join("other", "Project4.nativeproj"));
Assert.NotNull(project);
- project.AddProjectConfigurationRule(new ConfigurationRule(BuildDimension.Platform, "*", "Z80", "Z80"));
+ project.AddProjectConfigurationRule(new ConfigurationRule(BuildDimension.Platform, "*", "Arm64", "Z80"));
SolutionProjectModel? project3 = solution.FindProject("Project3.csproj");
Assert.NotNull(project3);
diff --git a/test/Microsoft.VisualStudio.SolutionPersistence.Tests/SlnAssets/SlnxWhitespace/KitchenSink-AddConfigurations.slnx.xml b/test/Microsoft.VisualStudio.SolutionPersistence.Tests/SlnAssets/SlnxWhitespace/KitchenSink-AddConfigurations.slnx.xml
index d27565f4..5c6d6a3a 100644
--- a/test/Microsoft.VisualStudio.SolutionPersistence.Tests/SlnAssets/SlnxWhitespace/KitchenSink-AddConfigurations.slnx.xml
+++ b/test/Microsoft.VisualStudio.SolutionPersistence.Tests/SlnAssets/SlnxWhitespace/KitchenSink-AddConfigurations.slnx.xml
@@ -52,7 +52,7 @@
-
+