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 @@ - +