diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 69dc061d0536dddf9a403f916030fed952a15b37..256d98967ce3dee453dc6013822f3ffe059c2216 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -3421,6 +3421,24 @@ private ExpressionSyntax ParenthesizeLeft(ExpressionSyntax expression) } } + private SeparatedSyntaxList AsExpressionList(IEnumerable expressions) + { + return SyntaxFactory.SeparatedList(expressions.OfType()); + } + + public override SyntaxNode ArrayCreationExpression(SyntaxNode elementType, SyntaxNode size) + { + var arrayType = SyntaxFactory.ArrayType((TypeSyntax)elementType, SyntaxFactory.SingletonList(SyntaxFactory.ArrayRankSpecifier(SyntaxFactory.SingletonSeparatedList((ExpressionSyntax)size)))); + return SyntaxFactory.ArrayCreationExpression(arrayType); + } + + public override SyntaxNode ArrayCreationExpression(SyntaxNode elementType, IEnumerable elements) + { + var arrayType = SyntaxFactory.ArrayType((TypeSyntax)elementType, SyntaxFactory.SingletonList(SyntaxFactory.ArrayRankSpecifier())); + var initializer = SyntaxFactory.InitializerExpression(SyntaxKind.ArrayInitializerExpression, AsExpressionList(elements)); + return SyntaxFactory.ArrayCreationExpression(arrayType, initializer); + } + public override SyntaxNode ObjectCreationExpression(SyntaxNode type, IEnumerable arguments) { return SyntaxFactory.ObjectCreationExpression((TypeSyntax)type, CreateArgumentList(arguments), null); diff --git a/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs b/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs index d7ff961a3f59f375aad4be1cc1a9dfd6eb600af4..1e90f94c6c9cb537d3eaea4d9812d675de7cdb8d 100644 --- a/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs +++ b/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs @@ -313,6 +313,18 @@ public void TestMemberAccessExpressions() VerifySyntax(_g.MemberAccessExpression(_g.NegateExpression(_g.IdentifierName("x")), _g.IdentifierName("y")), "(-(x)).y"); } + [Fact] + public void TestArrayCreationExpressions() + { + VerifySyntax( + _g.ArrayCreationExpression(_g.IdentifierName("x"), _g.LiteralExpression(10)), + "new x[10]"); + + VerifySyntax( + _g.ArrayCreationExpression(_g.IdentifierName("x"), new SyntaxNode[] { _g.IdentifierName("y"), _g.IdentifierName("z") }), + "new x[]{y, z}"); + } + [Fact] public void TestObjectCreationExpressions() { diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs index bf02622dbed1d74d47b17e488268ee7aa17dd3e7..457aa861692ad9d9056ba12882620a581f538705 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs @@ -1625,6 +1625,16 @@ public SyntaxNode MemberAccessExpression(SyntaxNode expression, string memberNam return MemberAccessExpression(expression, IdentifierName(memberName)); } + /// + /// Creates an array creation expression for a single dimensional array of specified size. + /// + public abstract SyntaxNode ArrayCreationExpression(SyntaxNode elementType, SyntaxNode size); + + /// + /// Creates an array creation expression for a single dimensional array with specified initial element values. + /// + public abstract SyntaxNode ArrayCreationExpression(SyntaxNode elementType, IEnumerable elements); + /// /// Creates an object creation expression. /// diff --git a/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt b/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt index 19db042341030c473b3185ecbab760fee7454891..d809b5bceef9904bc26e9dbda60b8442a30f3ad1 100644 --- a/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt +++ b/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt @@ -1,6 +1,8 @@ Microsoft.CodeAnalysis.Editing.SyntaxEditor.RemoveNode(Microsoft.CodeAnalysis.SyntaxNode node, Microsoft.CodeAnalysis.SyntaxRemoveOptions options) -> void Microsoft.CodeAnalysis.Project.IsSubmission.get -> bool Microsoft.CodeAnalysis.Workspace.UpdateReferencesAfterAdd() -> void +abstract Microsoft.CodeAnalysis.Editing.SyntaxGenerator.ArrayCreationExpression(Microsoft.CodeAnalysis.SyntaxNode elementType, Microsoft.CodeAnalysis.SyntaxNode size) -> Microsoft.CodeAnalysis.SyntaxNode +abstract Microsoft.CodeAnalysis.Editing.SyntaxGenerator.ArrayCreationExpression(Microsoft.CodeAnalysis.SyntaxNode elementType, System.Collections.Generic.IEnumerable elements) -> Microsoft.CodeAnalysis.SyntaxNode static Microsoft.CodeAnalysis.CodeActions.CodeAction.Create(string title, System.Collections.Generic.IEnumerable nestedActions, string equivalenceKey = null) -> Microsoft.CodeAnalysis.CodeActions.CodeAction static Microsoft.CodeAnalysis.Editing.SyntaxGenerator.GetGenerator(Microsoft.CodeAnalysis.Project project) -> Microsoft.CodeAnalysis.Editing.SyntaxGenerator virtual Microsoft.CodeAnalysis.Editing.SyntaxGenerator.RemoveNode(Microsoft.CodeAnalysis.SyntaxNode root, Microsoft.CodeAnalysis.SyntaxNode node, Microsoft.CodeAnalysis.SyntaxRemoveOptions options) -> Microsoft.CodeAnalysis.SyntaxNode \ No newline at end of file diff --git a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb index f0a23e3f8272295665b6814dcd099f737236920e..2bf9ed13de188048f81f74a4624ef7b713a9e374 100644 --- a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb +++ b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb @@ -224,6 +224,22 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Return SyntaxFactory.UnaryMinusExpression(Parenthesize(expression)) End Function + Private Function AsExpressionList(expressions As IEnumerable(Of SyntaxNode)) As SeparatedSyntaxList(Of ExpressionSyntax) + Return SyntaxFactory.SeparatedList(Of ExpressionSyntax)(expressions.OfType(Of ExpressionSyntax)()) + End Function + + Public Overrides Function ArrayCreationExpression(elementType As SyntaxNode, size As SyntaxNode) As SyntaxNode + Dim sizes = SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(AsArgument(size))) + Dim initializer = SyntaxFactory.CollectionInitializer() + Return SyntaxFactory.ArrayCreationExpression(Nothing, DirectCast(elementType, TypeSyntax), sizes, initializer) + End Function + + Public Overrides Function ArrayCreationExpression(elementType As SyntaxNode, elements As IEnumerable(Of SyntaxNode)) As SyntaxNode + Dim sizes = SyntaxFactory.ArgumentList() + Dim initializer = SyntaxFactory.CollectionInitializer(AsExpressionList(elements)) + Return SyntaxFactory.ArrayCreationExpression(Nothing, DirectCast(elementType, TypeSyntax), sizes, initializer) + End Function + Public Overloads Overrides Function ObjectCreationExpression(typeName As SyntaxNode, arguments As IEnumerable(Of SyntaxNode)) As SyntaxNode Return SyntaxFactory.ObjectCreationExpression( Nothing, diff --git a/src/Workspaces/VisualBasicTest/CodeGeneration/SyntaxGeneratorTests.vb b/src/Workspaces/VisualBasicTest/CodeGeneration/SyntaxGeneratorTests.vb index 1df698bb5c26fa162ec88cf9494b09f7af61f4b9..600690b479f70f1d783b95579ad2f8aa2a31243e 100644 --- a/src/Workspaces/VisualBasicTest/CodeGeneration/SyntaxGeneratorTests.vb +++ b/src/Workspaces/VisualBasicTest/CodeGeneration/SyntaxGeneratorTests.vb @@ -327,6 +327,17 @@ End Class VerifySyntax(Of MemberAccessExpressionSyntax)(_g.MemberAccessExpression(_g.NegateExpression(_g.IdentifierName("x")), _g.IdentifierName("y")), "(-(x)).y") End Sub + + Public Sub TestArrayCreationExpressions() + VerifySyntax(Of ArrayCreationExpressionSyntax)( + _g.ArrayCreationExpression(_g.IdentifierName("x"), _g.LiteralExpression(10)), + "New x(10) {}") + + VerifySyntax(Of ArrayCreationExpressionSyntax)( + _g.ArrayCreationExpression(_g.IdentifierName("x"), {_g.IdentifierName("y"), _g.IdentifierName("z")}), + "New x() {y, z}") + End Sub + Public Sub TestObjectCreationExpressions() VerifySyntax(Of ObjectCreationExpressionSyntax)(