Skip to content

Commit 80f17c4

Browse files
Fix issue where we weren't properly adding elastic trivia to newly generated members (#79571)
2 parents 50561d7 + 6e73c9f commit 80f17c4

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,7 @@ private protected override SyntaxNode MethodDeclaration(
236236

237237
return SyntaxFactory.MethodDeclaration(
238238
attributeLists: default,
239-
// Pass `withLeadingElasticMarker: true` to ensure method will space itself properly within the members it
240-
// is added to.
241-
modifiers: AsModifierList(accessibility, modifiers, SyntaxKind.MethodDeclaration, withLeadingElasticMarker: true),
239+
modifiers: AsModifierList(accessibility, modifiers, SyntaxKind.MethodDeclaration),
242240
returnType: returnType != null ? (TypeSyntax)returnType : SyntaxFactory.PredefinedType(VoidKeyword),
243241
explicitInterfaceSpecifier: null,
244242
identifier: name.ToIdentifierToken(),
@@ -430,12 +428,13 @@ public override SyntaxNode GetAccessorDeclaration(Accessibility accessibility, I
430428
private protected override SyntaxNode SetAccessorDeclaration(Accessibility accessibility, bool isInitOnly, IEnumerable<SyntaxNode>? statements)
431429
=> AccessorDeclaration(isInitOnly ? SyntaxKind.InitAccessorDeclaration : SyntaxKind.SetAccessorDeclaration, accessibility, statements);
432430

433-
private static SyntaxNode AccessorDeclaration(
431+
private static AccessorDeclarationSyntax AccessorDeclaration(
434432
SyntaxKind kind, Accessibility accessibility, IEnumerable<SyntaxNode>? statements)
435433
{
436-
var accessor = SyntaxFactory.AccessorDeclaration(kind);
437-
accessor = accessor.WithModifiers(
438-
AsModifierList(accessibility, DeclarationModifiers.None, SyntaxKind.PropertyDeclaration));
434+
var accessor = SyntaxFactory
435+
.AccessorDeclaration(kind)
436+
.WithModifiers(
437+
AsModifierList(accessibility, DeclarationModifiers.None, SyntaxKind.PropertyDeclaration));
439438

440439
accessor = statements == null
441440
? accessor.WithSemicolonToken(SemicolonToken)
@@ -1437,7 +1436,10 @@ public override SyntaxNode WithAccessibility(SyntaxNode declaration, Accessibili
14371436
modifiers = modifiers.WithIsStatic(false);
14381437
}
14391438

1440-
var newTokens = Merge(tokens, AsModifierList(accessibility, modifiers));
1439+
// We're updating the modifiers for something. We don't want to add elastic trivia in that case as
1440+
// we don't want the act of adding/removing/modifying modifiers to change the formatting of the parent
1441+
// construct.
1442+
var newTokens = Merge(tokens, AsModifierList(accessibility, modifiers, withLeadingElasticMarker: false));
14411443
return SetModifierTokens(d, newTokens);
14421444
});
14431445
}
@@ -1647,7 +1649,10 @@ private SyntaxNode WithModifiersInternal(SyntaxNode declaration, DeclarationModi
16471649
}
16481650
}
16491651

1650-
var newTokens = Merge(tokens, AsModifierList(accessibility, modifiers));
1652+
// We're updating the modifiers for something. We don't want to add elastic trivia in that case as
1653+
// we don't want the act of adding/removing/modifying modifiers to change the formatting of the parent
1654+
// construct.
1655+
var newTokens = Merge(tokens, AsModifierList(accessibility, modifiers, withLeadingElasticMarker: false));
16511656
return SetModifierTokens(d, newTokens);
16521657
});
16531658
}
@@ -1674,13 +1679,13 @@ private static SyntaxTokenList AsModifierList(
16741679
Accessibility accessibility,
16751680
DeclarationModifiers modifiers,
16761681
SyntaxKind kind,
1677-
bool withLeadingElasticMarker = false)
1682+
bool withLeadingElasticMarker = true)
16781683
=> AsModifierList(accessibility, GetAllowedModifiers(kind) & modifiers, withLeadingElasticMarker);
16791684

16801685
private static SyntaxTokenList AsModifierList(
16811686
Accessibility accessibility,
16821687
DeclarationModifiers modifiers,
1683-
bool withLeadingElasticMarker = false)
1688+
bool withLeadingElasticMarker = true)
16841689
{
16851690
using var _ = ArrayBuilder<SyntaxToken>.GetInstance(out var list);
16861691

src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2902,6 +2902,30 @@ interface i
29022902
""");
29032903
}
29042904

2905+
[Fact]
2906+
public void TestMultipleMembersIntoClass()
2907+
{
2908+
using var workspace = new AdhocWorkspace();
2909+
var node = Generator.AddMembers(Generator.ClassDeclaration("C"),
2910+
[
2911+
Generator.MethodDeclaration("M1", returnType: Generator.TypeExpression(SpecialType.System_Void), accessibility: Accessibility.Public),
2912+
Generator.PropertyDeclaration("P1", Generator.TypeExpression(SpecialType.System_Int32), accessibility: Accessibility.Public)
2913+
]);
2914+
2915+
AssertEx.EqualOrDiff(
2916+
"""
2917+
class C
2918+
{
2919+
public void M1()
2920+
{
2921+
}
2922+
2923+
public int P1 { get; set; }
2924+
}
2925+
""",
2926+
Formatter.Format(node, workspace).ToFullString());
2927+
}
2928+
29052929
[Fact, WorkItem("https://github.com/dotnet/roslyn/issues/65932")]
29062930
public void TestAddExpressionBodyMembersToInterface()
29072931
{

0 commit comments

Comments
 (0)