diff --git a/ICSharpCode.NRefactory.VB/Ast/Expressions/Expression.cs b/ICSharpCode.NRefactory.VB/Ast/Expressions/Expression.cs index a98a632aea..5a6dbb3d5f 100644 --- a/ICSharpCode.NRefactory.VB/Ast/Expressions/Expression.cs +++ b/ICSharpCode.NRefactory.VB/Ast/Expressions/Expression.cs @@ -352,4 +352,40 @@ namespace ICSharpCode.NRefactory.VB.Ast return o != null && this.IsKey == o.IsKey && this.Identifier.DoMatch(o.Identifier, match) && this.Expression.DoMatch(o.Expression, match); } } + + public class ConditionalExpression : Expression + { + public readonly static Role ConditionExpressionRole = new Role("ConditionExpressionRole", Expression.Null); + public readonly static Role TrueExpressionRole = new Role("TrueExpressionRole", Expression.Null); + public readonly static Role FalseExpressionRole = new Role("FalseExpressionRole", Expression.Null); + + public VBTokenNode IfToken { + get { return GetChildByRole (Roles.Keyword); } + } + + public Expression ConditionExpression { + get { return GetChildByRole (ConditionExpressionRole); } + set { SetChildByRole (ConditionExpressionRole, value); } + } + + public Expression TrueExpression { + get { return GetChildByRole (TrueExpressionRole); } + set { SetChildByRole (TrueExpressionRole, value); } + } + + public Expression FalseExpression { + get { return GetChildByRole (FalseExpressionRole); } + set { SetChildByRole (FalseExpressionRole, value); } + } + + protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match) + { + throw new NotImplementedException(); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitConditionalExpression(this, data); + } + } } diff --git a/ICSharpCode.NRefactory.VB/Ast/Statements/WhileStatement.cs b/ICSharpCode.NRefactory.VB/Ast/Statements/WhileStatement.cs new file mode 100644 index 0000000000..e5c9ec24c5 --- /dev/null +++ b/ICSharpCode.NRefactory.VB/Ast/Statements/WhileStatement.cs @@ -0,0 +1,31 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under MIT X11 license (for details please see \doc\license.txt) + +using System; +using System.IO; + +namespace ICSharpCode.NRefactory.VB.Ast +{ + public class WhileStatement : Statement + { + public Expression Condition { + get { return GetChildByRole(Roles.Expression); } + set { SetChildByRole(Roles.Expression, value); } + } + + public BlockStatement Body { + get { return GetChildByRole(Roles.Body); } + set { SetChildByRole(Roles.Body, value); } + } + + protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match) + { + throw new NotImplementedException(); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitWhileStatement(this, data); + } + } +} diff --git a/ICSharpCode.NRefactory.VB/IAstVisitor.cs b/ICSharpCode.NRefactory.VB/IAstVisitor.cs index fb54df1e79..3f8fb034c5 100644 --- a/ICSharpCode.NRefactory.VB/IAstVisitor.cs +++ b/ICSharpCode.NRefactory.VB/IAstVisitor.cs @@ -67,6 +67,7 @@ namespace ICSharpCode.NRefactory.VB { S VisitCastExpression(CastExpression castExpression, T data); S VisitFieldInitializerExpression(FieldInitializerExpression fieldInitializerExpression, T data); S VisitNamedArgumentExpression(NamedArgumentExpression namedArgumentExpression, T data); + S VisitConditionalExpression(ConditionalExpression conditionalExpression, T data); // Statement scope S VisitLabelDeclarationStatement(LabelDeclarationStatement labelDeclarationStatement, T data); @@ -79,6 +80,7 @@ namespace ICSharpCode.NRefactory.VB { S VisitThrowStatement(ThrowStatement throwStatement, T data); S VisitCatchBlock(CatchBlock catchBlock, T data); S VisitReturnStatement(ReturnStatement returnStatement, T data); + S VisitWhileStatement(WhileStatement whileStatement, T data); // TypeName S VisitPrimitiveType(PrimitiveType primitiveType, T data); diff --git a/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj b/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj index 2b06a9be7a..7f289bca8a 100644 --- a/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj +++ b/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj @@ -95,6 +95,7 @@ + diff --git a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs index 8a19ea6f98..d04c03ba0f 100644 --- a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs +++ b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs @@ -191,6 +191,7 @@ namespace ICSharpCode.NRefactory.VB public object VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, object data) { StartNode(namespaceDeclaration); + NewLine(); WriteKeyword("Namespace"); bool isFirst = true; foreach (Identifier node in namespaceDeclaration.Identifiers) { @@ -1840,5 +1841,46 @@ namespace ICSharpCode.NRefactory.VB { throw new NotImplementedException(); } + + public object VisitConditionalExpression(ConditionalExpression conditionalExpression, object data) + { + StartNode(conditionalExpression); + + WriteKeyword("If"); + WriteToken("(", ConditionalExpression.Roles.LPar); + + conditionalExpression.ConditionExpression.AcceptVisitor(this, data); + WriteToken(",", ConditionalExpression.Roles.Comma); + Space(); + + if (!conditionalExpression.TrueExpression.IsNull) { + conditionalExpression.TrueExpression.AcceptVisitor(this, data); + WriteToken(",", ConditionalExpression.Roles.Comma); + Space(); + } + + conditionalExpression.FalseExpression.AcceptVisitor(this, data); + + WriteToken(")", ConditionalExpression.Roles.RPar); + + return EndNode(conditionalExpression); + } + + public object VisitWhileStatement(WhileStatement whileStatement, object data) + { + StartNode(whileStatement); + + WriteKeyword("While"); + Space(); + whileStatement.Condition.AcceptVisitor(this, data); + NewLine(); + Indent(); + whileStatement.Body.AcceptVisitor(this, data); + Unindent(); + WriteKeyword("End"); + WriteKeyword("While"); + + return EndNode(whileStatement); + } } } diff --git a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs index 598f1e5065..97abcb4b59 100644 --- a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs +++ b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs @@ -233,7 +233,13 @@ namespace ICSharpCode.NRefactory.VB.Visitors public AstNode VisitConditionalExpression(CSharp.ConditionalExpression conditionalExpression, object data) { - throw new NotImplementedException(); + var cond = new ConditionalExpression() { + ConditionExpression = (Expression)conditionalExpression.Condition.AcceptVisitor(this, data), + TrueExpression = (Expression)conditionalExpression.TrueExpression.AcceptVisitor(this, data), + FalseExpression = (Expression)conditionalExpression.FalseExpression.AcceptVisitor(this, data) + }; + + return EndNode(conditionalExpression, cond); } public AstNode VisitDefaultValueExpression(CSharp.DefaultValueExpression defaultValueExpression, object data) @@ -847,7 +853,12 @@ namespace ICSharpCode.NRefactory.VB.Visitors public AstNode VisitWhileStatement(CSharp.WhileStatement whileStatement, object data) { - throw new NotImplementedException(); + var stmt = new WhileStatement() { + Condition = (Expression)whileStatement.Condition.AcceptVisitor(this, data), + Body = (BlockStatement)whileStatement.EmbeddedStatement.AcceptVisitor(this, data) + }; + + return EndNode(whileStatement, stmt); } public AstNode VisitYieldBreakStatement(CSharp.YieldBreakStatement yieldBreakStatement, object data)