Skip to content

Commit 0c37d0e

Browse files
committed
Address review: move char/empty comparison to TryConvertToNullOrEmptyCheck
Move the root cause fix (char vs empty string comparison) from BinaryExpressionConverter into VisualBasicEqualityComparison.TryConvertToNull OrEmptyCheck, which is the natural home for all null/empty comparison rewrites. This also correctly handles OptionCompareText (char comparison is never text-sensitive so it runs before the OptionCompareTextCaseInsensitive bail-out). https://claude.ai/code/session_01AkwUvu3XuCdj3D4axoX4UX
1 parent fd91263 commit 0c37d0e

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

CodeConverter/CSharp/BinaryExpressionConverter.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,6 @@ private async Task<CSharpSyntaxNode> ConvertBinaryExpressionAsync(VBasic.Syntax.
8787
}
8888
if (lhsTypeInfo.Type?.SpecialType == SpecialType.System_Char && rhsTypeInfo.Type?.SpecialType == SpecialType.System_Char) {
8989
// Do nothing, char comparison
90-
} else if (!_visualBasicEqualityComparison.OptionCompareTextCaseInsensitive &&
91-
((lhsTypeInfo.Type?.SpecialType == SpecialType.System_Char && rhsTypeInfo.Type?.SpecialType == SpecialType.System_String && _visualBasicEqualityComparison.IsNothingOrEmpty(node.Right)) ||
92-
(rhsTypeInfo.Type?.SpecialType == SpecialType.System_Char && lhsTypeInfo.Type?.SpecialType == SpecialType.System_String && _visualBasicEqualityComparison.IsNothingOrEmpty(node.Left)))) {
93-
if (lhsTypeInfo.Type?.SpecialType == SpecialType.System_Char) {
94-
rhs = CS.SyntaxFactory.MemberAccessExpression(CS.SyntaxKind.SimpleMemberAccessExpression, CS.SyntaxFactory.PredefinedType(CS.SyntaxFactory.Token(CS.SyntaxKind.CharKeyword)), CS.SyntaxFactory.IdentifierName("MinValue"));
95-
omitConversion = true;
96-
} else {
97-
lhs = CS.SyntaxFactory.MemberAccessExpression(CS.SyntaxKind.SimpleMemberAccessExpression, CS.SyntaxFactory.PredefinedType(CS.SyntaxFactory.Token(CS.SyntaxKind.CharKeyword)), CS.SyntaxFactory.IdentifierName("MinValue"));
98-
omitConversion = true;
99-
}
10090
} else {
10191
(lhs, rhs) = _visualBasicEqualityComparison.AdjustForVbStringComparison(node.Left, lhs, lhsTypeInfo, false, node.Right, rhs, rhsTypeInfo, false);
10292
omitConversion = true; // Already handled within for the appropriate types (rhs can become int in comparison)

CodeConverter/CSharp/VisualBasicEqualityComparison.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,31 @@ private static ObjectCreationExpressionSyntax NewStringFromArg(ExpressionSyntax
180180
public bool TryConvertToNullOrEmptyCheck(VBSyntax.BinaryExpressionSyntax node, ExpressionSyntax lhs,
181181
ExpressionSyntax rhs, TypeInfo lhsTypeInfo, TypeInfo rhsTypeInfo, out CSharpSyntaxNode? visitBinaryExpression)
182182
{
183-
if (OptionCompareTextCaseInsensitive)
184-
{
185-
visitBinaryExpression = null;
186-
return false;
187-
}
188-
189183
bool lhsEmpty = IsNothingOrEmpty(node.Left);
190184
bool rhsEmpty = IsNothingOrEmpty(node.Right);
191185

192186
if (lhsEmpty || rhsEmpty)
193187
{
194188
var arg = lhsEmpty ? rhs : lhs;
195189
var argType = lhsEmpty ? rhsTypeInfo : lhsTypeInfo;
190+
191+
if (argType.Type?.SpecialType == SpecialType.System_Char) {
192+
// char = "" in VB means char == '\0' (char.MinValue) in C#; not affected by OptionCompareText
193+
var charMinValue = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
194+
SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.CharKeyword)),
195+
ValidSyntaxFactory.IdentifierName("MinValue"));
196+
var equalityKind = node.IsKind(VBasic.SyntaxKind.NotEqualsExpression) ? SyntaxKind.NotEqualsExpression : SyntaxKind.EqualsExpression;
197+
var opToken = SyntaxFactory.Token(node.IsKind(VBasic.SyntaxKind.NotEqualsExpression) ? SyntaxKind.ExclamationEqualsToken : SyntaxKind.EqualsEqualsToken);
198+
visitBinaryExpression = SyntaxFactory.BinaryExpression(equalityKind, arg, opToken, charMinValue);
199+
return true;
200+
}
201+
202+
if (OptionCompareTextCaseInsensitive)
203+
{
204+
visitBinaryExpression = null;
205+
return false;
206+
}
207+
196208
if (argType.Type?.SpecialType != SpecialType.System_String && argType.Type?.SpecialType != SpecialType.System_Object) {
197209
visitBinaryExpression = null;
198210
return false;

0 commit comments

Comments
 (0)