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)));