Skip to content

Commit 5f8dd06

Browse files
VB -> C#: Qualify name in case of type promotion - fixes #179
1 parent 248bd10 commit 5f8dd06

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs

+19
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,9 @@ public override CSharpSyntaxNode VisitMemberAccessExpression(VBSyntax.MemberAcce
10411041
return SyntaxFactory.MemberBindingExpression(simpleNameSyntax);
10421042
}
10431043
left = SyntaxFactory.IdentifierName(_withBlockTempVariableNames.Peek());
1044+
} else if (TryGetTypePromotedModuleSymbol(node, out var promotedModuleSymbol)) {
1045+
left = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, left,
1046+
SyntaxFactory.IdentifierName(promotedModuleSymbol.Name));
10441047
}
10451048

10461049
if (node.Expression.IsKind(VBasic.SyntaxKind.GlobalName)) {
@@ -1056,6 +1059,22 @@ public override CSharpSyntaxNode VisitMemberAccessExpression(VBSyntax.MemberAcce
10561059
return memberAccessExpressionSyntax;
10571060
}
10581061

1062+
/// <remarks>https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/declared-elements/type-promotion</remarks>
1063+
private bool TryGetTypePromotedModuleSymbol(VBSyntax.MemberAccessExpressionSyntax node, out INamedTypeSymbol moduleSymbol)
1064+
{
1065+
if (_semanticModel.GetSymbolInfo(node.Expression).ExtractBestMatch() is INamespaceSymbol
1066+
expressionSymbol &&
1067+
_semanticModel.GetSymbolInfo(node.Name).ExtractBestMatch().ContainingSymbol is INamedTypeSymbol
1068+
nameContainingSymbol &&
1069+
nameContainingSymbol.ContainingSymbol.Equals(expressionSymbol)) {
1070+
moduleSymbol = nameContainingSymbol;
1071+
return true;
1072+
}
1073+
1074+
moduleSymbol = null;
1075+
return false;
1076+
}
1077+
10591078
private static bool IsSubPartOfConditionalAccess(VBSyntax.MemberAccessExpressionSyntax node)
10601079
{
10611080
var firstPossiblyConditionalAncestor = node.Parent;

Tests/CSharp/ExpressionTests.cs

+33
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,39 @@ public void TestMethod(string dir)
11691169
}
11701170
}");
11711171
}
1172+
1173+
[Fact]
1174+
public void TypePromotedModuleIsQualified()
1175+
{
1176+
TestConversionVisualBasicToCSharp(@"Namespace TestNamespace
1177+
Public Module TestModule
1178+
Public Sub ModuleFunction()
1179+
End Sub
1180+
End Module
1181+
End Namespace
1182+
1183+
Class TestClass
1184+
Public Sub TestMethod(dir As String)
1185+
TestNamespace.ModuleFunction()
1186+
End Sub
1187+
End Class", @"namespace TestNamespace
1188+
{
1189+
public static class TestModule
1190+
{
1191+
public static void ModuleFunction()
1192+
{
1193+
}
1194+
}
1195+
}
1196+
1197+
class TestClass
1198+
{
1199+
public void TestMethod(string dir)
1200+
{
1201+
TestNamespace.TestModule.ModuleFunction();
1202+
}
1203+
}");
1204+
}
11721205

11731206
[Fact]
11741207
public void NameQualifyingHandlesInheritance()

0 commit comments

Comments
 (0)