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