Skip to content

Commit 83fbd2c

Browse files
j3parkeromsmith
andauthored
Add a bunch of basic syntax to SyncTransformer (#871)
All of this stuff is straight-forward and doesn't need special handling, just recursion. Co-authored-by: Owen Smith <[email protected]>
1 parent 32662a0 commit 83fbd2c

File tree

3 files changed

+149
-0
lines changed

3 files changed

+149
-0
lines changed

src/D2L.CodeStyle.Analyzers/Async/Generator/AsyncToSyncMethodTransformer.cs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,22 +110,101 @@ private BlockSyntax Transform( BlockSyntax block )
110110

111111
private StatementSyntax Transform( StatementSyntax stmt )
112112
=> stmt switch {
113+
BlockSyntax blockStmt => Transform( blockStmt ),
114+
115+
BreakStatementSyntax => stmt,
116+
117+
ContinueStatementSyntax => stmt,
118+
119+
DoStatementSyntax doStmt => doStmt
120+
.WithStatement( Transform( doStmt.Statement ) )
121+
.WithCondition( Transform( doStmt.Condition ) ),
122+
123+
EmptyStatementSyntax => stmt,
124+
113125
ExpressionStatementSyntax exprStmt => exprStmt
114126
.WithExpression( Transform( exprStmt.Expression) ),
115127

128+
GotoStatementSyntax => stmt,
129+
130+
IfStatementSyntax ifStmt => ifStmt
131+
.WithCondition( Transform( ifStmt.Condition ) )
132+
.WithStatement( Transform( ifStmt.Statement ) )
133+
.WithElse( MaybeTransform( ifStmt.Else, Transform ) ),
134+
135+
LabeledStatementSyntax labeledStmt => labeledStmt
136+
.WithStatement( Transform( labeledStmt.Statement ) ),
137+
138+
ThrowStatementSyntax throwStmt => throwStmt
139+
.WithExpression( MaybeTransform( throwStmt.Expression, Transform ) ),
140+
116141
ReturnStatementSyntax returnStmt => returnStmt
117142
.WithExpression( MaybeTransform( returnStmt.Expression, Transform ) ),
118143

144+
WhileStatementSyntax whileStmt => whileStmt
145+
.WithCondition( Transform( whileStmt.Condition ) )
146+
.WithStatement( Transform( whileStmt.Statement ) ),
147+
119148
_ => UnhandledSyntax( stmt )
120149
};
121150

122151
private ExpressionSyntax Transform( ExpressionSyntax expr )
123152
=> expr switch {
153+
AssignmentExpressionSyntax asgnExpr => asgnExpr
154+
.WithLeft( Transform( asgnExpr.Left ) )
155+
.WithRight( Transform( asgnExpr.Right ) ),
156+
157+
BinaryExpressionSyntax binExpr => binExpr
158+
.WithLeft( Transform( binExpr.Left ) )
159+
.WithRight( Transform( binExpr.Right ) ),
160+
161+
162+
ConditionalExpressionSyntax condExpr => condExpr
163+
.WithCondition( Transform( condExpr.Condition ) )
164+
.WithWhenTrue( Transform( condExpr.WhenTrue ) )
165+
.WithWhenFalse( Transform( condExpr.WhenFalse ) ),
166+
167+
DefaultExpressionSyntax => expr,
168+
169+
ElementAccessExpressionSyntax eaExpr => eaExpr
170+
.WithExpression( Transform( eaExpr.Expression ) )
171+
.WithArgumentList( TransformAll( eaExpr.ArgumentList, Transform ) ),
172+
124173
LiteralExpressionSyntax => expr,
125174

175+
ObjectCreationExpressionSyntax newExpr => newExpr
176+
.WithArgumentList( MaybeTransform( newExpr.ArgumentList, Transform ) )
177+
.WithInitializer( MaybeTransform( newExpr.Initializer, Transform ) ),
178+
179+
ParenthesizedExpressionSyntax pExpr => pExpr
180+
.WithExpression( Transform( pExpr.Expression ) ),
181+
182+
PostfixUnaryExpressionSyntax postfixExpr => postfixExpr
183+
.WithOperand( Transform( postfixExpr.Operand ) ),
184+
185+
PrefixUnaryExpressionSyntax prefixExpr => prefixExpr
186+
.WithOperand( Transform( prefixExpr.Operand ) ),
187+
188+
SizeOfExpressionSyntax => expr,
189+
190+
ThisExpressionSyntax => expr,
191+
192+
126193
_ => UnhandledSyntax( expr )
127194
};
128195

196+
private ElseClauseSyntax Transform( ElseClauseSyntax clause )
197+
=> clause.WithStatement( Transform( clause.Statement ) );
198+
199+
private ArgumentListSyntax Transform( ArgumentListSyntax argList )
200+
=> TransformAll( argList, Transform );
201+
202+
private ArgumentSyntax Transform( ArgumentSyntax argument )
203+
=> argument.WithExpression( Transform( argument.Expression ) );
204+
205+
private InitializerExpressionSyntax Transform( InitializerExpressionSyntax initializer )
206+
=> initializer.WithExpressions( TransformAll( initializer.Expressions, Transform ) );
207+
129208
private bool IsGenerateSyncAttribute( AttributeSyntax attribute ) {
130209
var attributeConstructorSymbol = Model.GetSymbolInfo( attribute, Token ).Symbol as IMethodSymbol;
131210

src/D2L.CodeStyle.Analyzers/Async/Generator/SyntaxTransformer.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ protected static SeparatedSyntaxList<TItemOut> TransformAll<TItemIn, TItemOut>(
9797
where TItemOut : SyntaxNode
9898
=> SyntaxFactory.SeparatedList( TransformAllCore( input, transformer ) );
9999

100+
protected static TArgList TransformAll<TArgList>(
101+
TArgList input,
102+
Func<ArgumentSyntax, ArgumentSyntax?> transformer
103+
) where TArgList : BaseArgumentListSyntax
104+
=> (TArgList)input.WithArguments( TransformAll( input.Arguments, transformer ) );
105+
100106
/// <summary>
101107
/// Transform every element of a SyntaxTokenList and filter out default tokens.
102108
/// </summary>

tests/D2L.CodeStyle.Analyzers.Test/Async/Generator/AsyncToSyncMethodTransformerTests.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,70 @@ public void BasicTaskArrow() {
3838
Assert.AreEqual( "[Blocking] int Hello() => 4;", actual.Value.ToFullString() );
3939
}
4040

41+
[Test]
42+
public void Silly() {
43+
var actual = Transform( @"[GenerateSync]
44+
async Task<int> HelloAsync( int[] q ) {
45+
if( 6 == (7 - 1)*2 ) {
46+
return sizeof( ""hello"" );
47+
} else if( this[0]++ == ++this[1] ) {
48+
throw new NotImplementedException( ""foo"" );
49+
} else return 8;
50+
51+
{
52+
{
53+
{ ;;; }
54+
}
55+
}
56+
57+
goto lol;
58+
59+
do {
60+
while( true ) {
61+
continue;
62+
lol: break;
63+
}
64+
} while( false );
65+
66+
this = this;
67+
68+
return 123;
69+
}" );
70+
71+
var expected = @"[Blocking]
72+
int Hello( int[] q ) {
73+
if( 6 == (7 - 1)*2 ) {
74+
return sizeof( ""hello"" );
75+
} else if( this[0]++ == ++this[1] ) {
76+
throw new NotImplementedException( ""foo"" );
77+
} else return 8;
78+
79+
{
80+
{
81+
{ ;;; }
82+
}
83+
}
84+
85+
goto lol;
86+
87+
do {
88+
while( true ) {
89+
continue;
90+
lol: break;
91+
}
92+
} while( false );
93+
94+
this = this;
95+
96+
return 123;
97+
}";
98+
99+
Assert.IsTrue( actual.Success );
100+
Assert.IsEmpty( actual.Diagnostics );
101+
Assert.AreEqual( expected, actual.Value.ToFullString() );
102+
}
103+
104+
41105
[Test]
42106
public void GenerateSyncOnNonAsyncThingFails() {
43107
var actual = Transform( @"[GenerateSync] void Hello() {}" );

0 commit comments

Comments
 (0)