Skip to content

Commit

Permalink
VB -> C#: Qualify name in case of type promotion - fixes #179
Browse files Browse the repository at this point in the history
  • Loading branch information
GrahamTheCoder committed Nov 18, 2018
1 parent 248bd10 commit 5f8dd06
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
19 changes: 19 additions & 0 deletions ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,9 @@ public override CSharpSyntaxNode VisitMemberAccessExpression(VBSyntax.MemberAcce
return SyntaxFactory.MemberBindingExpression(simpleNameSyntax);
}
left = SyntaxFactory.IdentifierName(_withBlockTempVariableNames.Peek());
} else if (TryGetTypePromotedModuleSymbol(node, out var promotedModuleSymbol)) {
left = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, left,
SyntaxFactory.IdentifierName(promotedModuleSymbol.Name));
}

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

/// <remarks>https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/declared-elements/type-promotion</remarks>
private bool TryGetTypePromotedModuleSymbol(VBSyntax.MemberAccessExpressionSyntax node, out INamedTypeSymbol moduleSymbol)
{
if (_semanticModel.GetSymbolInfo(node.Expression).ExtractBestMatch() is INamespaceSymbol
expressionSymbol &&
_semanticModel.GetSymbolInfo(node.Name).ExtractBestMatch().ContainingSymbol is INamedTypeSymbol
nameContainingSymbol &&
nameContainingSymbol.ContainingSymbol.Equals(expressionSymbol)) {
moduleSymbol = nameContainingSymbol;
return true;
}

moduleSymbol = null;
return false;
}

private static bool IsSubPartOfConditionalAccess(VBSyntax.MemberAccessExpressionSyntax node)
{
var firstPossiblyConditionalAncestor = node.Parent;
Expand Down
33 changes: 33 additions & 0 deletions Tests/CSharp/ExpressionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1169,6 +1169,39 @@ public void TestMethod(string dir)
}
}");
}

[Fact]
public void TypePromotedModuleIsQualified()
{
TestConversionVisualBasicToCSharp(@"Namespace TestNamespace
Public Module TestModule
Public Sub ModuleFunction()
End Sub
End Module
End Namespace
Class TestClass
Public Sub TestMethod(dir As String)
TestNamespace.ModuleFunction()
End Sub
End Class", @"namespace TestNamespace
{
public static class TestModule
{
public static void ModuleFunction()
{
}
}
}
class TestClass
{
public void TestMethod(string dir)
{
TestNamespace.TestModule.ModuleFunction();
}
}");
}

[Fact]
public void NameQualifyingHandlesInheritance()
Expand Down

0 comments on commit 5f8dd06

Please sign in to comment.