diff --git a/ICSharpCode.NRefactory.VB/Ast/Enums.cs b/ICSharpCode.NRefactory.VB/Ast/Enums.cs index b69ae9aa38..5ce7c29bed 100644 --- a/ICSharpCode.NRefactory.VB/Ast/Enums.cs +++ b/ICSharpCode.NRefactory.VB/Ast/Enums.cs @@ -48,6 +48,9 @@ namespace ICSharpCode.NRefactory.VB.Ast Narrowing = 0x2000000, Widening = 0x4000000, + Iterator = 0x8000000, + Async = 0x10000000, + /// /// Special value used to match any modifiers during pattern matching. /// diff --git a/ICSharpCode.NRefactory.VB/Ast/Statements/YieldStatement.cs b/ICSharpCode.NRefactory.VB/Ast/Statements/YieldStatement.cs new file mode 100644 index 0000000000..895382aa1d --- /dev/null +++ b/ICSharpCode.NRefactory.VB/Ast/Statements/YieldStatement.cs @@ -0,0 +1,44 @@ +// 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 +{ + /// + /// Yield Expression + /// + /// VB 11 + public class YieldStatement : Statement + { + public VBTokenNode YieldToken { + get { return GetChildByRole (Roles.Keyword); } + } + + public Expression Expression { + get { return GetChildByRole(Roles.Expression); } + set { SetChildByRole(Roles.Expression, value); } + } + + public YieldStatement() + { + } + + public YieldStatement(Expression expression) + { + AddChild (expression, Roles.Expression); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitYieldStatement(this, data); + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + YieldStatement o = other as YieldStatement; + return o != null && this.Expression.DoMatch(o.Expression, match); + } + } +} diff --git a/ICSharpCode.NRefactory.VB/Ast/VBModifierToken.cs b/ICSharpCode.NRefactory.VB/Ast/VBModifierToken.cs index 45b8997860..bd87cca4e7 100644 --- a/ICSharpCode.NRefactory.VB/Ast/VBModifierToken.cs +++ b/ICSharpCode.NRefactory.VB/Ast/VBModifierToken.cs @@ -66,6 +66,9 @@ namespace ICSharpCode.NRefactory.VB.Ast // operator modifiers new KeyValuePair(Modifiers.Narrowing, "Narrowing".Length), new KeyValuePair(Modifiers.Widening, "Widening".Length), + // VB 11 modifiers + new KeyValuePair(Modifiers.Async, "Async".Length), + new KeyValuePair(Modifiers.Iterator, "Iterator".Length), // even though it's used for patterns only, it needs to be in this table to be usable in the AST new KeyValuePair(Modifiers.Any, "Any".Length) }; @@ -136,6 +139,10 @@ namespace ICSharpCode.NRefactory.VB.Ast return "Widening"; case Modifiers.Narrowing: return "Narrowing"; + case Modifiers.Async: + return "Async"; + case Modifiers.Iterator: + return "Iterator"; default: throw new NotSupportedException("Invalid value for Modifiers: " + modifier); } diff --git a/ICSharpCode.NRefactory.VB/IAstVisitor.cs b/ICSharpCode.NRefactory.VB/IAstVisitor.cs index c9bad327ce..c2753f2358 100644 --- a/ICSharpCode.NRefactory.VB/IAstVisitor.cs +++ b/ICSharpCode.NRefactory.VB/IAstVisitor.cs @@ -86,6 +86,7 @@ namespace ICSharpCode.NRefactory.VB { S VisitForEachStatement(ForEachStatement forEachStatement, T data); S VisitExitStatement(ExitStatement exitStatement, T data); S VisitSelectStatement(SelectStatement selectStatement, T data); + S VisitYieldStatement(YieldStatement yieldStatement, 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 8955b43d14..a961a368d7 100644 --- a/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj +++ b/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj @@ -102,6 +102,7 @@ + diff --git a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs index 71d60b3c7a..aedffea21a 100644 --- a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs +++ b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs @@ -2075,5 +2075,13 @@ namespace ICSharpCode.NRefactory.VB { throw new NotImplementedException(); } + + public object VisitYieldStatement(YieldStatement yieldStatement, object data) + { + StartNode(yieldStatement); + WriteKeyword("Yield"); + yieldStatement.Expression.AcceptVisitor(this, data); + return EndNode(yieldStatement); + } } } diff --git a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs index b5d81087ae..617f258e7f 100644 --- a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs +++ b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs @@ -26,6 +26,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors { IEnvironmentProvider provider; Stack blocks; + // TODO this should belong to the current type member or lambda + bool inIterator; public CSharpToVBConverterVisitor(IEnvironmentProvider provider) { @@ -929,12 +931,14 @@ namespace ICSharpCode.NRefactory.VB.Visitors public AstNode VisitYieldBreakStatement(CSharp.YieldBreakStatement yieldBreakStatement, object data) { - throw new NotImplementedException(); + inIterator = true; + return EndNode(yieldBreakStatement, new ReturnStatement()); } public AstNode VisitYieldStatement(CSharp.YieldStatement yieldStatement, object data) { - throw new NotImplementedException(); + inIterator = true; + return EndNode(yieldStatement, new YieldStatement((Expression)yieldStatement.Expression.AcceptVisitor(this, data))); } public AstNode VisitAccessor(CSharp.Accessor accessor, object data) @@ -1078,6 +1082,11 @@ namespace ICSharpCode.NRefactory.VB.Visitors result.ReturnType = (AstType)methodDeclaration.ReturnType.AcceptVisitor(this, data); result.Body = (BlockStatement)methodDeclaration.Body.AcceptVisitor(this, data); + if (inIterator) { + result.Modifiers |= Modifiers.Iterator; + inIterator = false; + } + return EndNode(methodDeclaration, result); } @@ -1237,6 +1246,11 @@ namespace ICSharpCode.NRefactory.VB.Visitors }); } + if (inIterator) { + decl.Modifiers |= Modifiers.Iterator; + inIterator = false; + } + return EndNode(propertyDeclaration, decl); }