pascalabcnet/StandardSyntaxTreeConverter/StandOutExprWithLambdaInForeachSequenceConverter.cs
miks1965 33d748adf0 Лямбды перенесены в грамматике на верхний уровень везде.
Некоторые переносы Replace между визиторами и присваивания Parent
2016-12-01 23:46:54 +03:00

39 lines
997 B
C#

using System;
using System.Collections.Generic;
using System.Linq;
using PascalABCCompiler.SyntaxTree;
public class StandOutExprWithLambdaInForeachSequenceVisitor : BaseChangeVisitor
{
public static StandOutExprWithLambdaInForeachSequenceVisitor New
{
get
{
return new StandOutExprWithLambdaInForeachSequenceVisitor();
}
}
private int GenIdNum = 0;
public ident GenIdentName()
{
GenIdNum++;
return new ident("$GenContFE" + GenIdNum.ToString());
}
public override void visit(foreach_stmt fe)
{
if (fe.in_what.DescendantNodes().OfType<function_lambda_definition>().Count()>0)
{
var id = GenIdentName();
id.Parent = fe;
var ass = new var_statement(id, fe.in_what, fe.in_what.source_context);
fe.in_what = id;
var l = new List<statement> { ass,fe };
ReplaceStatement(fe, l);
}
base.visit(fe);
}
}