From d25e6fe2282fd0828fe950d3a14616fc058b4ad4 Mon Sep 17 00:00:00 2001 From: GrahamTheCoder Date: Sun, 11 Feb 2018 16:46:27 +0000 Subject: [PATCH] Deal with missing type and array bounds attached to identifier --- .../CSharp/NodesVisitor.cs | 28 +++++++++-- Tests/CSharp/MemberTests.cs | 47 +++++++++++++++---- Tests/ConverterTestBase.cs | 8 ++++ 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs b/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs index e43152a04..33d94b65d 100644 --- a/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs +++ b/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs @@ -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) { @@ -966,17 +976,27 @@ public override CSharpSyntaxNode VisitObjectCreationExpression(VBSyntax.ObjectCr public override CSharpSyntaxNode VisitArrayCreationExpression(VBSyntax.ArrayCreationExpressionSyntax node) { IEnumerable 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(); - 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 ConvertArrayRankSpecifierSyntaxes(SyntaxList arrayRankSpecifierSyntaxs) + { + return SyntaxFactory.List(arrayRankSpecifierSyntaxs.Select(r => (ArrayRankSpecifierSyntax)r.Accept(TriviaConvertingVisitor))); + } + + private IEnumerable 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) diff --git a/Tests/CSharp/MemberTests.cs b/Tests/CSharp/MemberTests.cs index 560070f9d..fc8ebb445 100644 --- a/Tests/CSharp/MemberTests.cs +++ b/Tests/CSharp/MemberTests.cs @@ -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 @@ -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() { @@ -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() { diff --git a/Tests/ConverterTestBase.cs b/Tests/ConverterTestBase.cs index 469de246c..1ad301c99 100644 --- a/Tests/ConverterTestBase.cs +++ b/Tests/ConverterTestBase.cs @@ -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));