Forget fake members on property assignment
commit1162a88d6c29e1b4e02d31dd848d3b2d50ba81c3
authorMistral Orhan Jean-Pierre Contrastin <mojpc2@fb.com>
Tue, 23 Jun 2020 11:51:01 +0000 (23 04:51 -0700)
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>
Tue, 23 Jun 2020 11:53:27 +0000 (23 04:53 -0700)
treec29eea7af0a9c78aa6868d938f172adee5104e3a
parent76f6fdeea49fbdd24ff3aed96fbf7996e352649e
Forget fake members on property assignment

Summary:
Invalidate fake members on assignment to properties. This selectively invalidates only fake members that have `->prop` suffix whenever there is an assignment to any `$obj->prop`.

- This is similar to forgetting refinements by prefix used when the object of a fake member is assigned. So we consolidate all invalidation mechanisms.
- Since we now invalidate assignments to `prop`, we no longer need to type check LHS of an Obj_get assignment in a special environment without fake members. See the deleted comment in 3978-3987 in `typing.ml` for more details.
- This allows previously illegal programs to become safe. We can now use some refinements in the LHS of an assignment. `$obj->prop1->prop2 = $x` can use a refinement about `$obj->prop1`, I believe (!!!) this is sound.

Reviewed By: andrewjkennedy

Differential Revision: D21836140

fbshipit-source-id: 82b546041b01dd790d5b5ad4d6794ad5682a659f
13 files changed:
hphp/hack/src/typing/typing.ml
hphp/hack/src/typing/typing_env.ml
hphp/hack/src/typing/typing_env.mli
hphp/hack/src/typing/typing_fake_members.ml
hphp/hack/src/typing/typing_fake_members.mli
hphp/hack/test/typecheck/refinements/aliasing.php [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/aliasing.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/aliasing_granularity.php [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/aliasing_granularity.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/aliasing_static.php [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/aliasing_static.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/assignment_lhs.php [new file with mode: 0644]
hphp/hack/test/typecheck/refinements/assignment_lhs.php.exp [new file with mode: 0644]