From 7d744570ecd8265e50acbf128e4a48e78e1c18e9 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: Fri, 10 Aug 2018 10:58:29 +0200 Subject: [PATCH] fix #871 fix #818 --- TestSuite/lambdas_events2.pas | 31 +++++++++++++++++++ TestSuite/lambdas_props.pas | 22 +++++++++++++ .../Closure/CapturedVariablesTreeBuilder.cs | 21 +++++++++++-- 3 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 TestSuite/lambdas_events2.pas create mode 100644 TestSuite/lambdas_props.pas diff --git a/TestSuite/lambdas_events2.pas b/TestSuite/lambdas_events2.pas new file mode 100644 index 000000000..446a97290 --- /dev/null +++ b/TestSuite/lambdas_events2.pas @@ -0,0 +1,31 @@ +var i: integer; + +procedure test; +begin + i := 1; +end; +type + t1 = class + + public event Elap: procedure; + + procedure p1(b:byte); + begin + + var p: procedure := ()-> + begin + b := 0; + if Elap <> nil then + Elap() + end; + p; + end; + + end; + +begin + var o := new t1; + o.Elap += test; + o.p1(2); + assert(i=1); +end. \ No newline at end of file diff --git a/TestSuite/lambdas_props.pas b/TestSuite/lambdas_props.pas new file mode 100644 index 000000000..bff554c4d --- /dev/null +++ b/TestSuite/lambdas_props.pas @@ -0,0 +1,22 @@ +type + t1 = class + + _p1 := 0; + + property P1:integer read _p1 write _p1; virtual; + + procedure pr1; + begin + var p:procedure := ()->begin + P1 := P1 + 1; + end; + p; + end; + + end; + +begin + var o := new t1; + o.pr1; + assert(o.P1 = 1); +end. \ No newline at end of file diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs index 3fdcdfd88..74bc158b1 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs @@ -174,9 +174,26 @@ namespace TreeConverter.LambdaExpressions.Closure si.sym_info.semantic_node_type == semantic_node_type.local_block_variable || si.sym_info.semantic_node_type == semantic_node_type.common_parameter || si.sym_info.semantic_node_type == semantic_node_type.class_field - ; - + //trjuk, chtoby ne perelopachivat ves kod. zamenjaem ident na self.ident + if ((si.sym_info.semantic_node_type == semantic_node_type.common_event || si.sym_info.semantic_node_type == semantic_node_type.common_property_node) && InLambdaContext) + { + dot_node dn = new dot_node(new ident("self", id.source_context), new ident(id.name, id.source_context), id.source_context); + bool ok = true; + try + { + id.Parent.ReplaceDescendantUnsafe(id, dn); + } + catch + { + ok = false; + } + if (ok) + { + ProcessNode(id.Parent); + return; + } + } if (!(acceptableVarType) && InLambdaContext) { _visitor.AddError(new ThisTypeOfVariablesCannotBeCaptured(_visitor.get_location(id)));