Browse Source

implement VB 11 Iterators

newNRvisualizers
Siegfried Pammer 14 years ago
parent
commit
fa4694e3e0
  1. 3
      ICSharpCode.NRefactory.VB/Ast/Enums.cs
  2. 44
      ICSharpCode.NRefactory.VB/Ast/Statements/YieldStatement.cs
  3. 7
      ICSharpCode.NRefactory.VB/Ast/VBModifierToken.cs
  4. 1
      ICSharpCode.NRefactory.VB/IAstVisitor.cs
  5. 1
      ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj
  6. 8
      ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
  7. 18
      ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

3
ICSharpCode.NRefactory.VB/Ast/Enums.cs

@ -48,6 +48,9 @@ namespace ICSharpCode.NRefactory.VB.Ast @@ -48,6 +48,9 @@ namespace ICSharpCode.NRefactory.VB.Ast
Narrowing = 0x2000000,
Widening = 0x4000000,
Iterator = 0x8000000,
Async = 0x10000000,
/// <summary>
/// Special value used to match any modifiers during pattern matching.
/// </summary>

44
ICSharpCode.NRefactory.VB/Ast/Statements/YieldStatement.cs

@ -0,0 +1,44 @@ @@ -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
{
/// <summary>
/// Yield Expression
/// </summary>
/// <remarks>VB 11</remarks>
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<T, S>(IAstVisitor<T, S> 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);
}
}
}

7
ICSharpCode.NRefactory.VB/Ast/VBModifierToken.cs

@ -66,6 +66,9 @@ namespace ICSharpCode.NRefactory.VB.Ast @@ -66,6 +66,9 @@ namespace ICSharpCode.NRefactory.VB.Ast
// operator modifiers
new KeyValuePair<Modifiers, int>(Modifiers.Narrowing, "Narrowing".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Widening, "Widening".Length),
// VB 11 modifiers
new KeyValuePair<Modifiers, int>(Modifiers.Async, "Async".Length),
new KeyValuePair<Modifiers, int>(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, int>(Modifiers.Any, "Any".Length)
};
@ -136,6 +139,10 @@ namespace ICSharpCode.NRefactory.VB.Ast @@ -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);
}

1
ICSharpCode.NRefactory.VB/IAstVisitor.cs

@ -86,6 +86,7 @@ namespace ICSharpCode.NRefactory.VB { @@ -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);

1
ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj

@ -102,6 +102,7 @@ @@ -102,6 +102,7 @@
<Compile Include="Ast\Statements\TryStatement.cs" />
<Compile Include="Ast\Statements\WhileStatement.cs" />
<Compile Include="Ast\Statements\WithStatement.cs" />
<Compile Include="Ast\Statements\YieldStatement.cs" />
<Compile Include="Ast\TypeMembers\Accessor.cs" />
<Compile Include="Ast\TypeMembers\ConstructorDeclaration.cs" />
<Compile Include="Ast\TypeMembers\EventDeclaration.cs" />

8
ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs

@ -2075,5 +2075,13 @@ namespace ICSharpCode.NRefactory.VB @@ -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);
}
}
}

18
ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

@ -26,6 +26,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors @@ -26,6 +26,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{
IEnvironmentProvider provider;
Stack<BlockStatement> 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 @@ -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 @@ -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 @@ -1237,6 +1246,11 @@ namespace ICSharpCode.NRefactory.VB.Visitors
});
}
if (inIterator) {
decl.Modifiers |= Modifiers.Iterator;
inIterator = false;
}
return EndNode(propertyDeclaration, decl);
}

Loading…
Cancel
Save