Skip to content

Commit a1d0ddd

Browse files
authored
Include wrapping options in editorconfig formatting options (#73938)
1 parent 299c14f commit a1d0ddd

File tree

35 files changed

+170
-143
lines changed

35 files changed

+170
-143
lines changed

src/Analyzers/CSharp/CodeFixes/UseCollectionExpression/CSharpCollectionExpressionRewriter.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Threading.Tasks;
1111
using Microsoft.CodeAnalysis.CodeActions;
1212
using Microsoft.CodeAnalysis.CSharp.Extensions;
13+
using Microsoft.CodeAnalysis.CSharp.Formatting;
1314
using Microsoft.CodeAnalysis.CSharp.Syntax;
1415
using Microsoft.CodeAnalysis.Formatting;
1516
using Microsoft.CodeAnalysis.Indentation;
@@ -47,20 +48,15 @@ public static async Task<CollectionExpressionSyntax> CreateCollectionExpressionA
4748
var document = await ParsedDocument.CreateAsync(workspaceDocument, cancellationToken).ConfigureAwait(false);
4849

4950
#if CODE_STYLE
50-
var formattingOptions = SyntaxFormattingOptions.CommonDefaults;
51+
var formattingOptions = CSharpSyntaxFormattingOptions.Default;
5152
#else
52-
var formattingOptions = await workspaceDocument.GetSyntaxFormattingOptionsAsync(
53+
var formattingOptions = (CSharpSyntaxFormattingOptions)await workspaceDocument.GetSyntaxFormattingOptionsAsync(
5354
fallbackOptions, cancellationToken).ConfigureAwait(false);
5455
#endif
5556

5657
var indentationOptions = new IndentationOptions(formattingOptions);
5758

58-
// the option is currently not an editorconfig option, so not available in code style layer
59-
#if CODE_STYLE
60-
var wrappingLength = CodeActionOptions.DefaultCollectionExpressionWrappingLength;
61-
#else
62-
var wrappingLength = fallbackOptions.GetOptions(document.LanguageServices).CollectionExpressionWrappingLength;
63-
#endif
59+
var wrappingLength = formattingOptions.CollectionExpressionWrappingLength;
6460

6561
var initializer = getInitializer(expressionToReplace);
6662
var endOfLine = DetermineEndOfLine(document, expressionToReplace, formattingOptions);

src/Analyzers/Core/CodeFixes/UseConditionalExpression/AbstractUseConditionalExpressionCodeFixProvider.cs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,22 @@ internal abstract class AbstractUseConditionalExpressionCodeFixProvider<
4747

4848
protected abstract Task FixOneAsync(
4949
Document document, Diagnostic diagnostic,
50-
SyntaxEditor editor, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken);
50+
SyntaxEditor editor, SyntaxFormattingOptions formattingOptions, CancellationToken cancellationToken);
5151

5252
protected override async Task FixAllAsync(
5353
Document document, ImmutableArray<Diagnostic> diagnostics, SyntaxEditor editor,
5454
CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken)
5555
{
5656
var root = await document.GetRequiredSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
5757

58+
#if CODE_STYLE
59+
var provider = GetSyntaxFormatting();
60+
#else
61+
var provider = document.Project.Solution.Services;
62+
#endif
63+
var options = await document.GetCodeFixOptionsAsync(fallbackOptions, cancellationToken).ConfigureAwait(false);
64+
var formattingOptions = options.GetFormattingOptions(GetSyntaxFormatting());
65+
5866
// Defer to our callback to actually make the edits for each diagnostic. In turn, it
5967
// will return 'true' if it made a multi-line conditional expression. In that case,
6068
// we'll need to explicitly format this node so we can get our special multi-line
@@ -63,7 +71,7 @@ protected override async Task FixAllAsync(
6371
foreach (var diagnostic in diagnostics)
6472
{
6573
await FixOneAsync(
66-
document, diagnostic, nestedEditor, fallbackOptions, cancellationToken).ConfigureAwait(false);
74+
document, diagnostic, nestedEditor, formattingOptions, cancellationToken).ConfigureAwait(false);
6775
}
6876

6977
var changedRoot = nestedEditor.GetChangedRoot();
@@ -74,13 +82,6 @@ await FixOneAsync(
7482
// annotation on it.
7583
var rules = ImmutableArray.Create(GetMultiLineFormattingRule());
7684

77-
#if CODE_STYLE
78-
var provider = GetSyntaxFormatting();
79-
#else
80-
var provider = document.Project.Solution.Services;
81-
#endif
82-
var options = await document.GetCodeFixOptionsAsync(fallbackOptions, cancellationToken).ConfigureAwait(false);
83-
var formattingOptions = options.GetFormattingOptions(GetSyntaxFormatting());
8485
var formattedRoot = Formatter.Format(changedRoot, SpecializedFormattingAnnotation, provider, formattingOptions, rules, cancellationToken);
8586

8687
changedRoot = formattedRoot;
@@ -98,7 +99,7 @@ protected async Task<TExpressionSyntax> CreateConditionalExpressionAsync(
9899
Document document, IConditionalOperation ifOperation,
99100
IOperation trueStatement, IOperation falseStatement,
100101
IOperation trueValue, IOperation falseValue,
101-
bool isRef, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken)
102+
bool isRef, SyntaxFormattingOptions formattingOptions, CancellationToken cancellationToken)
102103
{
103104
var generator = SyntaxGenerator.GetGenerator(document);
104105
var generatorInternal = document.GetRequiredLanguageService<SyntaxGeneratorInternal>();
@@ -125,7 +126,7 @@ protected async Task<TExpressionSyntax> CreateConditionalExpressionAsync(
125126
conditionalExpression = conditionalExpression.WithAdditionalAnnotations(Simplifier.Annotation);
126127
var makeMultiLine = await MakeMultiLineAsync(
127128
document, condition,
128-
trueValue.Syntax, falseValue.Syntax, fallbackOptions, cancellationToken).ConfigureAwait(false);
129+
trueValue.Syntax, falseValue.Syntax, formattingOptions, cancellationToken).ConfigureAwait(false);
129130
if (makeMultiLine)
130131
{
131132
conditionalExpression = conditionalExpression.WithAdditionalAnnotations(
@@ -148,7 +149,7 @@ private static TExpressionSyntax MakeRef(SyntaxGeneratorInternal generator, bool
148149
/// Checks if we should wrap the conditional expression over multiple lines.
149150
/// </summary>
150151
private static async Task<bool> MakeMultiLineAsync(
151-
Document document, SyntaxNode condition, SyntaxNode trueSyntax, SyntaxNode falseSyntax, CodeActionOptionsProvider fallbackOptions,
152+
Document document, SyntaxNode condition, SyntaxNode trueSyntax, SyntaxNode falseSyntax, SyntaxFormattingOptions formattingOptions,
152153
CancellationToken cancellationToken)
153154
{
154155
var sourceText = await document.GetValueTextAsync(cancellationToken).ConfigureAwait(false);
@@ -159,14 +160,7 @@ private static async Task<bool> MakeMultiLineAsync(
159160
return true;
160161
}
161162

162-
// the option is currently not an editorconfig option, so not available in code style layer
163-
var wrappingLength =
164-
#if !CODE_STYLE
165-
fallbackOptions.GetOptions(document.Project.Services)?.ConditionalExpressionWrappingLength ??
166-
#endif
167-
CodeActionOptions.DefaultConditionalExpressionWrappingLength;
168-
169-
if (condition.Span.Length + trueSyntax.Span.Length + falseSyntax.Span.Length > wrappingLength)
163+
if (condition.Span.Length + trueSyntax.Span.Length + falseSyntax.Span.Length > formattingOptions.ConditionalExpressionWrappingLength)
170164
{
171165
return true;
172166
}

src/Analyzers/Core/CodeFixes/UseConditionalExpression/ForAssignment/AbstractUseConditionalExpressionForAssignmentCodeFixProvider.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,20 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
using System;
65
using System.Collections.Immutable;
6+
using System.Diagnostics.CodeAnalysis;
77
using System.Linq;
88
using System.Threading;
99
using System.Threading.Tasks;
10-
using Microsoft.CodeAnalysis.CodeActions;
1110
using Microsoft.CodeAnalysis.CodeFixes;
1211
using Microsoft.CodeAnalysis.Diagnostics;
1312
using Microsoft.CodeAnalysis.Editing;
13+
using Microsoft.CodeAnalysis.Formatting;
1414
using Microsoft.CodeAnalysis.LanguageService;
1515
using Microsoft.CodeAnalysis.Operations;
1616
using Microsoft.CodeAnalysis.Shared.Extensions;
1717
using Roslyn.Utilities;
18-
using static Microsoft.CodeAnalysis.UseConditionalExpression.UseConditionalExpressionHelpers;
1918
using static Microsoft.CodeAnalysis.UseConditionalExpression.UseConditionalExpressionCodeFixHelpers;
20-
using System.Diagnostics.CodeAnalysis;
2119

2220
namespace Microsoft.CodeAnalysis.UseConditionalExpression;
2321

@@ -59,7 +57,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
5957
/// </summary>
6058
protected override async Task FixOneAsync(
6159
Document document, Diagnostic diagnostic,
62-
SyntaxEditor editor, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken)
60+
SyntaxEditor editor, SyntaxFormattingOptions formattingOptions, CancellationToken cancellationToken)
6361
{
6462
var syntaxFacts = document.GetRequiredLanguageService<ISyntaxFactsService>();
6563
var ifStatement = diagnostic.AdditionalLocations[0].FindNode(cancellationToken);
@@ -81,7 +79,7 @@ protected override async Task FixOneAsync(
8179
trueAssignment?.Value ?? trueStatement,
8280
falseAssignment?.Value ?? falseStatement,
8381
isRef,
84-
fallbackOptions,
82+
formattingOptions,
8583
cancellationToken).ConfigureAwait(false);
8684

8785
// See if we're assigning to a variable declared directly above the if statement. If so,

src/Analyzers/Core/CodeFixes/UseConditionalExpression/ForReturn/AbstractUseConditionalExpressionForReturnCodeFixProvider.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Microsoft.CodeAnalysis.CodeFixes;
1212
using Microsoft.CodeAnalysis.Diagnostics;
1313
using Microsoft.CodeAnalysis.Editing;
14+
using Microsoft.CodeAnalysis.Formatting;
1415
using Microsoft.CodeAnalysis.LanguageService;
1516
using Microsoft.CodeAnalysis.Operations;
1617
using Microsoft.CodeAnalysis.Shared.Extensions;
@@ -45,7 +46,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
4546

4647
protected override async Task FixOneAsync(
4748
Document document, Diagnostic diagnostic,
48-
SyntaxEditor editor, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken)
49+
SyntaxEditor editor, SyntaxFormattingOptions formattingOptions, CancellationToken cancellationToken)
4950
{
5051
var syntaxFacts = document.GetRequiredLanguageService<ISyntaxFactsService>();
5152
var ifStatement = (TIfStatementSyntax)diagnostic.AdditionalLocations[0].FindNode(cancellationToken);
@@ -69,7 +70,7 @@ protected override async Task FixOneAsync(
6970
trueReturn?.ReturnedValue ?? trueStatement,
7071
falseReturn?.ReturnedValue ?? falseStatement,
7172
isRef,
72-
fallbackOptions,
73+
formattingOptions,
7374
cancellationToken).ConfigureAwait(false);
7475

7576
var generatorInternal = document.GetRequiredLanguageService<SyntaxGeneratorInternal>();

src/EditorFeatures/TestUtilities/Utilities/VisualBasicCodeActionOptions.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ internal static class VisualBasicCodeActionOptions
2424
CodeStyleOptions = VisualBasicIdeCodeStyleOptions.Default
2525
};
2626

27-
public static CodeActionOptions WithWrappingColumn(this CodeActionOptions options, int value)
28-
=> options with { WrappingColumn = value };
29-
3027
public static CodeActionOptions With(this CodeActionOptions options, VisualBasicSyntaxFormattingOptions value)
3128
=> options with { CleanupOptions = options.CleanupOptions with { FormattingOptions = value } };
3229

src/Features/CSharp/Portable/Wrapping/CSharpSyntaxWrappingOptions.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ namespace Microsoft.CodeAnalysis.CSharp.Wrapping;
1212

1313
internal sealed class CSharpSyntaxWrappingOptions(
1414
CSharpSyntaxFormattingOptions formattingOptions,
15-
int wrappingColumn,
1615
OperatorPlacementWhenWrappingPreference operatorPlacement,
17-
bool newLinesForBracesInObjectCollectionArrayInitializers) : SyntaxWrappingOptions(formattingOptions, wrappingColumn, operatorPlacement)
16+
bool newLinesForBracesInObjectCollectionArrayInitializers) : SyntaxWrappingOptions(formattingOptions, operatorPlacement)
1817
{
1918
public readonly bool NewLinesForBracesInObjectCollectionArrayInitializers = newLinesForBracesInObjectCollectionArrayInitializers;
2019
}
@@ -28,7 +27,6 @@ public static CSharpSyntaxWrappingOptions GetCSharpSyntaxWrappingOptions(this IO
2827
return new(
2928
new CSharpSyntaxFormattingOptions(options, (CSharpSyntaxFormattingOptions)fallbackOptions.CleanupOptions.FormattingOptions),
3029
operatorPlacement: options.GetOption(CodeStyleOptions2.OperatorPlacementWhenWrapping, fallbackOptions.CodeStyleOptions.OperatorPlacementWhenWrapping),
31-
wrappingColumn: fallbackOptions.WrappingColumn,
3230
newLinesForBracesInObjectCollectionArrayInitializers: options.GetOption(CSharpFormattingOptions2.NewLineBeforeOpenBrace, newLineBeforeOpenBraceDefault).HasFlag(NewLineBeforeOpenBracePlacement.ObjectCollectionArrayInitializers));
3331
}
3432
}

src/Features/CSharpTest/Wrapping/AbstractWrappingTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Microsoft.CodeAnalysis.CodeRefactorings;
1111
using Microsoft.CodeAnalysis.CSharp.Wrapping;
1212
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings;
13+
using Microsoft.CodeAnalysis.Formatting;
1314
using Microsoft.CodeAnalysis.Test.Utilities;
1415

1516
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Wrapping;
@@ -23,7 +24,7 @@ protected sealed override ImmutableArray<CodeAction> MassageActions(ImmutableArr
2324
=> FlattenActions(actions);
2425

2526
private protected TestParameters GetIndentionColumn(int column)
26-
=> new(globalOptions: Option(CodeActionOptionsStorage.WrappingColumn, column));
27+
=> new(options: Option(FormattingOptions2.WrappingColumn, column));
2728

2829
protected Task TestAllWrappingCasesAsync(
2930
string input,

src/Features/Core/Portable/Wrapping/SyntaxWrappingOptions.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,18 @@ namespace Microsoft.CodeAnalysis.Wrapping;
1010
internal abstract class SyntaxWrappingOptions
1111
{
1212
public readonly SyntaxFormattingOptions FormattingOptions;
13-
public readonly int WrappingColumn;
1413
public readonly OperatorPlacementWhenWrappingPreference OperatorPlacement;
1514

1615
protected SyntaxWrappingOptions(
1716
SyntaxFormattingOptions formattingOptions,
18-
int wrappingColumn,
1917
OperatorPlacementWhenWrappingPreference operatorPlacement)
2018
{
2119
FormattingOptions = formattingOptions;
22-
WrappingColumn = wrappingColumn;
2320
OperatorPlacement = operatorPlacement;
2421
}
2522

2623
public bool UseTabs => FormattingOptions.UseTabs;
2724
public int TabSize => FormattingOptions.TabSize;
2825
public string NewLine => FormattingOptions.NewLine;
26+
public int WrappingColumn => FormattingOptions.WrappingColumn;
2927
}

src/Features/DiagnosticsTestUtilities/CodeActionsLegacy/AbstractCodeActionTest_NoEditor.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,7 @@ internal async Task<CodeRefactoring> GetCodeRefactoringAsync(
106106

107107
using var _ = ArrayBuilder<(CodeAction, TextSpan?)>.GetInstance(out var actions);
108108

109-
var codeActionOptionsProvider = parameters.globalOptions?.IsEmpty() == false
110-
? CodeActionOptionsStorage.GetCodeActionOptionsProvider(workspace.GlobalOptions)
111-
: CodeActionOptions.DefaultProvider;
112-
109+
var codeActionOptionsProvider = CodeActionOptions.DefaultProvider;
113110
var context = new CodeRefactoringContext(document, selectedOrAnnotatedSpan, (a, t) => actions.Add((a, t)), codeActionOptionsProvider, CancellationToken.None);
114111
await provider.ComputeRefactoringsAsync(context);
115112
var result = actions.Count > 0 ? new CodeRefactoring(provider, actions.ToImmutable(), FixAllProviderInfo.Create(provider), codeActionOptionsProvider) : null;

src/Features/VisualBasic/Portable/Wrapping/VisualBasicSyntaxWrappingOptions.vb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Wrapping
1616

1717
Public Sub New(
1818
formattingOptions As VisualBasicSyntaxFormattingOptions,
19-
wrappingColumn As Integer,
2019
operatorPlacement As OperatorPlacementWhenWrappingPreference)
2120

22-
MyBase.New(formattingOptions, wrappingColumn, operatorPlacement)
21+
MyBase.New(formattingOptions, operatorPlacement)
2322
End Sub
2423

2524
Public Shared Function Create(options As IOptionsReader, fallbackOptions As CodeActionOptions) As VisualBasicSyntaxWrappingOptions
2625
Return New VisualBasicSyntaxWrappingOptions(
2726
formattingOptions:=New VisualBasicSyntaxFormattingOptions(options, DirectCast(fallbackOptions.CleanupOptions.FormattingOptions, VisualBasicSyntaxFormattingOptions)),
28-
operatorPlacement:=options.GetOption(CodeStyleOptions2.OperatorPlacementWhenWrapping, fallbackOptions.CodeStyleOptions.OperatorPlacementWhenWrapping),
29-
wrappingColumn:=fallbackOptions.WrappingColumn)
27+
operatorPlacement:=options.GetOption(CodeStyleOptions2.OperatorPlacementWhenWrapping, fallbackOptions.CodeStyleOptions.OperatorPlacementWhenWrapping))
3028
End Function
3129
End Class
3230
End Namespace

0 commit comments

Comments
 (0)