Skip to content

Commit

Permalink
Declare 2d array with bound - fixes #364
Browse files Browse the repository at this point in the history
  • Loading branch information
GrahamTheCoder committed Nov 10, 2019
1 parent 7fbe726 commit e5c8778
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ All notable changes to the code converter will be documented here.
* Convert implicit object->string cast correctly (#365)
* Convert trivia (e.g. comments) at start of file (#333)
* Improvements to redim conversion (#403, #393)
* Convert array of arrays initializer (#364)

### C# -> VB
* Convert property accessors with visiblity modifiers (#92)
Expand Down
14 changes: 11 additions & 3 deletions ICSharpCode.CodeConverter/CSharp/CommonConversions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ private async Task<CSharpSyntaxNode> GetInitializerFromNameAndType(ITypeSymbol t
if (rankSpecifiers.Count > 0)
{
var rankSpecifiersWithSizes = await ConvertArrayRankSpecifierSyntaxes(name.ArrayRankSpecifiers, name.ArrayBounds);
if (!rankSpecifiersWithSizes.SelectMany(ars => ars.Sizes).OfType<OmittedArraySizeExpressionSyntax>().Any())
if (rankSpecifiersWithSizes.SelectMany(ars => ars.Sizes).OfType<OmittedArraySizeExpressionSyntax>().Count() != rankSpecifiersWithSizes.Count)
{
var arrayTypeSyntax = (ArrayTypeSyntax) GetTypeSyntax(typeSymbol);
arrayTypeSyntax = arrayTypeSyntax.WithRankSpecifiers(rankSpecifiersWithSizes);
Expand Down Expand Up @@ -520,13 +520,21 @@ public async Task<IEnumerable<ExpressionSyntax>> ConvertArrayBounds(ArgumentList

private async Task<ExpressionSyntax> IncreaseArrayUpperBoundExpression(VBSyntax.ExpressionSyntax expr)
{
var constant = _semanticModel.GetConstantValue(expr);
var op = _semanticModel.GetOperation(expr);
var constant = op.ConstantValue;
if (constant.HasValue && constant.Value is int)
return SyntaxFactory.LiteralExpression(CSSyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal((int)constant.Value + 1));

var convertedExpression = (ExpressionSyntax)await expr.AcceptAsync(TriviaConvertingExpressionVisitor);

if (op is IBinaryOperation bOp && bOp.OperatorKind == BinaryOperatorKind.Subtract &&
bOp.RightOperand.ConstantValue.HasValue && bOp.RightOperand.ConstantValue.Value is int subtractedVal && subtractedVal == 1
&& convertedExpression is CSSyntax.BinaryExpressionSyntax bExp && bExp.IsKind(CSSyntaxKind.SubtractExpression))
return bExp.Left;

return SyntaxFactory.BinaryExpression(
CSSyntaxKind.SubtractExpression,
(ExpressionSyntax) await expr.AcceptAsync(TriviaConvertingExpressionVisitor), SyntaxFactory.Token(CSSyntaxKind.PlusToken), SyntaxFactory.LiteralExpression(CSSyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1)));
convertedExpression, SyntaxFactory.Token(CSSyntaxKind.PlusToken), SyntaxFactory.LiteralExpression(CSSyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1)));
}

public static AttributeArgumentListSyntax CreateAttributeArgumentList(params AttributeArgumentSyntax[] attributeArgumentSyntaxs)
Expand Down
20 changes: 20 additions & 0 deletions Tests/CSharp/StatementTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,26 @@ private void TestMethod()
}");
}

[Fact]
public async Task InitializeArrayOfArrays()
{
await TestConversionVisualBasicToCSharp(@"Module Module1
Sub Main()
Dim ls As New ArrayList(5)
Dim s(ls.Count - 1)() As String
End Sub
End Module", @"using System.Collections;
internal static partial class Module1
{
public static void Main()
{
var ls = new ArrayList(5);
var s = new string[ls.Count][];
}
}");
}

[Fact]
public async Task ArrayEraseAndRedimStatement()
{
Expand Down

0 comments on commit e5c8778

Please sign in to comment.