Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Handle saved_envs on lambdas in Tast_visitor
Summary: Previously, we only restored the typing environment from a function's saved_env for toplevel function definitions. This meant that we ignored the saved_env for lambda expressions. In order to make use of it, this change adds an on_fun_ override to all Tast_visitor classes, which properly sets up the typing environment for lambda expressions. Reviewed By: pittsw Differential Revision: D6973297 fbshipit-source-id: 82e58758fe437ef8dd025f183b21be3b01699e5d
- Loading branch information
Showing
with
187 additions
and 27 deletions.
@@ -0,0 +1,12 @@ | ||
<?hh // strict | ||
|
||
async function genString(string $s): Awaitable<string> { return $s; } | ||
|
||
function test(): void { | ||
$f0 = async () ==> { | ||
$str = await genString('foo'); | ||
}; | ||
$f1 = async $x ==> { | ||
$str = await genString($x); | ||
}; | ||
} |
@@ -0,0 +1,127 @@ | ||
[(AnnotatedAST.Fun | ||
{ AnnotatedAST.f_annotation = (); f_mode = <opaque>; | ||
f_ret = | ||
(Some ([3:38-3:47], | ||
(Happly (([3:38-3:47], "\\Awaitable"), | ||
[([3:48-3:54], (Hprim Tstring))])))); | ||
f_name = ([3:16-3:25], "\\genString"); f_tparams = []; | ||
f_where_constraints = []; f_variadic = AnnotatedAST.FVnonVariadic; | ||
f_params = | ||
[{ AnnotatedAST.param_hint = (Some ([3:26-3:32], (Hprim Tstring))); | ||
param_is_reference = false; param_is_variadic = false; | ||
param_pos = [3:33-3:35]; param_name = "$s"; param_expr = None; | ||
param_callconv = None; param_user_attributes = [] } | ||
]; | ||
f_body = | ||
(AnnotatedAST.NamedBody | ||
{ AnnotatedAST.fnb_nast = | ||
[(AnnotatedAST.Return ([3:58-3:68], | ||
(Some (([3:65-3:67], Some string), | ||
(AnnotatedAST.Lvar ([3:65-3:67], $s)))) | ||
)) | ||
]; | ||
fnb_unsafe = false }); | ||
f_fun_kind = FAsync; f_user_attributes = []; f_ret_by_ref = false }); | ||
(AnnotatedAST.Fun | ||
{ AnnotatedAST.f_annotation = (); f_mode = <opaque>; | ||
f_ret = (Some ([5:18-5:22], (Hprim Tvoid))); | ||
f_name = ([5:10-5:14], "\\test"); f_tparams = []; | ||
f_where_constraints = []; f_variadic = AnnotatedAST.FVnonVariadic; | ||
f_params = []; | ||
f_body = | ||
(AnnotatedAST.NamedBody | ||
{ AnnotatedAST.fnb_nast = | ||
[(AnnotatedAST.Expr | ||
(([6:3-6:14], Some (function(): \Awaitable<void>)), | ||
(AnnotatedAST.Binop ((Eq None), | ||
(([6:3-6:6], Some (function(): \Awaitable<void>)), | ||
(AnnotatedAST.Lvar ([6:3-6:6], $f0))), | ||
(([6:9-6:14], Some \Awaitable<void>), | ||
(AnnotatedAST.Efun ( | ||
{ AnnotatedAST.f_annotation = (); f_mode = <opaque>; | ||
f_ret = None; f_name = ([Pos.none], ";anonymous"); | ||
f_tparams = []; f_where_constraints = []; | ||
f_variadic = AnnotatedAST.FVnonVariadic; | ||
f_params = []; | ||
f_body = | ||
(AnnotatedAST.NamedBody | ||
{ AnnotatedAST.fnb_nast = | ||
[(AnnotatedAST.Expr | ||
(([7:5-7:34], Some string), | ||
(AnnotatedAST.Binop ((Eq None), | ||
(([7:5-7:9], Some string), | ||
(AnnotatedAST.Lvar ([7:5-7:9], $str))), | ||
(([7:12-7:34], Some string), | ||
(AnnotatedAST.Await | ||
(([7:18-7:34], Some \Awaitable<string>), | ||
(AnnotatedAST.Call (Cnormal, | ||
(([7:18-7:27], Some (function(string $s): \Awaitable<string>)), | ||
(AnnotatedAST.Id | ||
([7:18-7:27], | ||
"\\genString"))), | ||
[], | ||
[(([7:28-7:33], Some string), | ||
(AnnotatedAST.String | ||
([7:28-7:33], "foo"))) | ||
], | ||
[]))))) | ||
)))) | ||
]; | ||
fnb_unsafe = false }); | ||
f_fun_kind = FAsync; f_user_attributes = []; | ||
f_ret_by_ref = false }, | ||
[]))) | ||
)))); | ||
(AnnotatedAST.Expr | ||
(([9:3-9:14], Some [fun]), | ||
(AnnotatedAST.Binop ((Eq None), | ||
(([9:3-9:6], Some [fun]), | ||
(AnnotatedAST.Lvar ([9:3-9:6], $f1))), | ||
(([9:9-9:14], Some _), | ||
(AnnotatedAST.Efun ( | ||
{ AnnotatedAST.f_annotation = (); f_mode = <opaque>; | ||
f_ret = None; f_name = ([Pos.none], ";anonymous"); | ||
f_tparams = []; f_where_constraints = []; | ||
f_variadic = AnnotatedAST.FVnonVariadic; | ||
f_params = | ||
[{ AnnotatedAST.param_hint = None; | ||
param_is_reference = false; | ||
param_is_variadic = false; | ||
param_pos = [9:15-9:17]; param_name = "$x"; | ||
param_expr = None; param_callconv = None; | ||
param_user_attributes = [] } | ||
]; | ||
f_body = | ||
(AnnotatedAST.NamedBody | ||
{ AnnotatedAST.fnb_nast = | ||
[(AnnotatedAST.Expr | ||
(([10:5-10:31], Some string), | ||
(AnnotatedAST.Binop ((Eq None), | ||
(([10:5-10:9], Some string), | ||
(AnnotatedAST.Lvar | ||
([10:5-10:9], $str))), | ||
(([10:12-10:31], Some string), | ||
(AnnotatedAST.Await | ||
(([10:18-10:31], Some \Awaitable<string>), | ||
(AnnotatedAST.Call (Cnormal, | ||
(([10:18-10:27], Some (function(string $s): \Awaitable<string>)), | ||
(AnnotatedAST.Id | ||
([10:18-10:27], | ||
"\\genString"))), | ||
[], | ||
[(([10:28-10:30], Some _), | ||
(AnnotatedAST.Lvar | ||
([10:28-10:30], $x))) | ||
], | ||
[]))))) | ||
)))) | ||
]; | ||
fnb_unsafe = false }); | ||
f_fun_kind = FAsync; f_user_attributes = []; | ||
f_ret_by_ref = false }, | ||
[]))) | ||
)))) | ||
]; | ||
fnb_unsafe = false }); | ||
f_fun_kind = FSync; f_user_attributes = []; f_ret_by_ref = false }) | ||
] |