@@ -143,6 +143,10 @@ public override async Task<SyntaxList<StatementSyntax>> VisitExpressionStatement
143
143
144
144
public override async Task < SyntaxList < StatementSyntax > > VisitAssignmentStatement ( VBSyntax . AssignmentStatementSyntax node )
145
145
{
146
+ if ( node . IsKind ( VBasic . SyntaxKind . MidAssignmentStatement ) && node . Left is VBSyntax . MidExpressionSyntax mes ) {
147
+ return await ConvertMidAssignment ( node , mes ) ;
148
+ }
149
+
146
150
var lhs = ( ExpressionSyntax ) await node . Left . AcceptAsync ( _expressionVisitor ) ;
147
151
var lOperation = _semanticModel . GetOperation ( node . Left ) ;
148
152
@@ -160,7 +164,7 @@ _methodNode is VBSyntax.MethodBlockSyntax mb &&
160
164
161
165
if ( node . IsKind ( VBasic . SyntaxKind . ExponentiateAssignmentStatement ) ) {
162
166
rhs = SyntaxFactory . InvocationExpression (
163
- SyntaxFactory . ParseExpression ( $ " { nameof ( Math ) } . { nameof ( Math . Pow ) } " ) ,
167
+ ValidSyntaxFactory . MemberAccess ( nameof ( Math ) , nameof ( Math . Pow ) ) ,
164
168
ExpressionSyntaxExtensions . CreateArgList ( lhs , rhs ) ) ;
165
169
}
166
170
var kind = node . Kind ( ) . ConvertToken ( TokenContext . Local ) ;
@@ -172,6 +176,21 @@ _methodNode is VBSyntax.MethodBlockSyntax mb &&
172
176
return postAssignment . Insert ( 0 , SyntaxFactory . ExpressionStatement ( assignment ) ) ;
173
177
}
174
178
179
+ private async Task < SyntaxList < StatementSyntax > > ConvertMidAssignment ( VBSyntax . AssignmentStatementSyntax node , VBSyntax . MidExpressionSyntax mes )
180
+ {
181
+ _extraUsingDirectives . Add ( "Microsoft.VisualBasic.CompilerServices" ) ;
182
+ var midFunction = ValidSyntaxFactory . MemberAccess ( "StringType" , "MidStmtStr" ) ;
183
+ var midArgList = ( ArgumentListSyntax ) await mes . ArgumentList . AcceptAsync ( _expressionVisitor ) ;
184
+ var ( reusable , statements , _) = await GetExpressionWithoutSideEffectsAsync ( node . Right , "midTmp" ) ;
185
+ if ( midArgList . Arguments . Count == 2 ) {
186
+ var length = ValidSyntaxFactory . MemberAccess ( reusable , "Length" ) ;
187
+ midArgList = midArgList . AddArguments ( SyntaxFactory . Argument ( length ) ) ;
188
+ }
189
+ midArgList = midArgList . AddArguments ( SyntaxFactory . Argument ( reusable ) ) ;
190
+ var invokeMid = SyntaxFactory . InvocationExpression ( midFunction , midArgList ) ;
191
+ return statements . Add ( SyntaxFactory . ExpressionStatement ( invokeMid ) ) ;
192
+ }
193
+
175
194
/// <remarks>
176
195
/// <see cref="CommonConversions.ConvertIdentifier"/> ensures we convert the property access to a field access
177
196
/// </remarks>
@@ -214,7 +233,7 @@ private async Task<SyntaxList<StatementSyntax>> ConvertRedimClause(VBSyntax.Redi
214
233
if ( ! preserve ) return SingleStatement ( newArrayAssignment ) ;
215
234
216
235
var lastIdentifierText = node . Expression . DescendantNodesAndSelf ( ) . OfType < VBSyntax . IdentifierNameSyntax > ( ) . Last ( ) . Identifier . Text ;
217
- var ( oldTargetExpression , stmts , _) = await GetExpressionWithoutSideEffects ( node . Expression , "old" + lastIdentifierText . ToPascalCase ( ) , true ) ;
236
+ var ( oldTargetExpression , stmts , _) = await GetExpressionWithoutSideEffectsAsync ( node . Expression , "old" + lastIdentifierText . ToPascalCase ( ) , true ) ;
218
237
var arrayCopyIfNotNull = CreateConditionalArrayCopy ( node , ( IdentifierNameSyntax ) oldTargetExpression , csTargetArrayExpression , convertedBounds ) ;
219
238
220
239
return stmts . AddRange ( new StatementSyntax [ ] { newArrayAssignment , arrayCopyIfNotNull } ) ;
@@ -618,7 +637,7 @@ public override async Task<SyntaxList<StatementSyntax>> VisitGoToStatement(VBSyn
618
637
public override async Task < SyntaxList < StatementSyntax > > VisitSelectBlock ( VBSyntax . SelectBlockSyntax node )
619
638
{
620
639
var vbExpr = node . SelectStatement . Expression ;
621
- var ( csExpr , stmts , csExprWithSourceMapping ) = await GetExpressionWithoutSideEffects ( vbExpr , "switchExpr" ) ;
640
+ var ( csExpr , stmts , csExprWithSourceMapping ) = await GetExpressionWithoutSideEffectsAsync ( vbExpr , "switchExpr" ) ;
622
641
var usedConstantValues = new HashSet < object > ( ) ;
623
642
var sections = new List < SwitchSectionSyntax > ( ) ;
624
643
foreach ( var block in node . CaseBlocks ) {
@@ -666,9 +685,10 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSelectBlock(VBSynta
666
685
return stmts . Add ( switchStatementSyntax ) ;
667
686
}
668
687
669
- private async Task < ( ExpressionSyntax Reusable , SyntaxList < StatementSyntax > Statements , ExpressionSyntax SingleUse ) > GetExpressionWithoutSideEffects ( VBSyntax . ExpressionSyntax vbExpr , string variableNameBase , bool forceVariable = false )
688
+ private async Task < ( ExpressionSyntax Reusable , SyntaxList < StatementSyntax > Statements , ExpressionSyntax SingleUse ) > GetExpressionWithoutSideEffectsAsync ( VBSyntax . ExpressionSyntax vbExpr , string variableNameBase , bool forceVariable = false )
670
689
{
671
690
var expr = ( ExpressionSyntax ) await vbExpr . AcceptAsync ( _expressionVisitor ) ;
691
+ expr = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( vbExpr , expr ) ;
672
692
SyntaxList < StatementSyntax > stmts = SyntaxFactory . List < StatementSyntax > ( ) ;
673
693
ExpressionSyntax exprWithoutSideEffects ;
674
694
ExpressionSyntax reusableExprWithoutSideEffects ;
@@ -723,7 +743,7 @@ private CasePatternSwitchLabelSyntax WrapInCasePatternSwitchLabelSyntax(VBSyntax
723
743
724
744
public override async Task < SyntaxList < StatementSyntax > > VisitWithBlock ( VBSyntax . WithBlockSyntax node )
725
745
{
726
- var ( lhsExpression , prefixDeclarations , _) = await GetExpressionWithoutSideEffects ( node . WithStatement . Expression , "withBlock" ) ;
746
+ var ( lhsExpression , prefixDeclarations , _) = await GetExpressionWithoutSideEffectsAsync ( node . WithStatement . Expression , "withBlock" ) ;
727
747
728
748
_withBlockLhs . Push ( lhsExpression ) ;
729
749
try {
0 commit comments