From 8cb9d38d400272ad6d444c89ff5597fbd52e0c0b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 16 May 2011 12:25:50 +0200 Subject: [PATCH] add ArrayInitializerExpression and ObjectCreationExpression --- .../Expressions/ArrayInitializerExpression.cs | 53 +++++++++++++++++++ .../Expressions/ObjectCreationExpression.cs | 47 ++++++++++++++-- ICSharpCode.NRefactory.VB/IAstVisitor.cs | 2 + .../ICSharpCode.NRefactory.VB.csproj | 1 + .../OutputVisitor/OutputVisitor.cs | 27 +++++++++- .../Visitors/CSharpToVBConverterVisitor.cs | 7 ++- 6 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 ICSharpCode.NRefactory.VB/Ast/Expressions/ArrayInitializerExpression.cs 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)