Skip to content

Commit 0155691

Browse files
authored
Add support for user defined compound assignment operators to syntax generator (#78192)
1 parent 6c8b098 commit 0155691

File tree

4 files changed

+143
-0
lines changed

4 files changed

+143
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,17 @@ private static string GetOperatorName(OperatorKind kind)
341341
OperatorKind.True => WellKnownMemberNames.TrueOperatorName,
342342
OperatorKind.UnaryNegation => WellKnownMemberNames.UnaryNegationOperatorName,
343343
OperatorKind.UnaryPlus => WellKnownMemberNames.UnaryPlusOperatorName,
344+
OperatorKind.AdditionAssignment => WellKnownMemberNames.AdditionAssignmentOperatorName,
345+
OperatorKind.SubtractionAssignment => WellKnownMemberNames.SubtractionAssignmentOperatorName,
346+
OperatorKind.MultiplicationAssignment => WellKnownMemberNames.MultiplicationAssignmentOperatorName,
347+
OperatorKind.DivisionAssignment => WellKnownMemberNames.DivisionAssignmentOperatorName,
348+
OperatorKind.ModulusAssignment => WellKnownMemberNames.ModulusAssignmentOperatorName,
349+
OperatorKind.ExclusiveOrAssignment => WellKnownMemberNames.ExclusiveOrAssignmentOperatorName,
350+
OperatorKind.BitwiseAndAssignment => WellKnownMemberNames.BitwiseAndAssignmentOperatorName,
351+
OperatorKind.BitwiseOrAssignment => WellKnownMemberNames.BitwiseOrAssignmentOperatorName,
352+
OperatorKind.LeftShiftAssignment => WellKnownMemberNames.LeftShiftAssignmentOperatorName,
353+
OperatorKind.RightShiftAssignment => WellKnownMemberNames.RightShiftAssignmentOperatorName,
354+
OperatorKind.UnsignedRightShiftAssignment => WellKnownMemberNames.UnsignedRightShiftAssignmentOperatorName,
344355
_ => throw new ArgumentException("Unknown operator kind."),
345356
};
346357

@@ -3349,6 +3360,7 @@ public override SyntaxNode TypeExpression(SpecialType specialType)
33493360
SpecialType.System_UInt16 => UShortKeyword,
33503361
SpecialType.System_UInt32 => UIntKeyword,
33513362
SpecialType.System_UInt64 => ULongKeyword,
3363+
SpecialType.System_Void => VoidKeyword,
33523364
_ => throw new NotSupportedException("Unsupported SpecialType"),
33533365
});
33543366

src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,70 @@ public void TestOperatorDeclaration()
968968
"explicit operator bool (global::System.Int32 p0, global::System.String p1)\r\n{\r\n}");
969969
}
970970

