@@ -143,6 +143,10 @@ public override async Task<SyntaxList<StatementSyntax>> VisitExpressionStatement
143143
144144 public override async Task < SyntaxList < StatementSyntax > > VisitAssignmentStatement ( VBSyntax . AssignmentStatementSyntax node )
145145 {
146+ if ( node . IsKind ( VBasic . SyntaxKind . MidAssignmentStatement ) && node . Left is VBSyntax . MidExpressionSyntax mes ) {
147+ return await ConvertMidAssignment ( node , mes ) ;
148+ }
149+
146150 var lhs = ( ExpressionSyntax ) await node . Left . AcceptAsync ( _expressionVisitor ) ;
147151 var lOperation = _semanticModel . GetOperation ( node . Left ) ;
148152
@@ -160,7 +164,7 @@ _methodNode is VBSyntax.MethodBlockSyntax mb &&
160164
161165 if ( node . IsKind ( VBasic . SyntaxKind . ExponentiateAssignmentStatement ) ) {
162166 rhs = SyntaxFactory . InvocationExpression (
163- SyntaxFactory . ParseExpression ( $ " { nameof ( Math ) } . { nameof ( Math . Pow ) } " ) ,
167+ ValidSyntaxFactory . MemberAccess ( nameof ( Math ) , nameof ( Math . Pow ) ) ,
164168 ExpressionSyntaxExtensions . CreateArgList ( lhs , rhs ) ) ;
165169 }
166170 var kind = node . Kind ( ) . ConvertToken ( TokenContext . Local ) ;
@@ -172,6 +176,21 @@ _methodNode is VBSyntax.MethodBlockSyntax mb &&
172176 return postAssignment . Insert ( 0 , SyntaxFactory . ExpressionStatement ( assignment ) ) ;
173177 }
174178
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+
175194 /// <remarks>
176195 /// <see cref="CommonConversions.ConvertIdentifier"/> ensures we convert the property access to a field access
177196 /// </remarks>
@@ -214,7 +233,7 @@ private async Task<SyntaxList<StatementSyntax>> ConvertRedimClause(VBSyntax.Redi
214233 if ( ! preserve ) return SingleStatement ( newArrayAssignment ) ;
215234
216235 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 ) ;
218237 var arrayCopyIfNotNull = CreateConditionalArrayCopy ( node , ( IdentifierNameSyntax ) oldTargetExpression , csTargetArrayExpression , convertedBounds ) ;
219238
220239 return stmts . AddRange ( new StatementSyntax [ ] { newArrayAssignment , arrayCopyIfNotNull } ) ;
@@ -618,7 +637,7 @@ public override async Task<SyntaxList<StatementSyntax>> VisitGoToStatement(VBSyn
618637 public override async Task < SyntaxList < StatementSyntax > > VisitSelectBlock ( VBSyntax . SelectBlockSyntax node )
619638 {
620639 var vbExpr = node . SelectStatement . Expression ;
621- var ( csExpr , stmts , csExprWithSourceMapping ) = await GetExpressionWithoutSideEffects ( vbExpr , "switchExpr" ) ;
640+ var ( csExpr , stmts , csExprWithSourceMapping ) = await GetExpressionWithoutSideEffectsAsync ( vbExpr , "switchExpr" ) ;
622641 var usedConstantValues = new HashSet < object > ( ) ;
623642 var sections = new List < SwitchSectionSyntax > ( ) ;
624643 foreach ( var block in node . CaseBlocks ) {
@@ -666,9 +685,10 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSelectBlock(VBSynta
666685 return stmts . Add ( switchStatementSyntax ) ;
667686 }
668687
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 )
670689 {
671690 var expr = ( ExpressionSyntax ) await vbExpr . AcceptAsync ( _expressionVisitor ) ;
691+ expr = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( vbExpr , expr ) ;
672692 SyntaxList < StatementSyntax > stmts = SyntaxFactory . List < StatementSyntax > ( ) ;
673693 ExpressionSyntax exprWithoutSideEffects ;
674694 ExpressionSyntax reusableExprWithoutSideEffects ;
@@ -723,7 +743,7 @@ private CasePatternSwitchLabelSyntax WrapInCasePatternSwitchLabelSyntax(VBSyntax
723743
724744 public override async Task < SyntaxList < StatementSyntax > > VisitWithBlock ( VBSyntax . WithBlockSyntax node )
725745 {
726- var ( lhsExpression , prefixDeclarations , _) = await GetExpressionWithoutSideEffects ( node . WithStatement . Expression , "withBlock" ) ;
746+ var ( lhsExpression , prefixDeclarations , _) = await GetExpressionWithoutSideEffectsAsync ( node . WithStatement . Expression , "withBlock" ) ;
727747
728748 _withBlockLhs . Push ( lhsExpression ) ;
729749 try {
0 commit comments