Skip to content

Commit dd1c792

Browse files
Coerce to string in option compare text for char arrays
1 parent 17aa7e3 commit dd1c792

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

CodeConverter/CSharp/VisualBasicEqualityComparison.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using VBSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax;
1414
using VBSyntaxKind = Microsoft.CodeAnalysis.VisualBasic.SyntaxKind;
1515
using VBasic = Microsoft.CodeAnalysis.VisualBasic;
16+
using System.Diagnostics.Tracing;
1617

1718
namespace ICSharpCode.CodeConverter.CSharp
1819
{
@@ -76,15 +77,15 @@ public RequiredType GetObjectEqualityType(VBSyntax.BinaryExpressionSyntax node,
7677
if (IsNonEmptyStringLiteral(vbLeft) || IsNonEmptyStringLiteral(vbRight)) {
7778
return (csLeft, csRight);
7879
}
79-
return (VbCoerceToString(vbLeft, csLeft, lhsTypeInfo), VbCoerceToString(vbRight, csRight, rhsTypeInfo));
80+
return (VbCoerceToNonNullString(vbLeft, csLeft, lhsTypeInfo), VbCoerceToNonNullString(vbRight, csRight, rhsTypeInfo));
8081
}
8182

8283
private static bool IsNonEmptyStringLiteral(VBSyntax.ExpressionSyntax vbExpr)
8384
{
8485
return vbExpr.SkipParens().IsKind(VBSyntaxKind.StringLiteralExpression) && vbExpr is VBSyntax.LiteralExpressionSyntax literal && !IsEmptyString(literal);
8586
}
8687

87-
private ExpressionSyntax VbCoerceToString(VBSyntax.ExpressionSyntax vbNode, ExpressionSyntax csNode, TypeInfo typeInfo)
88+
private ExpressionSyntax VbCoerceToNonNullString(VBSyntax.ExpressionSyntax vbNode, ExpressionSyntax csNode, TypeInfo typeInfo)
8889
{
8990
bool isStringType = typeInfo.Type.SpecialType == SpecialType.System_String;
9091

@@ -100,7 +101,12 @@ private ExpressionSyntax VbCoerceToString(VBSyntax.ExpressionSyntax vbNode, Expr
100101
? SyntaxFactory.ParenthesizedExpression(Coalesce(csNode, EmptyStringExpression()))
101102
: Coalesce(csNode, EmptyCharArrayExpression());
102103

103-
return !isStringType ? NewStringFromArg(csNode) : csNode;
104+
return VbCoerceToString(csNode, typeInfo);
105+
}
106+
107+
private static ExpressionSyntax VbCoerceToString(ExpressionSyntax csNode, TypeInfo typeInfo)
108+
{
109+
return typeInfo.Type.SpecialType == SpecialType.System_String ? csNode : NewStringFromArg(csNode);
104110
}
105111

106112
private bool CanBeNull(VBSyntax.ExpressionSyntax vbNode)
@@ -200,12 +206,14 @@ private static ExpressionSyntax NegateIfNeeded(VBSyntax.BinaryExpressionSyntax n
200206
{
201207
if (OptionCompareTextCaseInsensitive) {
202208
ExtraUsingDirectives.Add("System.Globalization");
209+
(csLeft, csRight) = (VbCoerceToString(csLeft, lhsTypeInfo), VbCoerceToString(csRight, rhsTypeInfo));
203210
var compareOptions = SyntaxFactory.Argument(GetCompareTextCaseInsensitiveCompareOptions());
204211
var compareString = SyntaxFactory.InvocationExpression(ValidSyntaxFactory.MemberAccess(nameof(CultureInfo), nameof(CultureInfo.CurrentCulture),
205212
nameof(CultureInfo.CompareInfo), nameof(CompareInfo.Compare)),
206213
SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(new[]
207214
{SyntaxFactory.Argument(csLeft), SyntaxFactory.Argument(csRight), compareOptions})));
208-
csLeft = compareString;
215+
216+
csLeft = compareString;
209217
csRight = SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression,
210218
SyntaxFactory.Literal(0));
211219
} else {

0 commit comments

Comments
 (0)