971+
[Fact]
972+
public void TestInstanceOperatorsDeclaration()
973+
{
974+
var returnType = Generator.TypeExpression(SpecialType.System_Void);
975+
976+
VerifySyntax<OperatorDeclarationSyntax>(
977+
Generator.OperatorDeclaration(OperatorKind.Increment, [], returnType),
978+
"void operator ++()\r\n{\r\n}");
979+
980+
VerifySyntax<OperatorDeclarationSyntax>(
981+
Generator.OperatorDeclaration(OperatorKind.Decrement, [], returnType),
982+
"void operator --()\r\n{\r\n}");
983+
984+
var parameterTypes = new[]
985+
{
986+
_emptyCompilation.GetSpecialType(SpecialType.System_Int32)
987+
};
988+
var parameters = parameterTypes.Select((t, i) => Generator.ParameterDeclaration("p" + i, Generator.TypeExpression(t))).ToList();
989+
990+
VerifySyntax<OperatorDeclarationSyntax>(
991+
Generator.OperatorDeclaration(OperatorKind.AdditionAssignment, parameters, returnType),
992+
"void operator +=(global::System.Int32 p0)\r\n{\r\n}");
993+
994+
VerifySyntax<OperatorDeclarationSyntax>(
995+
Generator.OperatorDeclaration(OperatorKind.SubtractionAssignment, parameters, returnType),
996+
"void operator -=(global::System.Int32 p0)\r\n{\r\n}");
997+
998+
VerifySyntax<OperatorDeclarationSyntax>(
999+
Generator.OperatorDeclaration(OperatorKind.MultiplicationAssignment, parameters, returnType),
1000+
"void operator *=(global::System.Int32 p0)\r\n{\r\n}");
1001+
1002+
VerifySyntax<OperatorDeclarationSyntax>(
1003+
Generator.OperatorDeclaration(OperatorKind.DivisionAssignment, parameters, returnType),
1004+
"void operator /=(global::System.Int32 p0)\r\n{\r\n}");
1005+
1006+
VerifySyntax<OperatorDeclarationSyntax>(
1007+
Generator.OperatorDeclaration(OperatorKind.ModulusAssignment, parameters, returnType),
1008+
"void operator %=(global::System.Int32 p0)\r\n{\r\n}");
1009+
1010+
VerifySyntax<OperatorDeclarationSyntax>(
1011+
Generator.OperatorDeclaration(OperatorKind.ExclusiveOrAssignment, parameters, returnType),
1012+
"void operator ^=(global::System.Int32 p0)\r\n{\r\n}");
1013+
1014+
VerifySyntax<OperatorDeclarationSyntax>(
1015+
Generator.OperatorDeclaration(OperatorKind.BitwiseAndAssignment, parameters, returnType),
1016+
"void operator &=(global::System.Int32 p0)\r\n{\r\n}");
1017+
1018+
VerifySyntax<OperatorDeclarationSyntax>(
1019+
Generator.OperatorDeclaration(OperatorKind.BitwiseOrAssignment, parameters, returnType),
1020+
"void operator |=(global::System.Int32 p0)\r\n{\r\n}");
1021+
1022+
VerifySyntax<OperatorDeclarationSyntax>(
1023+
Generator.OperatorDeclaration(OperatorKind.LeftShiftAssignment, parameters, returnType),
1024+
"void operator <<=(global::System.Int32 p0)\r\n{\r\n}");
1025+
1026+
VerifySyntax<OperatorDeclarationSyntax>(
1027+
Generator.OperatorDeclaration(OperatorKind.RightShiftAssignment, parameters, returnType),
1028+
"void operator >>=(global::System.Int32 p0)\r\n{\r\n}");
1029+
1030+
VerifySyntax<OperatorDeclarationSyntax>(
1031+
Generator.OperatorDeclaration(OperatorKind.UnsignedRightShiftAssignment, parameters, returnType),
1032+
"void operator >>>=(global::System.Int32 p0)\r\n{\r\n}");
1033+
}
1034+
9711035
[Fact, WorkItem(63410, "https://github.com/dotnet/roslyn/issues/63410")]
9721036
public void TestCheckedOperator()
9731037
{

src/Workspaces/Core/Portable/Editing/OperatorKind.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,59 @@ public enum OperatorKind
140140
/// The name assigned to the UnsignedRightShift operator.
141141
/// </summary>
142142
UnsignedRightShift,
143+
144+
/// <summary>
145+
/// The name assigned to the AdditionAssignment operator.
146+
/// </summary>
147+
AdditionAssignment,
148+
149+
/// <summary>
150+
/// The name assigned to the SubtractionAssignment operator.
151+
/// </summary>
152+
SubtractionAssignment,
153+
154+
/// <summary>
155+
/// The name assigned to the MultiplicationAssignment operator.
156+
/// </summary>
157+
MultiplicationAssignment,
158+
159+
/// <summary>
160+
/// The name assigned to the DivisionAssignment operator.
161+
/// </summary>
162+
DivisionAssignment,
163+
164+
/// <summary>
165+
/// The name assigned to the ModulusAssignment operator.
166+
/// </summary>
167+
ModulusAssignment,
168+
169+
/// <summary>
170+
/// The name assigned to the ExclusiveOrAssignment operator.
171+
/// </summary>
172+
ExclusiveOrAssignment,
173+
174+
/// <summary>
175+
/// The name assigned to the BitwiseAndAssignment operator.
176+
/// </summary>
177+
BitwiseAndAssignment,
178+
179+
/// <summary>
180+
/// The name assigned to the BitwiseOrAssignment operator.
181+
/// </summary>
182+
BitwiseOrAssignment,
183+
184+
/// <summary>
185+
/// The name assigned to the LeftShiftAssignment operator.
186+
/// </summary>
187+
LeftShiftAssignment,
188+
189+
/// <summary>
190+
/// The name assigned to the RightShiftAssignment operator.
191+
/// </summary>
192+
RightShiftAssignment,
193+
194+
/// <summary>
195+
/// The name assigned to the UnsignedRightShiftAssignment operator.
196+
/// </summary>
197+
UnsignedRightShiftAssignment,
143198
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,14 @@
11
*REMOVED*abstract Microsoft.CodeAnalysis.Editing.SyntaxGenerator.WithModifiers(Microsoft.CodeAnalysis.SyntaxNode declaration, Microsoft.CodeAnalysis.Editing.DeclarationModifiers modifiers) -> Microsoft.CodeAnalysis.SyntaxNode
22
Microsoft.CodeAnalysis.Editing.SyntaxGenerator.WithModifiers(Microsoft.CodeAnalysis.SyntaxNode declaration, Microsoft.CodeAnalysis.Editing.DeclarationModifiers modifiers) -> Microsoft.CodeAnalysis.SyntaxNode
3+
4+
Microsoft.CodeAnalysis.Editing.OperatorKind.AdditionAssignment = 27 -> Microsoft.CodeAnalysis.Editing.OperatorKind
5+
Microsoft.CodeAnalysis.Editing.OperatorKind.BitwiseAndAssignment = 33 -> Microsoft.CodeAnalysis.Editing.OperatorKind
6+
Microsoft.CodeAnalysis.Editing.OperatorKind.BitwiseOrAssignment = 34 -> Microsoft.CodeAnalysis.Editing.OperatorKind
7+
Microsoft.CodeAnalysis.Editing.OperatorKind.DivisionAssignment = 30 -> Microsoft.CodeAnalysis.Editing.OperatorKind
8+
Microsoft.CodeAnalysis.Editing.OperatorKind.ExclusiveOrAssignment = 32 -> Microsoft.CodeAnalysis.Editing.OperatorKind
9+
Microsoft.CodeAnalysis.Editing.OperatorKind.LeftShiftAssignment = 35 -> Microsoft.CodeAnalysis.Editing.OperatorKind
10+
Microsoft.CodeAnalysis.Editing.OperatorKind.ModulusAssignment = 31 -> Microsoft.CodeAnalysis.Editing.OperatorKind
11+
Microsoft.CodeAnalysis.Editing.OperatorKind.MultiplicationAssignment = 29 -> Microsoft.CodeAnalysis.Editing.OperatorKind
12+
Microsoft.CodeAnalysis.Editing.OperatorKind.RightShiftAssignment = 36 -> Microsoft.CodeAnalysis.Editing.OperatorKind
13+
Microsoft.CodeAnalysis.Editing.OperatorKind.SubtractionAssignment = 28 -> Microsoft.CodeAnalysis.Editing.OperatorKind
14+
Microsoft.CodeAnalysis.Editing.OperatorKind.UnsignedRightShiftAssignment = 37 -> Microsoft.CodeAnalysis.Editing.OperatorKind

0 commit comments

Comments
 (0)