Skip to content

Commit

Permalink
Honour users' settings as a starting point for Razor formatting (#76066)
Browse files Browse the repository at this point in the history
In dotnet/razor#6166 we changed Razor to pass
indentation options into a Roslyn service, rather than create a
workspace and apply changes to it, etc. Sadly this regressed C#
formatting in Razor files, because the code was just creating a new
`CSharpSyntaxFormattingOptions` and not starting from the users
settings.

Fixes https://devdiv.visualstudio.com/DevDiv/_workitems/edit/2305075
Fixes https://devdiv.visualstudio.com/DevDiv/_workitems/edit/2305404
  • Loading branch information
davidwengier authored Nov 28, 2024
2 parents 2eeef7b + e2ba725 commit 23d79b6
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System;
using System.Composition;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;

namespace Microsoft.CodeAnalysis.Options;
Expand Down Expand Up @@ -63,4 +64,7 @@ public bool GetGenerateConstructorFromMembersOptionsAddNullChecks(string languag

public void SetGenerateConstructorFromMembersOptionsAddNullChecks(string language, bool value)
=> _globalOptions.SetGlobalOption(s_addNullChecks, language, value);

public SyntaxFormattingOptions GetSyntaxFormattingOptions(LanguageServices languageServices)
=> _globalOptions.GetSyntaxFormattingOptions(languageServices);
}
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOpt
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.GetGenerateConstructorFromMembersOptionsAddNullChecks(string! language) -> bool
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.GetGenerateEqualsAndGetHashCodeFromMembersGenerateOperators(string! language) -> bool
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.GetGenerateEqualsAndGetHashCodeFromMembersImplementIEquatable(string! language) -> bool
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.GetSyntaxFormattingOptions(Microsoft.CodeAnalysis.Host.LanguageServices! languageServices) -> Microsoft.CodeAnalysis.Formatting.SyntaxFormattingOptions!
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.InlineHintsOptionsDisplayAllOverride.get -> bool
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.InlineHintsOptionsDisplayAllOverride.set -> void
Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options.OmnisharpLegacyGlobalOptionsWorkspaceService.OmniSharpCleanCodeGenerationOptionsProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System;
using System.Composition;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Options;

Expand Down Expand Up @@ -54,5 +55,8 @@ public bool GetGenerateConstructorFromMembersOptionsAddNullChecks(string languag
public void SetGenerateConstructorFromMembersOptionsAddNullChecks(string language, bool value)
{
}

public SyntaxFormattingOptions GetSyntaxFormattingOptions(LanguageServices languageServices)
=> SyntaxFormattingOptions.CommonDefaults;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public static async Task<ImmutableArray<TextChange>> GetFormattingChangesAsync(
return ImmutableArray<TextChange>.Empty;
}

var formattingOptions = GetFormattingOptions(indentationOptions);
var formattingOptions = GetFormattingOptions(document.Project.Solution.Services, indentationOptions);
var roslynIndentationOptions = new IndentationOptions(formattingOptions)
{
AutoFormattingOptions = autoFormattingOptions.UnderlyingObject,
Expand All @@ -65,7 +65,7 @@ public static IList<TextChange> GetFormattedTextChanges(
CancellationToken cancellationToken)
{
Contract.ThrowIfFalse(root.Language is LanguageNames.CSharp);
return Formatter.GetFormattedTextChanges(root, span, services.SolutionServices, GetFormattingOptions(indentationOptions), cancellationToken);
return Formatter.GetFormattedTextChanges(root, span, services.SolutionServices, GetFormattingOptions(services.SolutionServices, indentationOptions), cancellationToken);
}

public static SyntaxNode Format(
Expand All @@ -75,19 +75,26 @@ public static SyntaxNode Format(
CancellationToken cancellationToken)
{
Contract.ThrowIfFalse(root.Language is LanguageNames.CSharp);
return Formatter.Format(root, services.SolutionServices, GetFormattingOptions(indentationOptions), cancellationToken: cancellationToken);
return Formatter.Format(root, services.SolutionServices, GetFormattingOptions(services.SolutionServices, indentationOptions), cancellationToken: cancellationToken);
}

private static SyntaxFormattingOptions GetFormattingOptions(RazorIndentationOptions indentationOptions)
=> new CSharpSyntaxFormattingOptions()
private static SyntaxFormattingOptions GetFormattingOptions(SolutionServices services, RazorIndentationOptions indentationOptions)
{
var legacyOptionsService = services.GetService<ILegacyGlobalOptionsWorkspaceService>();
var formattingOptions = legacyOptionsService is null
? new CSharpSyntaxFormattingOptions()
: legacyOptionsService.GetSyntaxFormattingOptions(services.GetLanguageServices(LanguageNames.CSharp));

return formattingOptions with
{
LineFormatting = new()
LineFormatting = formattingOptions.LineFormatting with
{
UseTabs = indentationOptions.UseTabs,
TabSize = indentationOptions.TabSize,
IndentationSize = indentationOptions.IndentationSize,
NewLine = CSharpSyntaxFormattingOptions.Default.NewLine
}
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Host;

namespace Microsoft.CodeAnalysis.Options;
Expand All @@ -25,4 +26,6 @@ internal interface ILegacyGlobalOptionsWorkspaceService : IWorkspaceService

public bool GetGenerateConstructorFromMembersOptionsAddNullChecks(string language);
public void SetGenerateConstructorFromMembersOptionsAddNullChecks(string language, bool value);

SyntaxFormattingOptions GetSyntaxFormattingOptions(LanguageServices languageServices);
}

0 comments on commit 23d79b6

Please sign in to comment.