parent
012409f1e4
commit
7d744570ec
31
TestSuite/lambdas_events2.pas
Normal file
31
TestSuite/lambdas_events2.pas
Normal file
|
|
@ -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.
|
||||||
22
TestSuite/lambdas_props.pas
Normal file
22
TestSuite/lambdas_props.pas
Normal file
|
|
@ -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.
|
||||||
|
|
@ -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.local_block_variable ||
|
||||||
si.sym_info.semantic_node_type == semantic_node_type.common_parameter ||
|
si.sym_info.semantic_node_type == semantic_node_type.common_parameter ||
|
||||||
si.sym_info.semantic_node_type == semantic_node_type.class_field
|
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)
|
if (!(acceptableVarType) && InLambdaContext)
|
||||||
{
|
{
|
||||||
_visitor.AddError(new ThisTypeOfVariablesCannotBeCaptured(_visitor.get_location(id)));
|
_visitor.AddError(new ThisTypeOfVariablesCannotBeCaptured(_visitor.get_location(id)));
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue