From 8210b8e2934911caaaa605c9b0be869b747a7e50 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Mon, 12 Jan 2026 08:56:38 +1100 Subject: [PATCH 1/3] Ignore case when parsing enum values in settings in VS Code --- .../CohostConfigurationChangedService.cs | 26 ++++++++++---- .../CohostConfigurationChangedServiceTest.cs | 36 +++++++++++++++++++ 2 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs index 86e674e85da..f09a62c8f1f 100644 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs +++ b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.ExternalAccess.Razor.Cohost; using Microsoft.CodeAnalysis.Razor.Logging; +using Microsoft.CodeAnalysis.Razor.Settings; using Microsoft.CodeAnalysis.Razor.Workspaces.Settings; using Microsoft.VisualStudio.Razor.LanguageClient.Cohost; @@ -59,16 +60,21 @@ private async Task RefreshOptionsAsync(RazorCohostRequestContext requestContext, cancellationToken).ConfigureAwait(false); var current = _clientSettingsManager.GetClientSettings().AdvancedSettings; - var settings = current with - { - CodeBlockBraceOnNextLine = GetBooleanOptionValue(options[0], current.CodeBlockBraceOnNextLine), - AttributeIndentStyle = GetEnumOptionValue(options[1], current.AttributeIndentStyle), - CommitElementsWithSpace = GetBooleanOptionValue(options[2], current.CommitElementsWithSpace), - }; + var settings = UpdateSettingsFromJson(current, options); _clientSettingsManager.Update(settings); } + private static ClientAdvancedSettings UpdateSettingsFromJson(ClientAdvancedSettings settigns, JsonArray jsonArray) + { + return settigns with + { + CodeBlockBraceOnNextLine = GetBooleanOptionValue(jsonArray[0], settigns.CodeBlockBraceOnNextLine), + AttributeIndentStyle = GetEnumOptionValue(jsonArray[1], settigns.AttributeIndentStyle), + CommitElementsWithSpace = GetBooleanOptionValue(jsonArray[2], settigns.CommitElementsWithSpace), + }; + } + private static bool GetBooleanOptionValue(JsonNode? jsonNode, bool defaultValue) { if (jsonNode is null) @@ -86,11 +92,17 @@ private static T GetEnumOptionValue(JsonNode? jsonNode, T defaultValue) where return defaultValue; } - if (Enum.TryParse(jsonNode.GetValue(), out var value)) + if (Enum.TryParse(jsonNode.GetValue(), ignoreCase: true, out var value)) { return value; } return defaultValue; } + + public static class TestAccessor + { + public static ClientAdvancedSettings UpdateSettingsFromJson(ClientAdvancedSettings settigns, JsonArray jsonArray) + => CohostConfigurationChangedService.UpdateSettingsFromJson(settigns, jsonArray); + } } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs new file mode 100644 index 00000000000..e14ec9bad65 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Text.Json.Nodes; +using Microsoft.AspNetCore.Razor; +using Microsoft.CodeAnalysis.Razor.Settings; +using Microsoft.VisualStudio.Razor.LanguageClient.Cohost; +using Microsoft.VisualStudioCode.RazorExtension.Endpoints; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.VisualStudioCode.RazorExtension.Test; + +public class CohostConfigurationChangedServiceTest(ITestOutputHelper testOutput) : CohostEndpointTestBase(testOutput) +{ + [Fact] + public void ReadSettings() + { + var settings = ClientSettingsManager.GetClientSettings().AdvancedSettings; + + // If the defaults for these settings change, the json parsing could break and we might not know + Assert.False(settings.CodeBlockBraceOnNextLine); + Assert.Equal(AttributeIndentStyle.AlignWithFirst, settings.AttributeIndentStyle); + Assert.True(settings.CommitElementsWithSpace); + + var json = (JsonArray)JsonNode.Parse(""" + ["true", "indentByOne", "false"] + """).AssumeNotNull(); + + var updatedSettings = CohostConfigurationChangedService.TestAccessor.UpdateSettingsFromJson(settings, json); + + Assert.True(updatedSettings.CodeBlockBraceOnNextLine); + Assert.Equal(AttributeIndentStyle.IndentByOne, updatedSettings.AttributeIndentStyle); + Assert.False(updatedSettings.CommitElementsWithSpace); + } +} From e2a17c40feacd3462b7fc3be77df2f4853423df6 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 13 Jan 2026 08:05:32 +1100 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Chris Sienkiewicz --- .../Services/CohostConfigurationChangedService.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs index f09a62c8f1f..c3321011963 100644 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs +++ b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/CohostConfigurationChangedService.cs @@ -65,13 +65,13 @@ private async Task RefreshOptionsAsync(RazorCohostRequestContext requestContext, _clientSettingsManager.Update(settings); } - private static ClientAdvancedSettings UpdateSettingsFromJson(ClientAdvancedSettings settigns, JsonArray jsonArray) + private static ClientAdvancedSettings UpdateSettingsFromJson(ClientAdvancedSettings settings, JsonArray jsonArray) { - return settigns with + return settings with { - CodeBlockBraceOnNextLine = GetBooleanOptionValue(jsonArray[0], settigns.CodeBlockBraceOnNextLine), - AttributeIndentStyle = GetEnumOptionValue(jsonArray[1], settigns.AttributeIndentStyle), - CommitElementsWithSpace = GetBooleanOptionValue(jsonArray[2], settigns.CommitElementsWithSpace), + CodeBlockBraceOnNextLine = GetBooleanOptionValue(jsonArray[0], settings.CodeBlockBraceOnNextLine), + AttributeIndentStyle = GetEnumOptionValue(jsonArray[1], settings.AttributeIndentStyle), + CommitElementsWithSpace = GetBooleanOptionValue(jsonArray[2], settings.CommitElementsWithSpace), }; } From 7422663ec1b7577019d63e6de4eaef69259ca911 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 13 Jan 2026 08:06:21 +1100 Subject: [PATCH 3/3] Apply suggestion from @davidwengier --- .../CohostConfigurationChangedServiceTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs index e14ec9bad65..a8fcd759007 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/CohostConfigurationChangedServiceTest.cs @@ -23,7 +23,7 @@ public void ReadSettings() Assert.Equal(AttributeIndentStyle.AlignWithFirst, settings.AttributeIndentStyle); Assert.True(settings.CommitElementsWithSpace); - var json = (JsonArray)JsonNode.Parse(""" + var json = (JsonArray)JsonNode.Parse(""" ["true", "indentByOne", "false"] """).AssumeNotNull();