Skip to content

Commit a0b737f

Browse files
Merge pull request #699 from BrianFreemanAtlanta/UnsignedIntegers
handle U32/U64 hex literals without suffix
2 parents 4abccdb + 0eabd79 commit a0b737f

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
@@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
1313

1414
### C# -> VB
1515

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

1718
## [8.2.2] - 2021-01-23
1819

CodeConverter/VB/CommonConversions.cs

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

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

601601
if (value is byte)
602602
return SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(valueText, (byte)value));
@@ -629,7 +629,7 @@ internal static ExpressionSyntax GetLiteralExpression(object value, string value
629629
/// <summary>
630630
/// https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/type-characters
631631
/// </summary>
632-
private static string ConvertNumericLiteralValueText(string valueText)
632+
private static string ConvertNumericLiteralValueText(string valueText,object value)
633633
{
634634
var replacements = new Dictionary<string, string> {
635635
{"U", "UI"},
@@ -651,6 +651,16 @@ private static string ConvertNumericLiteralValueText(string valueText)
651651
if (valueText.Length <= 2) return valueText;
652652

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

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)