Skip to content

Commit

Permalink
typechecker: unify function terminality code for noreturn
Browse files Browse the repository at this point in the history
Summary: We currently need to know for whether a function is terminal
 both on `Nast` (during typing) and on the `Ast` (when getting the
 list of locals to determine which ones are "pending"). Ensure that
 the relevant code is shared.

Reviewed By: @int3

Differential Revision: D2095062
  • Loading branch information
Eugene Letuchy authored and hhvm-bot committed May 23, 2015
1 parent ce88816 commit 26fd06e
Show file tree
Hide file tree
Showing 20 changed files with 361 additions and 248 deletions.
121 changes: 63 additions & 58 deletions hphp/hack/src/js/Makefile
Expand Up @@ -28,6 +28,7 @@ SRC = \
typing_reason.ml\
nast.ml\
typing_defs.ml\
typing_heap.ml\
typing_env.ml\
naming_heap.ml\
naming_ast_helpers.ml\
Expand Down Expand Up @@ -94,178 +95,181 @@ deploy: hh_ide.js

#TODO: a bid sad to do that, can probably just reuse the lib.cma
lexer_hack.ml: $(TOP)/parsing/lexer_hack.ml
cp $(TOP)/parsing/lexer_hack.ml .
cp $< .

format_hack.ml: $(TOP)/parsing/format_hack.ml
cp $(TOP)/parsing/format_hack.ml .
cp $< .

parser_hack.ml: $(TOP)/parsing/parser_hack.ml
cp $(TOP)/parsing/parser_hack.ml .
cp $< .

pos.ml: $(TOP)/utils/pos.ml
cp $(TOP)/utils/pos.ml .
cp $< .

ide.ml: $(TOP)/globals/ide.ml
cp $(TOP)/globals/ide.ml .
cp $< .

prefix.ml: $(TOP)/heap/prefix.ml
cp $(TOP)/heap/prefix.ml .
cp $< .

value.ml: $(TOP)/heap/value.ml
cp $(TOP)/heap/value.ml .
cp $< .

socket.ml: $(TOP)/socket/socket.ml
cp $(TOP)/socket/socket.ml .
cp $< .

namespace_env.ml: $(TOP)/parsing/namespace_env.ml
cp $(TOP)/parsing/namespace_env.ml .
cp $< .

ast.ml: $(TOP)/parsing/ast.ml
cp $(TOP)/parsing/ast.ml .
cp $< .

namespaces.ml: $(TOP)/parsing/namespaces.ml
cp $(TOP)/parsing/namespaces.ml .
cp $< .

parser_heap.ml: $(TOP)/parsing/parser_heap.ml
cp $(TOP)/parsing/parser_heap.ml .
cp $< .

parser.ml: $(TOP)/parsing/parser.ml
cp $(TOP)/parsing/parser.ml .
cp $< .

lexer.ml: $(TOP)/parsing/lexer.ml
cp $(TOP)/parsing/lexer.ml .
cp $< .

hackedLexer.ml: $(TOP)/parsing/hackedLexer.ml
cp $(TOP)/parsing/hackedLexer.ml .
cp $< .

tokenType.ml: $(TOP)/parsing/tokenType.ml
cp $(TOP)/parsing/tokenType.ml .
cp $< .

fileInfo.ml: $(TOP)/deps/fileInfo.ml
cp $(TOP)/deps/fileInfo.ml .
cp $< .

lexing_modes.ml: $(TOP)/parsing/lexing_modes.ml
cp $(TOP)/parsing/lexing_modes.ml .
cp $< .

typing_suggest.ml: $(TOP)/typing/typing_suggest.ml
cp $(TOP)/typing/typing_suggest.ml .
cp $< .

typing_utils.ml: $(TOP)/typing/typing_utils.ml
cp $(TOP)/typing/typing_utils.ml .
cp $< .

typeVisitor.ml: $(TOP)/typing/typeVisitor.ml
cp $(TOP)/typing/typeVisitor.ml .
cp $< .

coverage_level.ml: $(TOP)/typing/coverage_level.ml
cp $(TOP)/typing/coverage_level.ml .
cp $< .

typing_dynamic_yield.ml: $(TOP)/typing/typing_dynamic_yield.ml
cp $(TOP)/typing/typing_dynamic_yield.ml .
cp $< .

typing_enum.ml: $(TOP)/typing/typing_enum.ml
cp $(TOP)/typing/typing_enum.ml .
cp $< .

typing_print.ml: $(TOP)/typing/typing_print.ml
cp $(TOP)/typing/typing_print.ml .
cp $< .

typing_exts.ml: $(TOP)/typing/typing_exts.ml
cp $(TOP)/typing/typing_exts.ml .
cp $< .

