diff --git a/ICSharpCode.NRefactory.VB/Ast/Expressions/ArrayInitializerExpression.cs b/ICSharpCode.NRefactory.VB/Ast/Expressions/ArrayInitializerExpression.cs
new file mode 100644
index 0000000000..772602de9d
--- /dev/null
+++ b/ICSharpCode.NRefactory.VB/Ast/Expressions/ArrayInitializerExpression.cs
@@ -0,0 +1,53 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+
+namespace ICSharpCode.NRefactory.VB.Ast
+{
+ ///
+ /// { Elements }
+ ///
+ public class ArrayInitializerExpression : Expression
+ {
+ #region Null
+ public new static readonly ArrayInitializerExpression Null = new NullArrayInitializerExpression ();
+
+ sealed class NullArrayInitializerExpression : ArrayInitializerExpression
+ {
+ public override bool IsNull {
+ get {
+ return true;
+ }
+ }
+
+ public override S AcceptVisitor (IAstVisitor visitor, T data)
+ {
+ return default (S);
+ }
+
+ protected internal override bool DoMatch(AstNode other, PatternMatching.Match match)
+ {
+ return other == null || other.IsNull;
+ }
+ }
+ #endregion
+
+ public readonly static Role InitializerRole = new Role("Initializer", ArrayInitializerExpression.Null);
+
+ public AstNodeCollection Elements {
+ get { return GetChildrenByRole(Roles.Expression); }
+ }
+
+ public override S AcceptVisitor (IAstVisitor visitor, T data)
+ {
+ return visitor.VisitArrayInitializerExpression (this, data);
+ }
+
+ protected internal override bool DoMatch(AstNode other, PatternMatching.Match match)
+ {
+ ArrayInitializerExpression o = other as ArrayInitializerExpression;
+ return o != null && this.Elements.DoMatch(o.Elements, match);
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory.VB/Ast/Expressions/ObjectCreationExpression.cs b/ICSharpCode.NRefactory.VB/Ast/Expressions/ObjectCreationExpression.cs
index f940c71b06..093efb737d 100644
--- a/ICSharpCode.NRefactory.VB/Ast/Expressions/ObjectCreationExpression.cs
+++ b/ICSharpCode.NRefactory.VB/Ast/Expressions/ObjectCreationExpression.cs
@@ -2,19 +2,58 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.Collections.Generic;
namespace ICSharpCode.NRefactory.VB.Ast
{
+ ///
+ /// New Type(Arguments) { Initializer }
+ ///
public class ObjectCreationExpression : Expression
{
- protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match)
+ public readonly static Role InitializerRole = ArrayInitializerExpression.InitializerRole;
+
+ public AstType Type {
+ get { return GetChildByRole (Roles.Type); }
+ set { SetChildByRole (Roles.Type, value); }
+ }
+
+ public AstNodeCollection Arguments {
+ get { return GetChildrenByRole (Roles.Argument); }
+ }
+
+ public ArrayInitializerExpression Initializer {
+ get { return GetChildByRole (InitializerRole); }
+ set { SetChildByRole (InitializerRole, value); }
+ }
+
+ public ObjectCreationExpression()
+ {
+ }
+
+ public ObjectCreationExpression (AstType type, IEnumerable arguments = null)
+ {
+ AddChild (type, Roles.Type);
+ if (arguments != null) {
+ foreach (var arg in arguments) {
+ AddChild (arg, Roles.Argument);
+ }
+ }
+ }
+
+ public ObjectCreationExpression (AstType type, params Expression[] arguments) : this (type, (IEnumerable)arguments)
+ {
+ }
+
+ public override S AcceptVisitor (IAstVisitor visitor, T data)
{
- throw new NotImplementedException();
+ return visitor.VisitObjectCreationExpression(this, data);
}
- public override S AcceptVisitor(IAstVisitor visitor, T data)
+ protected internal override bool DoMatch(AstNode other, PatternMatching.Match match)
{
- throw new NotImplementedException();
+ ObjectCreationExpression o = other as ObjectCreationExpression;
+ return o != null && this.Type.DoMatch(o.Type, match) && this.Arguments.DoMatch(o.Arguments, match) && this.Initializer.DoMatch(o.Initializer, match);
}
}
}
diff --git a/ICSharpCode.NRefactory.VB/IAstVisitor.cs b/ICSharpCode.NRefactory.VB/IAstVisitor.cs
index e96f9c1172..f6b5a23367 100644
--- a/ICSharpCode.NRefactory.VB/IAstVisitor.cs
+++ b/ICSharpCode.NRefactory.VB/IAstVisitor.cs
@@ -58,6 +58,8 @@ namespace ICSharpCode.NRefactory.VB {
S VisitAssignmentExpression(AssignmentExpression assignmentExpression, T data);
S VisitIdentifierExpression(IdentifierExpression identifierExpression, T data);
S VisitInvocationExpression(InvocationExpression invocationExpression, T data);
+ S VisitArrayInitializerExpression(ArrayInitializerExpression arrayInitializerExpression, T data);
+ S VisitObjectCreationExpression(ObjectCreationExpression objectCreationExpression, T data);
// Statement scope
S VisitLabelDeclarationStatement(LabelDeclarationStatement labelDeclarationStatement, T data);
diff --git a/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj b/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj
index 427cd102de..a257a082bb 100644
--- a/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj
+++ b/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj
@@ -48,6 +48,7 @@
+
diff --git a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
index 44ef830aaf..08b4c374f9 100644
--- a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
+++ b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
@@ -494,7 +494,9 @@ namespace ICSharpCode.NRefactory.VB
WriteCommaSeparatedListInParenthesis(constructorDeclaration.Parameters, false);
NewLine();
- // TODO Body
+ Indent();
+ WriteBlock(constructorDeclaration.Body);
+ Unindent();
WriteKeyword("End");
WriteKeyword("Sub");
@@ -1578,5 +1580,28 @@ namespace ICSharpCode.NRefactory.VB
WriteCommaSeparatedListInParenthesis(invocationExpression.Arguments, false);
return EndNode(invocationExpression);
}
+
+ public object VisitArrayInitializerExpression(ArrayInitializerExpression arrayInitializerExpression, object data)
+ {
+ StartNode(arrayInitializerExpression);
+ WriteToken("{", ArrayInitializerExpression.Roles.LBrace);
+ Space();
+ WriteCommaSeparatedList(arrayInitializerExpression.Elements);
+ Space();
+ WriteToken("}", ArrayInitializerExpression.Roles.RBrace);
+ return EndNode(arrayInitializerExpression);
+ }
+
+ public object VisitObjectCreationExpression(ObjectCreationExpression objectCreationExpression, object data)
+ {
+ StartNode(objectCreationExpression);
+
+ WriteKeyword("New");
+ objectCreationExpression.Type.AcceptVisitor(this, data);
+ WriteCommaSeparatedListInParenthesis(objectCreationExpression.Arguments, false);
+ objectCreationExpression.Initializer.AcceptVisitor(this, data);
+
+ return EndNode(objectCreationExpression);
+ }
}
}
diff --git a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs
index e4555bc375..054d5a470c 100644
--- a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs
+++ b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs
@@ -269,7 +269,12 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitObjectCreateExpression(CSharp.ObjectCreateExpression objectCreateExpression, object data)
{
- throw new NotImplementedException();
+ var expr = new ObjectCreationExpression((AstType)objectCreateExpression.Type.AcceptVisitor(this, data));
+ ConvertNodes(objectCreateExpression.Arguments, expr.Arguments);
+ if (!objectCreateExpression.Initializer.IsNull)
+ expr.Initializer = (ArrayInitializerExpression)objectCreateExpression.Initializer.AcceptVisitor(this, data);
+
+ return EndNode(objectCreateExpression, expr);
}
public AstNode VisitAnonymousTypeCreateExpression(CSharp.AnonymousTypeCreateExpression anonymousTypeCreateExpression, object data)