From fd0bf09bc4cd14cff68e0e4c876d40095f2acae6 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Tue, 24 Mar 2020 09:03:54 -0700 Subject: [PATCH] Formatting: force a space after attribute on parameter (#42466) --- .../CSharpTest/Formatting/FormattingTests.cs | 42 ++++++++++++++++++- .../Rules/TokenBasedFormattingRule.cs | 18 ++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/Workspaces/CSharpTest/Formatting/FormattingTests.cs b/src/Workspaces/CSharpTest/Formatting/FormattingTests.cs index 627ef65090e..7ba8f685dd7 100644 --- a/src/Workspaces/CSharpTest/Formatting/FormattingTests.cs +++ b/src/Workspaces/CSharpTest/Formatting/FormattingTests.cs @@ -4435,7 +4435,7 @@ void AddClass(string name,[OptionalAttribute] object position,[OptionalAttrib var expected = @"class Program { - void AddClass(string name, [OptionalAttribute] object position, [OptionalAttribute] object bases) + void AddClass(string name, [OptionalAttribute] object position, [OptionalAttribute] object bases) { } }"; @@ -9555,5 +9555,45 @@ class C }; }".Replace(" ", "\u00A0")); } + + [Fact, WorkItem(41022, "https://github.com/dotnet/roslyn/issues/41022")] + [Trait(Traits.Feature, Traits.Features.Formatting)] + public async Task SpacingAfterAttribute() + { + var code = @"class C +{ + void M([My]string?[]?[] x) + { + } +}"; + var expectedCode = @"class C +{ + void M([My] string?[]?[] x) + { + } +}"; + + await AssertFormatAsync(expectedCode, code); + } + + [Fact, WorkItem(41022, "https://github.com/dotnet/roslyn/issues/41022")] + [Trait(Traits.Feature, Traits.Features.Formatting)] + public async Task SpacingAfterAttribute_Multiple() + { + var code = @"class C +{ + void M([My][My] int x) + { + } +}"; + var expectedCode = @"class C +{ + void M([My][My] int x) + { + } +}"; + + await AssertFormatAsync(expectedCode, code); + } } } diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs index f0deeab33cf..f7b7ce6a2b8 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs @@ -258,6 +258,24 @@ public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previ return CreateAdjustSpacesOperation(0, AdjustSpacesOption.ForceSpacesIfOnSingleLine); } + if (previousToken.IsKind(SyntaxKind.CloseBracketToken) && + previousToken.Parent.IsKind(SyntaxKind.AttributeList) && + previousToken.Parent.IsParentKind(SyntaxKind.Parameter)) + { + if (currentToken.IsKind(SyntaxKind.OpenBracketToken)) + { + // multiple attribute on parameter stick together + // void M([...][...] + return CreateAdjustSpacesOperation(0, AdjustSpacesOption.ForceSpacesIfOnSingleLine); + } + else + { + // attribute is spaced from parameter type + // void M([...] int + return CreateAdjustSpacesOperation(1, AdjustSpacesOption.ForceSpacesIfOnSingleLine); + } + } + // extension method on tuple type // M(this ( if (currentToken.Kind() == SyntaxKind.OpenParenToken && -- GitLab