// 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 обобщенного класса, в котором находится метод, содержащий лямбду 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().Count() > 0) // из-за #1984 убрал вообще условие. Пусть будет всегда { var id = GenIdentName(); id.Parent = fe; var ass = new var_statement(id, fe.in_what, fe.in_what.source_context); id.source_context = fe.in_what.source_context; fe.in_what = id; var l = new List { ass, fe }; //ReplaceStatement(fe, l); ReplaceStatementUsingParent(fe, l); } base.visit(fe); } 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; } } }