Skip to content

Commit c613473

Browse files
Fix string -> enum - fixes #476
1 parent 21da307 commit c613473

3 files changed

Lines changed: 26 additions & 1 deletion

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
* Improve numeric casts [#580](https://github.com/icsharpcode/CodeConverter/issues/580)
1515
* Add ref to conversion of RaiseEvent where needed [#584](https://github.com/icsharpcode/CodeConverter/issues/584)
1616
* Rename clashing type memvers [#420](https://github.com/icsharpcode/CodeConverter/issues/420)
17+
* Fix conversion for string implicitly converted to enum [#476](https://github.com/icsharpcode/CodeConverter/issues/476)
1718

1819
### C# -> VB
1920

CodeConverter/CSharp/TypeConversionAnalyzer.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ public ExpressionSyntax AddExplicitConversion(Microsoft.CodeAnalysis.VisualBasic
8282
private ExpressionSyntax AddTypeConversion(VBSyntax.ExpressionSyntax vbNode, ExpressionSyntax csNode, TypeConversionKind conversionKind, bool addParenthesisIfNeeded, ITypeSymbol vbType, ITypeSymbol vbConvertedType)
8383
{
8484
switch (conversionKind) {
85+
case TypeConversionKind.EnumConversionThenCast:
86+
csNode = AddTypeConversion(vbNode, csNode, TypeConversionKind.Conversion, addParenthesisIfNeeded, vbType, ((INamedTypeSymbol) vbConvertedType).EnumUnderlyingType);
87+
return AddTypeConversion(vbNode, csNode, TypeConversionKind.NonDestructiveCast, addParenthesisIfNeeded, vbType, vbConvertedType);
8588
case TypeConversionKind.Unknown:
8689
case TypeConversionKind.Identity:
8790
return addParenthesisIfNeeded ? VbSyntaxNodeExtensions.ParenthesizeIfPrecedenceCouldChange(vbNode, csNode) : csNode;
@@ -186,7 +189,7 @@ private bool TryAnalyzeCsConversion(Microsoft.CodeAnalysis.VisualBasic.Syntax.Ex
186189
return true;
187190
}
188191
if (isConvertToString || vbConversion.IsNarrowing) {
189-
typeConversionKind = TypeConversionKind.Conversion;
192+
typeConversionKind = vbConvertedType.IsEnumType() && !csConversion.Exists ? TypeConversionKind.EnumConversionThenCast : TypeConversionKind.Conversion;
190193
return true;
191194
}
192195
} else if (vbConversion.IsWidening && vbConversion.IsNumeric && csConversion.IsImplicit &&
@@ -309,6 +312,7 @@ public enum TypeConversionKind
309312
DestructiveCast,
310313
NonDestructiveCast,
311314
Conversion,
315+
EnumConversionThenCast,
312316
NullableBool,
313317
StringToCharArray
314318
}

Tests/CSharp/TypeCastTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,26 @@ namespace ICSharpCode.CodeConverter.Tests.CSharp
77
{
88
public class TypeCastTests : ConverterTestBase
99
{
10+
[Fact]
11+
public async Task NumericStringToEnumAsync()
12+
{
13+
await TestConversionVisualBasicToCSharpAsync(
14+
@"Public Class NumericStringToEnum
15+
Public Shared Sub Main()
16+
MsgBox(NameOf(Main), ""1"", True)
17+
End Sub
18+
End Class" + Environment.NewLine, @"using Microsoft.VisualBasic; // Install-Package Microsoft.VisualBasic
19+
using Microsoft.VisualBasic.CompilerServices; // Install-Package Microsoft.VisualBasic
20+
21+
public partial class NumericStringToEnum
22+
{
23+
public static void Main()
24+
{
25+
Interaction.MsgBox(nameof(Main), (MsgBoxStyle)Conversions.ToInteger(""1""), true);
26+
}
27+
}" + Environment.NewLine);
28+
}
29+
1030
[Fact]
1131
public async Task CIntObjectToIntegerAsync()
1232
{

0 commit comments

Comments
 (0)