Summary: `typecheck_instr` is a function that essentially does most of nullsafe typechecking work: it pattern matches the instruction and handles most of business logic (e.g. knowledge about builtins, rules of PropagatesNullable, flow-sensitive rule for condition branches etc etc etc. This is a gigantic function consisting of huge amount of nested function. No way it can fit in someone's head and it is super hard to read. It also captures many things like node and node'. This diff does fairly shallow work: 1. Moves most of nested subfunctions into top-level functions. It also means that what was previously hiddenly captured is now made an explicit dependency. 2. Some (minority) of them are renamed to better indicate the context. 3. Some (minority) of params are renamed to clear indicate the difference. 4. Some params are made named params, especially booleans and params that have the same types so could be confused. 5. In some placed, added bit more clear comments. This diff DOES NOT do: 1. Tries to fully resolve confusion between cryptic names. In couple of places, instead of node' and node we use node and original_node, which is barely better. But we still have ugly things like typestate and typestate1 leaving together. Baby steps! 2. Tries to create better or consistent names in functions. I did it for most obvious cases, that's it. 3. Order or params is arbitrary. I just used the order that was easy to come up with, no consistency here. Reviewed By: artempyanykh Differential Revision: D18425965 fbshipit-source-id: 7a775f08dmaster
parent
b50e1cba51
commit
c3a62b808a