Skip to content

Commit 05eb57e

Browse files
Fix non-string case regression - fixes #585
1 parent 597352b commit 05eb57e

2 files changed

Lines changed: 62 additions & 11 deletions

File tree

CodeConverter/CSharp/MethodBodyExecutableStatementVisitor.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -766,20 +766,26 @@ private CasePatternSwitchLabelSyntax WrapInCasePatternSwitchLabelSyntax(VBSyntax
766766
patternMatch = ValidSyntaxFactory.VarPattern(varName);
767767
ExpressionSyntax csLeft = SyntaxFactory.IdentifierName(varName), csRight = expression;
768768
var caseTypeInfo = _semanticModel.GetTypeInfo(vbCase);
769-
var vbEquality = CommonConversions.VisualBasicEqualityComparison;
770-
if (vbEquality.GetObjectEqualityType(typeInfo, caseTypeInfo) == VisualBasicEqualityComparison.RequiredType.Object) {
771-
expression = vbEquality.GetFullExpressionForVbObjectComparison(csLeft, csRight);
772-
} else {
769+
expression = EqualsAdjustedForStringComparison(node, vbCase, typeInfo, csLeft, csRight, caseTypeInfo);
770+
}
771+
772+
var colonToken = SyntaxFactory.Token(SyntaxKind.ColonToken);
773+
return SyntaxFactory.CasePatternSwitchLabel(patternMatch, SyntaxFactory.WhenClause(expression), colonToken);
774+
}
775+
776+
private ExpressionSyntax EqualsAdjustedForStringComparison(VBSyntax.SelectBlockSyntax node, VBSyntax.ExpressionSyntax vbCase, TypeInfo lhsTypeInfo, ExpressionSyntax csLeft, ExpressionSyntax csRight, TypeInfo rhsTypeInfo)
777+
{
778+
var vbEquality = CommonConversions.VisualBasicEqualityComparison;
779+
switch (vbEquality.GetObjectEqualityType(lhsTypeInfo, rhsTypeInfo)) {
780+
case VisualBasicEqualityComparison.RequiredType.Object:
781+
return vbEquality.GetFullExpressionForVbObjectComparison(csLeft, csRight);
782+
case VisualBasicEqualityComparison.RequiredType.StringOnly:
773783
// We know lhs isn't null, because we always coalesce it in the switch expression
774784
(csLeft, csRight) = vbEquality
775-
.AdjustForVbStringComparison(node.SelectStatement.Expression, csLeft, typeInfo, true, vbCase, csRight, caseTypeInfo, false);
776-
expression = SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, csLeft, csRight);
777-
}
785+
.AdjustForVbStringComparison(node.SelectStatement.Expression, csLeft, lhsTypeInfo, true, vbCase, csRight, rhsTypeInfo, false);
786+
break;
778787
}
779-
780-
var casePatternSwitchLabelSyntax = SyntaxFactory.CasePatternSwitchLabel(patternMatch,
781-
SyntaxFactory.WhenClause(expression), SyntaxFactory.Token(SyntaxKind.ColonToken));
782-
return casePatternSwitchLabelSyntax;
788+
return SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, csLeft, csRight);
783789
}
784790

785791
public override async Task<SyntaxList<StatementSyntax>> VisitWithBlock(VBSyntax.WithBlockSyntax node)

Tests/CSharp/StatementTests/StatementTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1972,5 +1972,50 @@ internal static string prtWhere(EWhere aWhere)
19721972
}
19731973
}");
19741974
}
1975+
1976+
[Fact] //https://github.com/icsharpcode/CodeConverter/issues/585
1977+
public async Task Issue585_SwitchNonStringAsync()
1978+
{
1979+
await TestConversionVisualBasicToCSharpAsync(@"Imports System.Data
1980+
1981+
Public Class NonStringSelect
1982+
Private Function Test3(CurRow As DataRow)
1983+
For Each CurCol As DataColumn In CurRow.GetColumnsInError
1984+
Select Case CurCol.DataType
1985+
Case GetType(String)
1986+
Return False
1987+
Case Else
1988+
Return True
1989+
End Select
1990+
Next
1991+
End Function
1992+
End Class", @"using System.Data;
1993+
1994+
public partial class NonStringSelect
1995+
{
1996+
private object Test3(DataRow CurRow)
1997+
{
1998+
foreach (DataColumn CurCol in CurRow.GetColumnsInError())
1999+
{
2000+
switch (CurCol.DataType)
2001+
{
2002+
case var @case when @case == typeof(string):
2003+
{
2004+
return false;
2005+
}
2006+
2007+
default:
2008+
{
2009+
return true;
2010+
}
2011+
}
2012+
}
2013+
2014+
return default;
2015+
}
2016+
}
2017+
1 target compilation errors:
2018+
CS0825: The contextual keyword 'var' may only appear within a local variable declaration or in script code");
2019+
}
19752020
}
19762021
}

0 commit comments

Comments
 (0)