Skip to content

Commit 55ca53a

Browse files
Convert if parts in expected order
1 parent ab34487 commit 55ca53a

2 files changed

Lines changed: 15 additions & 9 deletions

File tree

CodeConverter/CSharp/MethodBodyExecutableStatementVisitor.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -424,17 +424,23 @@ public override async Task<SyntaxList<StatementSyntax>> VisitMultiLineIfBlock(VB
424424
var elseClause = await ConvertElseClause(node.ElseBlock);
425425
elseClause = elseClause.WithVbSourceMappingFrom(node.ElseBlock); //Special case where explicit mapping is needed since block becomes clause so cannot be easily visited
426426

427-
foreach (var elseIf in node.ElseIfBlocks.Reverse()) {
428-
var elseBlock = SyntaxFactory.Block(await ConvertStatements(elseIf.Statements));
429-
var elseIfCondition = (ExpressionSyntax) await elseIf.ElseIfStatement.Condition.AcceptAsync(_expressionVisitor);
430-
elseIfCondition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(elseIf.ElseIfStatement.Condition, elseIfCondition, forceTargetType: _vbBooleanTypeSymbol);
431-
var ifStmt = SyntaxFactory.IfStatement(elseIfCondition, elseBlock, elseClause);
427+
var elseIfBlocks = await node.ElseIfBlocks.SelectAsync(async elseIf => await ConvertElseIf(elseIf));
428+
foreach (var elseIf in elseIfBlocks.Reverse()) {
429+
var ifStmt = SyntaxFactory.IfStatement(elseIf.ElseIfCondition, elseIf.ElseBlock, elseClause);
432430
elseClause = SyntaxFactory.ElseClause(ifStmt);
433431
}
434432

435433
return SingleStatement(SyntaxFactory.IfStatement(condition, block, elseClause));
436434
}
437435

436+
private async Task<(ExpressionSyntax ElseIfCondition, BlockSyntax ElseBlock)> ConvertElseIf(VBSyntax.ElseIfBlockSyntax elseIf)
437+
{
438+
var elseBlock = SyntaxFactory.Block(await ConvertStatements(elseIf.Statements));
439+
var elseIfCondition = (ExpressionSyntax)await elseIf.ElseIfStatement.Condition.AcceptAsync(_expressionVisitor);
440+
elseIfCondition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(elseIf.ElseIfStatement.Condition, elseIfCondition, forceTargetType: _vbBooleanTypeSymbol);
441+
return (elseIfCondition, elseBlock);
442+
}
443+
438444
private async Task<ElseClauseSyntax> ConvertElseClause(VBSyntax.ElseBlockSyntax elseBlock)
439445
{
440446
if (elseBlock == null) return null;

Tests/CSharp/ExpressionTests/ByRefTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,19 +398,19 @@ public void UsesRef(bool someBool, int someInt)
398398
int argvrbTst3 = Prop;
399399
bool c = TakesRef(ref argvrbTst3);
400400
Prop = argvrbTst3; // Requires variable before, and to assign back after
401-
bool localTakesRef() { int argvrbTst = Prop; var ret = TakesRef(ref argvrbTst); Prop = argvrbTst; return ret; }
401+
bool localTakesRef() { int argvrbTst = 3; var ret = TakesRef(ref argvrbTst); return ret; }
402402
403-
bool localTakesRef1() { int argvrbTst = 3; var ret = TakesRef(ref argvrbTst); return ret; }
403+
bool localTakesRef1() { int argvrbTst = Prop; var ret = TakesRef(ref argvrbTst); Prop = argvrbTst; return ret; }
404404
405405
if (16 > someInt || TakesRef(ref someInt)) // Convert directly
406406
{
407407
Console.WriteLine(1);
408408
}
409-
else if (someBool && localTakesRef1()) // Requires variable before (in local function)
409+
else if (someBool && localTakesRef()) // Requires variable before (in local function)
410410
{
411411
someInt += 1;
412412
}
413-
else if (localTakesRef()) // Requires variable before, and to assign back after (in local function)
413+
else if (localTakesRef1()) // Requires variable before, and to assign back after (in local function)
414414
{
415415
someInt -= 2;
416416
}

0 commit comments

Comments
 (0)