From 1227ead58ba538f8ef1e7dfa790cb5710cef4ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 23 Apr 2017 17:49:28 +0200 Subject: [PATCH] bug fix #297 --- TestSuite/lambdas2.pas | 13 ++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 24 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 TestSuite/lambdas2.pas diff --git a/TestSuite/lambdas2.pas b/TestSuite/lambdas2.pas new file mode 100644 index 000000000..7dadefcc9 --- /dev/null +++ b/TestSuite/lambdas2.pas @@ -0,0 +1,13 @@ +var a := ArrGen(10,x->x); +var a2 := ArrGen(10,x->x*x); +var i: integer := 5; +var a3 := ArrGen(10,x->x+i); +var a4 := ArrGen(10,x->x); + a5 := ArrGen(10,x->a[x]+1); +begin + assert(a[9]=9); + assert(a2[9]=81); + assert(a3[9]=14); + assert(a4[9]=9); + assert(a5[9]=10); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 346dde817..663bd2d96 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -2500,7 +2500,8 @@ namespace PascalABCCompiler.TreeConverter public override void visit(SyntaxTree.block _block) { - if (context.converting_block() != block_type.namespace_block && _block.defs != null && _block.defs.defs != null) + List declarations_with_lambdas = new List(); + if (/*context.converting_block() != block_type.namespace_block && */_block.defs != null && _block.defs.defs != null) { foreach (var def in _block.defs.defs.Where(d => d is const_definition || d is consts_definitions_list || @@ -2509,7 +2510,26 @@ namespace PascalABCCompiler.TreeConverter var lambdaSearcher = new LambdaSearcher(def); if (lambdaSearcher.CheckIfContainsLambdas()) { - AddError(new LambdasNotAllowedInDeclarationsSection(get_location(lambdaSearcher.FoundLambda))); // SSM 6.06.15 - Хочется убрать это. В разделе описаний лямбды нужны - пусть и без замыканий. Если внутри подпрограммы - не нужны, но Вы же запретили везде! + if (context.converting_block() != block_type.namespace_block || !(def is variable_definitions)) + AddError(new LambdasNotAllowedInDeclarationsSection(get_location(lambdaSearcher.FoundLambda))); // SSM 6.06.15 - Хочется убрать это. В разделе описаний лямбды нужны - пусть и без замыканий. Если внутри подпрограммы - не нужны, но Вы же запретили везде! + else + declarations_with_lambdas.Add(def as variable_definitions); + } + } + } + int lambda_init_index = 0; + foreach (variable_definitions vd in declarations_with_lambdas) + { + foreach (var_def_statement vds in vd.list) + { + var lambdaSearcher = new LambdaSearcher(vds); + if (lambdaSearcher.CheckIfContainsLambdas()) + { + procedure_definition func = new short_func_definition(SyntaxTreeBuilder.BuildShortFuncDefinition(new formal_parameters(), new procedure_attributes_list(), new method_name("<>lambda_initializer" + lambda_init_index), null, vds.inital_value, null)); + + vds.inital_value = new method_call(new ident("<>lambda_initializer"+lambda_init_index), new expression_list()); + _block.defs.InsertBefore(vd, func); + lambda_init_index++; } } }