Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deal with missing type and array bounds attached to identifier #26

Merged
merged 1 commit into from
Feb 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,16 @@ public override CSharpSyntaxNode VisitParameter(VBSyntax.ParameterSyntax node)
{
var id = ConvertIdentifier(node.Identifier.Identifier, semanticModel);
var returnType = (TypeSyntax)node.AsClause?.Type.Accept(TriviaConvertingVisitor);
if (node?.Parent?.Parent?.IsKind(VBasic.SyntaxKind.FunctionStatement,
VBasic.SyntaxKind.SubStatement) == true) {
returnType = returnType ?? SyntaxFactory.ParseTypeName("object");
}

var rankSpecifiers = ConvertArrayRankSpecifierSyntaxes(node.Identifier.ArrayRankSpecifiers);
if (rankSpecifiers.Any()) {
returnType = SyntaxFactory.ArrayType(returnType, rankSpecifiers);
}

if (returnType != null && !SyntaxTokenExtensions.IsKind(node.Identifier.Nullable, SyntaxKind.None)) {
var arrayType = returnType as ArrayTypeSyntax;
if (arrayType == null) {
Expand Down Expand Up @@ -966,17 +976,27 @@ public override CSharpSyntaxNode VisitObjectCreationExpression(VBSyntax.ObjectCr
public override CSharpSyntaxNode VisitArrayCreationExpression(VBSyntax.ArrayCreationExpressionSyntax node)
{
IEnumerable<ExpressionSyntax> arguments;
if (node.ArrayBounds != null)
arguments = node.ArrayBounds.Arguments.Select(a => IncreaseArrayUpperBoundExpression(((VBSyntax.SimpleArgumentSyntax)a).Expression));
else
if (node.ArrayBounds != null) {
arguments = ConvertArrayBounds(node.ArrayBounds);
} else
arguments = Enumerable.Empty<ExpressionSyntax>();
var bounds = SyntaxFactory.List(node.RankSpecifiers.Select(r => (ArrayRankSpecifierSyntax)r.Accept(TriviaConvertingVisitor)));
var bounds = ConvertArrayRankSpecifierSyntaxes(node.RankSpecifiers);
return SyntaxFactory.ArrayCreationExpression(
SyntaxFactory.ArrayType((TypeSyntax)node.Type.Accept(TriviaConvertingVisitor), bounds),
(InitializerExpressionSyntax)node.Initializer?.Accept(TriviaConvertingVisitor)
);
}

private SyntaxList<ArrayRankSpecifierSyntax> ConvertArrayRankSpecifierSyntaxes(SyntaxList<VBSyntax.ArrayRankSpecifierSyntax> arrayRankSpecifierSyntaxs)
{
return SyntaxFactory.List(arrayRankSpecifierSyntaxs.Select(r => (ArrayRankSpecifierSyntax)r.Accept(TriviaConvertingVisitor)));
}

private IEnumerable<ExpressionSyntax> ConvertArrayBounds(VBSyntax.ArgumentListSyntax argumentListSyntax)
{
return argumentListSyntax.Arguments.Select(a => IncreaseArrayUpperBoundExpression(((VBSyntax.SimpleArgumentSyntax)a).Expression));
}

public override CSharpSyntaxNode VisitCollectionInitializer(VBSyntax.CollectionInitializerSyntax node)
{
if (node.Initializers.Count == 0 && node.Parent is VBSyntax.ArrayCreationExpressionSyntax)
Expand Down
47 changes: 38 additions & 9 deletions Tests/CSharp/MemberTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -390,8 +390,8 @@ class TestClass
[Fact]
public void PartialFriendClassWithOverloads()
{
TestConversionVisualBasicToCSharp(@"
Partial Friend MustInherit Class TestClass1
TestConversionVisualBasicToCSharp(
@"Partial Friend MustInherit Class TestClass1
Public Shared Sub CreateStatic()
End Sub

Expand All @@ -417,13 +417,8 @@ End Sub

Public Overrides Sub CreateVirtualInstance()
End Sub
End Class", @"
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualBasic;

internal abstract partial class TestClass1
End Class",
@"internal abstract partial class TestClass1
{
public static void CreateStatic()
{
Expand Down Expand Up @@ -532,6 +527,40 @@ private void SomeBools(params bool[] @bool)
}");
}

[Fact]
public void MethodWithNameArrayParameter()
{
TestConversionVisualBasicToCSharp(
@"Class TestClass
Public Sub DoNothing(ByVal strs() As String)
Dim moreStrs() As String
End Sub
End Class",
@"class TestClass
{
public void DoNothing(string[] strs)
{
string[] moreStrs;
}
}");
}

[Fact]
public void UntypedParameters()
{
TestConversionVisualBasicToCSharp(
@"Class TestClass
Public Sub DoNothing(obj, objs())
End Sub
End Class",
@"class TestClass
{
public void DoNothing(object obj, object[] objs)
{
}
}");
}

[Fact]
public void NestedClass()
{
Expand Down
8 changes: 8 additions & 0 deletions Tests/ConverterTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ public void TestConversionVisualBasicToCSharp(string visualBasicCode, string exp
$@"{{
{indentedStatements}
}}";
} else if (!expectedCsharpCode.StartsWith("using System")) {
expectedCsharpCode =
@"using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualBasic;

" + expectedCsharpCode;
}
TestConversionVisualBasicToCSharpWithoutComments(visualBasicCode, expectedCsharpCode);
if (testCommentsByDefault) TestConversionVisualBasicToCSharpWithoutComments(AddLineNumberComments(visualBasicCode, "' ", false), AddLineNumberComments(expectedCsharpCode, "// ", true));
Expand Down