typing_expand.ml: $(TOP)/typing/typing_expand.ml
cp $(TOP)/typing/typing_expand.ml .
cp $< .

typing_async.ml: $(TOP)/typing/typing_async.ml
cp $(TOP)/typing/typing_async.ml .
cp $< .

typing_hint.ml: $(TOP)/typing/typing_hint.ml
cp $(TOP)/typing/typing_hint.ml .
cp $< .

typing_extends.ml: $(TOP)/typing/typing_extends.ml
cp $(TOP)/typing/typing_extends.ml .
cp $< .

typing.ml: $(TOP)/typing/typing.ml
cp $(TOP)/typing/typing.ml .
cp $< .

typing_variance.ml: $(TOP)/typing/typing_variance.ml
cp $(TOP)/typing/typing_variance.ml .
cp $< .

typing_decl.ml: $(TOP)/typing/typing_decl.ml
cp $(TOP)/typing/typing_decl.ml .
cp $< .

typing_inherit.ml: $(TOP)/typing/typing_inherit.ml
cp $(TOP)/typing/typing_inherit.ml .
cp $< .

nast.ml: $(TOP)/naming/nast.ml
cp $(TOP)/naming/nast.ml .
cp $< .

nastVisitor.ml: $(TOP)/naming/nastVisitor.ml
cp $(TOP)/naming/nastVisitor.ml .
cp $< .

nastCheck.ml: $(TOP)/typing/nastCheck.ml
cp $(TOP)/typing/nastCheck.ml .
cp $< .

nast_terminality.ml: $(TOP)/typing/nast_terminality.ml
cp $^ .
cp $< .

nastInitCheck.ml: $(TOP)/typing/nastInitCheck.ml
cp $(TOP)/typing/nastInitCheck.ml .
cp $< .

autocomplete.ml: $(TOP)/globals/autocomplete.ml
cp $(TOP)/globals/autocomplete.ml .
cp $< .

find_refs.ml: $(TOP)/globals/find_refs.ml
cp $(TOP)/globals/find_refs.ml .
cp $< .

naming_ast_helpers.ml: $(TOP)/naming/naming_ast_helpers.ml
cp $^ .
cp $< .

naming_heap.ml: $(TOP)/naming/naming_heap.ml
cp $(TOP)/naming/naming_heap.ml .
cp $< .

naming.ml: $(TOP)/naming/naming.ml
cp $(TOP)/naming/naming.ml .
cp $< .

typing_reason.ml: $(TOP)/typing/typing_reason.ml
cp $(TOP)/typing/typing_reason.ml .
cp $< .

typing_defs.ml: $(TOP)/typing/typing_defs.ml
cp $(TOP)/typing/typing_defs.ml .
cp $< .

typing_heap.ml: $(TOP)/typing/typing_heap.ml
cp $< .

typing_env.ml: $(TOP)/typing/typing_env.ml
cp $(TOP)/typing/typing_env.ml .
cp $< .

typing_ops.ml: $(TOP)/typing/typing_ops.ml
cp $(TOP)/typing/typing_ops.ml .
cp $< .

fix_file.ml: $(TOP)/parsing/fix_file.ml
cp $(TOP)/parsing/fix_file.ml .
cp $< .

colorFile.ml: $(TOP)/client/colorFile.ml
cp $(TOP)/client/colorFile.ml .
cp $< .

typing_instantiate.ml: $(TOP)/typing/typing_instantiate.ml
cp $(TOP)/typing/typing_instantiate.ml .
cp $< .

typing_alias.ml: $(TOP)/typing/typing_alias.ml
cp $(TOP)/typing/typing_alias.ml .
cp $< .

typing_generic.ml: $(TOP)/typing/typing_generic.ml
cp $(TOP)/typing/typing_generic.ml .
cp $< .

typing_unify.ml: $(TOP)/typing/typing_unify.ml
cp $(TOP)/typing/typing_unify.ml .
cp $< .

typing_tdef.ml: $(TOP)/typing/typing_tdef.ml
cp $(TOP)/typing/typing_tdef.ml .
cp $< .

typing_subtype.ml: $(TOP)/typing/typing_subtype.ml
cp $(TOP)/typing/typing_subtype.ml .
cp $< .

typing_lenv.ml: $(TOP)/typing/typing_lenv.ml
cp $(TOP)/typing/typing_lenv.ml .
cp $< .

fileOutline.ml: $(TOP)/server/fileOutline.ml
cp $(TOP)/server/fileOutline.ml .
cp $< .


