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);
}