Type constant multiple inheritance checks
commit7061e1b1a99c374e1215f04140481c2e61213275
authorKaty Voor <voork@fb.com>
Mon, 22 Feb 2021 23:09:22 +0000 (22 15:09 -0800)
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>
Fri, 26 Feb 2021 00:29:53 +0000 (25 16:29 -0800)
treebc0ae4dca712b853cd45f65ad0bb34efab491eda
parent48dc298bb278d1f6291a7c1b81724b8e1f897760
Type constant multiple inheritance checks

Summary:
Type constants with declared values (either non-abstract, or abstract with default value) operate under the same precedence / conflict rules that class constants do.

These checks mirror the handling of type constants in HHVM.

Added synthesized field to type constants to avoid checking synthesized type constants (see test case abstract_class.php).

```
class A { abstract const type T = string; }
interface I { const type T = int; }
class B extends A implements I {}

File "interface_override_parent1.php", line 11, characters 7-7:
Class `B` does not correctly implement all required members  (Typing[4340])
  File "interface_override_parent1.php", line 11, characters 17-17:
  Some members are incompatible with those declared in type `A`
  File "interface_override_parent1.php", line 8, characters 14-14:
  Type constants with declared values in an interface cannot conflict with other inherited type constants with declared values.
  File "interface_override_parent1.php", line 4, characters 23-23:
  `T` inherited from `A`
  File "interface_override_parent1.php", line 8, characters 14-14:
  conflicts with type constant `T` inherited from `I`.

Reviewed By: vassilmladenov

Differential Revision: D26500983

fbshipit-source-id: a6d1c5d1050e192e6d03f87a94398e98a42d7683
32 files changed:
hphp/hack/src/decl/decl_folded_class.ml
hphp/hack/src/decl/decl_inherit.ml
hphp/hack/src/decl/decl_pos_utils.ml
hphp/hack/src/decl/decl_to_typing.ml
hphp/hack/src/errors/errors.ml
hphp/hack/src/errors/errors.mli
hphp/hack/src/oxidized_by_ref/gen/typing_defs.rs
hphp/hack/src/typing/typing_defs.ml
hphp/hack/src/typing/typing_extends.ml
hphp/hack/src/typing/typing_print.ml
hphp/hack/test/typecheck/context_constant_override.php [new file with mode: 0644]
hphp/hack/test/typecheck/context_constant_override.php.exp [copied from hphp/hack/test/typecheck/typeconsts/linearization.php.legacy_decl.exp with 100% similarity]
hphp/hack/test/typecheck/req_extends_class_const.php [new file with mode: 0644]
hphp/hack/test/typecheck/req_extends_class_const.php.exp [copied from hphp/hack/test/typecheck/typeconsts/linearization.php.like_types.exp with 100% similarity]
hphp/hack/test/typecheck/typeconsts/abstract_class.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/abstract_class.php.exp [copied from hphp/hack/test/typecheck/typeconsts/linearization.php.legacy_decl.exp with 100% similarity]
hphp/hack/test/typecheck/typeconsts/interface_override_parent.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_parent.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_parent1.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_parent1.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_parent2.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_parent2.php.exp [copied from hphp/hack/test/typecheck/typeconsts/linearization.php.legacy_decl.exp with 100% similarity]
hphp/hack/test/typecheck/typeconsts/interface_override_trait.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_trait.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_trait1.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_trait1.php.exp [copied from hphp/hack/test/typecheck/typeconsts/linearization.php.legacy_decl.exp with 100% similarity]
hphp/hack/test/typecheck/typeconsts/interface_override_trait2.php [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/interface_override_trait2.php.exp [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/linearization.php.coeffects.exp [new file with mode: 0644]
hphp/hack/test/typecheck/typeconsts/linearization.php.exp
hphp/hack/test/typecheck/typeconsts/linearization.php.legacy_decl.exp
hphp/hack/test/typecheck/typeconsts/linearization.php.like_types.exp