pascalabcnet/SyntaxVisitors/VisitorsForLambdas/StandOutExprWithLambdaInForeachSequenceVisitor.cs

58 lines
2.8 KiB
C#
Raw Permalink Normal View History

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System.Collections.Generic;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace PascalABCCompiler.SyntaxTreeConverters
{
// Первое предназначение - вынести последовательность из заголовка в foreach до foreach как отдельное присваивание
// Второе предназначение - переименовать все переменные, совпадающие по имени с типом T обобщенного класса, в котором находится метод, содержащий лямбду
2021-01-10 07:54:31 +03:00
public class StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor : BaseChangeVisitor
{
private readonly GeneratedNamesManager generatedNamesManager;
private StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor Create(GeneratedNamesManager generatedNamesManager)
=> new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(generatedNamesManager);
//private ident_list ClassTemplateArgsOrNull = null; // если мы - в обобщенном классе, то это - его обобщенные параметры
public ident GenIdentName()
{
return new ident(generatedNamesManager.GenerateName("$GenContFE"));
}
public override void visit(foreach_stmt fe)
{
//if (fe.DescendantNodes().OfType<function_lambda_definition>().Count() > 0) // из-за #1984 убрал вообще условие. Пусть будет всегда
{
var id = GenIdentName();
id.Parent = fe;
var ass = new var_statement(id, fe.in_what, fe.in_what.source_context);
2019-11-18 00:34:05 +03:00
id.source_context = fe.in_what.source_context;
fe.in_what = id;
var l = new List<statement> { ass, fe };
//ReplaceStatement(fe, l);
ReplaceStatementUsingParent(fe, l);
}
base.visit(fe);
}
2021-01-09 01:31:53 +03:00
private int countNestedLambdas = 0;
public override void visit(function_lambda_definition fld)
{
countNestedLambdas += 1;
if (countNestedLambdas>10)
throw new SyntaxVisitors.SyntaxVisitorError("NESTED_LAMBDAS_MAXIMUM_10", fld.source_context);
ProcessNode(fld.proc_body);
countNestedLambdas -= 1;
}
}
}