@@ -492,6 +492,22 @@ let check_override_final_method env parent_class_elt class_elt on_error =
492492 Typing_error. (
493493 apply_reasons ~on_error @@ Secondary. Override_final { pos; parent_pos })
494494
495+ (* * Checks that we're not overriding a concrete static property. *)
496+ let check_override_concrete_static_prop
497+ ~parent_pos env member_name parent_class_elt class_elt =
498+ if
499+ (not (get_ce_abstract parent_class_elt))
500+ && not (get_ce_const parent_class_elt)
501+ then
502+ let child_prop_pos = Lazy. force class_elt.ce_pos in
503+ Typing_warning_utils. add
504+ env
505+ Typing_warning.
506+ ( parent_pos,
507+ Static_property_override ,
508+ Static_property_override. { prop_name = member_name; child_prop_pos }
509+ )
510+
495511(* * Checks that methods annotated with __DynamicallyCallable are only overridden with
496512 dynamically callable method. *)
497513let check_dynamically_callable
@@ -981,6 +997,7 @@ let check_override
981997 ~class_
982998 ~parent_class
983999 ~(parent_type : decl_ty )
1000+ ~parent_pos
9841001 ~(class_elt : class_elt )
9851002 ~parent_class_elt
9861003 on_error =
@@ -994,6 +1011,18 @@ let check_override
9941011 on_error
9951012 in
9961013
1014+ begin
1015+ match member_kind with
1016+ | MemberKind. Static_property ->
1017+ check_override_concrete_static_prop
1018+ ~parent_pos
1019+ env
1020+ member_name
1021+ parent_class_elt
1022+ class_elt
1023+ | _ -> ()
1024+ end ;
1025+
9971026 if MemberKind. is_method member_kind then begin
9981027 (* We first verify that we aren't overriding a final method. We only check
9991028 * for final overrides on methods, not properties. Constructors have their
@@ -1548,6 +1577,7 @@ let check_class_against_parent_class_elt
15481577 ~parent_class
15491578 ~parent_class_elt
15501579 ~parent_type
1580+ ~parent_pos
15511581 ~class_elt
15521582 (on_error (parent_pos, Cls. name parent_class)) )
15531583 | None ->
@@ -1736,7 +1766,8 @@ let default_constructor_ce class_ =
17361766 }
17371767
17381768(* When an interface defines a constructor, we check that they are compatible *)
1739- let check_constructors env (parent_class , parent_type ) class_ psubst on_error =
1769+ let check_constructors
1770+ ~parent_pos env (parent_class , parent_type ) class_ psubst on_error =
17401771 let parent_is_interface = Ast_defs. is_c_interface (Cls. kind parent_class) in
17411772 let parent_is_consistent =
17421773 constructor_is_consistent (snd (Cls. construct parent_class))
@@ -1772,6 +1803,7 @@ let check_constructors env (parent_class, parent_type) class_ psubst on_error =
17721803 ~class_
17731804 ~parent_class
17741805 ~parent_type
1806+ ~parent_pos
17751807 ~parent_class_elt: parent_cstr
17761808 ~class_elt: cstr
17771809 on_error
@@ -2127,14 +2159,21 @@ let check_typeconst_override
21272159 * message pointing at the class being checked.
21282160 *)
21292161let check_class_extends_parent_constructors
2162+ ~parent_pos
21302163 env
21312164 (parent_class : (Pos.t * string) * decl_ty * decl_ty list * Cls.t )
21322165 class_
21332166 on_error =
21342167 let (_, parent_type, parent_tparaml, parent_class) = parent_class in
21352168 let psubst = Inst. make_subst (Cls. tparams parent_class) parent_tparaml in
21362169 let env =
2137- check_constructors env (parent_class, parent_type) class_ psubst on_error
2170+ check_constructors
2171+ ~parent_pos
2172+ env
2173+ (parent_class, parent_type)
2174+ class_
2175+ psubst
2176+ on_error
21382177 in
21392178 env
21402179
@@ -2890,6 +2929,7 @@ let check_implements_extends_uses
28902929 parents
28912930 ~f: (fun env ((parent_name , _ , _ , _ ) as parent ) ->
28922931 check_class_extends_parent_constructors
2932+ ~parent_pos: (fst parent_name)
28932933 env
28942934 parent
28952935 class_
0 commit comments