clean::
Expand Down Expand Up @@ -299,6 +303,7 @@ clean::
rm -f naming.ml
rm -f typing_reason.ml
rm -f typing_defs.ml
rm -f typing_heap.ml
rm -f typing_instantiate.ml
rm -f typing_utils.ml
rm -f typing_env.ml
Expand Down
44 changes: 25 additions & 19 deletions hphp/hack/src/naming/naming.ml
Expand Up @@ -73,10 +73,10 @@ type genv = {
(* Set of function names defined, and their positions *)
funs: (pi_hash * canon_names_hash) ref;

(* Set of typedef names defined, and their position *)
(* Set of typedef names defined, and their positions *)
typedefs: pi_hash ref;

(* Set of constant names defined, and their position *)
(* Set of constant names defined, and their positions *)
gconsts: pi_hash ref;

(* The current class, None if we are in a function *)
Expand Down Expand Up @@ -1656,7 +1656,8 @@ and stmt env st =

and if_stmt env st e b1 b2 =
let e = expr env e in
let vars = Naming_ast_helpers.GetLocals.stmt SMap.empty st in
let nsenv = (fst env).namespace in
let _, vars = Naming_ast_helpers.GetLocals.stmt (nsenv, SMap.empty) st in
SMap.iter (fun x p -> Env.new_pending_lvar env (p, x)) vars;
let result = Env.scope env (
fun env ->
Expand Down Expand Up @@ -1691,7 +1692,8 @@ and for_stmt env e1 e2 e3 b =

and switch_stmt env st e cl =
let e = expr env e in
let vars = Naming_ast_helpers.GetLocals.stmt SMap.empty st in
let nsenv = (fst env).namespace in
let _, vars = Naming_ast_helpers.GetLocals.stmt (nsenv, SMap.empty) st in
SMap.iter (fun x p -> Env.new_pending_lvar env (p, x)) vars;
let result = Env.scope env (
fun env ->
Expand All @@ -1718,20 +1720,22 @@ and foreach_stmt env e aw ae b =

and as_expr env aw = function
| As_v ev ->
let vars = Naming_ast_helpers.GetLocals.lvalue SMap.empty ev in
SMap.iter (fun x p -> ignore (Env.new_lvar env (p, x))) vars;
let ev = expr env ev in
(match aw with
| None -> N.As_v ev
| Some p -> N.Await_as_v (p, ev))
let nsenv = (fst env).namespace in
let _, vars = Naming_ast_helpers.GetLocals.lvalue (nsenv, SMap.empty) ev in
SMap.iter (fun x p -> ignore (Env.new_lvar env (p, x))) vars;
let ev = expr env ev in
(match aw with
| None -> N.As_v ev
| Some p -> N.Await_as_v (p, ev))
| As_kv ((p1, Lvar k), ev) ->
let k = p1, N.Lvar (Env.new_lvar env k) in
let vars = Naming_ast_helpers.GetLocals.lvalue SMap.empty ev in
SMap.iter (fun x p -> ignore (Env.new_lvar env (p, x))) vars;
let ev = expr env ev in
(match aw with
| None -> N.As_kv (k, ev)
| Some p -> N.Await_as_kv (p, k, ev))
let k = p1, N.Lvar (Env.new_lvar env k) in
let nsenv = (fst env).namespace in
let _, vars = Naming_ast_helpers.GetLocals.lvalue (nsenv, SMap.empty) ev in
SMap.iter (fun x p -> ignore (Env.new_lvar env (p, x))) vars;
let ev = expr env ev in
(match aw with
| None -> N.As_kv (k, ev)
| Some p -> N.Await_as_kv (p, k, ev))
| As_kv ((p, _), _) ->
Errors.expected_variable p;
let x1 = p, N.Lvar (Env.new_lvar env (p, "__internal_placeholder")) in
Expand All @@ -1741,7 +1745,8 @@ and as_expr env aw = function
| Some p -> N.Await_as_kv (p, x1, x2))

and try_stmt env st b cl fb =
let vars = Naming_ast_helpers.GetLocals.stmt SMap.empty st in
let nsenv = (fst env).namespace in
let _, vars = Naming_ast_helpers.GetLocals.stmt (nsenv, SMap.empty) st in
SMap.iter (fun x p -> Env.new_pending_lvar env (p, x)) vars;
let result = Env.scope env (
fun env ->
Expand Down Expand Up @@ -2046,7 +2051,8 @@ and expr_ env = function
| Unop (uop, e) -> N.Unop (uop, expr env e)
| Binop (Eq None as op, lv, e2) ->
let e2 = expr env e2 in
let vars = Naming_ast_helpers.GetLocals.lvalue SMap.empty lv in
let nsenv = (fst env).namespace in
let _, vars = Naming_ast_helpers.GetLocals.lvalue (nsenv, SMap.empty) lv in
SMap.iter (fun x p -> ignore (Env.new_lvar env (p, x))) vars;
N.Binop (op, expr env lv, e2)
| Binop (bop, e1, e2) ->
Expand Down

0 comments on commit 26fd06e

Please sign in to comment.