Skip to content

Commit 0eabd79

Browse files
handle UInt32/64 hex literals without suffix
1 parent 1770511 commit 0eabd79

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
1414

1515
### C# -> VB
1616

17+
* Hex values in UInt32 and Uint64 ranges not converted properly. [#695](https://github.com/icsharpcode/CodeConverter/pull/695)
1718

1819
## [8.2.1] - 2020-10-28
1920

CodeConverter/VB/CommonConversions.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ internal static ExpressionSyntax GetLiteralExpression(object value, string value
594594
if (value is bool)
595595
return (ExpressionSyntax)((bool)value ? generator.TrueLiteralExpression() : generator.FalseLiteralExpression());
596596

597-
valueText = valueText != null ? ConvertNumericLiteralValueText(valueText) : value.ToString();
597+
valueText = valueText != null ? ConvertNumericLiteralValueText(valueText,value) : value.ToString();
598598

599599
if (value is byte)
600600
return SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(valueText, (byte)value));
@@ -627,7 +627,7 @@ internal static ExpressionSyntax GetLiteralExpression(object value, string value
627627
/// <summary>
628628
/// https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/type-characters
629629
/// </summary>
630-
private static string ConvertNumericLiteralValueText(string valueText)
630+
private static string ConvertNumericLiteralValueText(string valueText,object value)
631631
{
632632
var replacements = new Dictionary<string, string> {
633633
{"U", "UI"},
@@ -649,6 +649,16 @@ private static string ConvertNumericLiteralValueText(string valueText)
649649
if (valueText.Length <= 2) return valueText;
650650

651651
if (valueText.StartsWith("0x")) {
652+
if (value switch {
653+
ulong _ => "UL",
654+
uint _ => "UI",
655+
_ => default
656+
} is { } suffix) {
657+
if (!valueText.EndsWith(suffix)) {
658+
valueText += suffix;
659+
}
660+
}
661+
652662
return "&H" + valueText.Substring(2).Replace("R", "D"); // Undo any accidental replacements that assumed this was a decimal;
653663
}
654664

Tests/VB/SpecialConversionTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,32 @@ await TestConversionCSharpToVisualBasicAsync(
474474
End Class");
475475
}
476476

477+
[Fact]
478+
public async Task Issue695HexAndBinaryLiteralsAsync()
479+
{
480+
await TestConversionCSharpToVisualBasicAsync(
481+
@"class Test
482+
{
483+
public decimal Int32Start = 0x0;
484+
public decimal Int32End = 0x7FFFFFFF;
485+
public decimal UInt32Start = 0x80000000;
486+
public decimal UInt32End = 0xFFFFFFFF;
487+
public decimal Int64Start = 0x100000000;
488+
public decimal Int64End = 0x7FFFFFFFFFFFFFFF;
489+
public decimal UInt64Start = 0x8000000000000000;
490+
public decimal UInt64End = 0xFFFFFFFFFFFFFFFF;
491+
}", @"Friend Class Test
492+
Public Int32Start As Decimal = &H0
493+
Public Int32End As Decimal = &H7FFFFFFF
494+
Public UInt32Start As Decimal = &H80000000UI
495+
Public UInt32End As Decimal = &HFFFFFFFFUI
496+
Public Int64Start As Decimal = &H100000000
497+
Public Int64End As Decimal = &H7FFFFFFFFFFFFFFF
498+
Public UInt64Start As Decimal = &H8000000000000000UL
499+
Public UInt64End As Decimal = &HFFFFFFFFFFFFFFFFUL
500+
End Class");
501+
}
502+
477503
[Fact]
478504
public async Task CaseConflict_LocalWithLocalAsync() {
479505
await TestConversionCSharpToVisualBasicAsync(

0 commit comments

Comments
 (0)