Skip to content

Commit 02e3aad

Browse files
marcoww6meta-codesync[bot]
authored andcommitted
[flow] Emit errors for the 7 reserved keywords for class definitions
Summary: Changelog: [error] Flow will error for the following reserved keywords: `$NonMaybeType`, `NonNullable`, `$ReadOnly`, `Readonly`, `$Keys`, `$Values`, `Values` when defining or declaring a class. Reviewed By: SamChou19815 Differential Revision: D84752605 fbshipit-source-id: 9d72c76c447fa19a5d4751729ac5c56d6fb8de13
1 parent 784dc48 commit 02e3aad

3 files changed

Lines changed: 151 additions & 1 deletion

File tree

src/analysis/env_builder/name_resolver.ml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4519,14 +4519,32 @@ module Make (Context : C) (FlowAPIUtils : F with type cx = Context.t) :
45194519
class_stack <- class_stack_old;
45204520
cls
45214521

4522+
method private check_class_name name_loc name =
4523+
let open Flow_intermediate_error_types in
4524+
match IncorrectType.from_str name with
4525+
| Some keyword when IncorrectType.is_type_reserved keyword ->
4526+
add_output
4527+
Error_message.(
4528+
EBindingError (EReservedKeyword { keyword }, name_loc, OrdinaryName name, name_loc)
4529+
)
4530+
| _ -> ()
4531+
4532+
method! class_identifier ((name_loc, { Ast.Identifier.name; comments = _ }) as id) =
4533+
(* Called by `declare class` *)
4534+
this#check_class_name name_loc name;
4535+
super#class_identifier id
4536+
45224537
method! class_identifier_opt ~class_loc:loc id =
45234538
let (class_write_loc, class_self_reason) =
45244539
match id with
45254540
| Some ((name_loc, { Ast.Identifier.name; comments = _ }) as id) ->
4541+
(* Process `class <name> {}` *)
4542+
this#check_class_name name_loc name;
45264543
this#bind_pattern_identifier_customized ~kind:ClassBinding name_loc name;
45274544
ignore @@ super#identifier id;
45284545
(name_loc, mk_reason (RType (OrdinaryName name)) name_loc)
45294546
| None ->
4547+
(* Process annonymous class *)
45304548
let reason = mk_reason (RType (OrdinaryName "<<anonymous class>>")) loc in
45314549
env_state <-
45324550
{

tests/ts_syntax/reserved_type.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,23 @@
1616
declare type $Values<T> = Array<T>;
1717
declare type Values = Array<string>;
1818
}
19+
20+
{
21+
declare class $NonMaybeType {}
22+
declare class NonNullable {}
23+
declare class $ReadOnly {}
24+
declare class Readonly {}
25+
declare class $Keys<TT> {}
26+
declare class $Values<T> {}
27+
declare class Values {}
28+
}
29+
30+
{
31+
class $NonMaybeType {}
32+
class NonNullable {}
33+
class $ReadOnly {}
34+
class Readonly {}
35+
class $Keys<TT> {}
36+
class $Values<T> {}
37+
class Values {}
38+
}

tests/ts_syntax/ts_syntax.exp

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,118 @@ Cannot declare `Values` [1], because `Values` is a reserved type name. [reserved
845845
^^^^^^ [1]
846846

847847

848+
Error ------------------------------------------------------------------------------------------- reserved_type.js:21:18
849+
850+
Cannot declare `$NonMaybeType` [1], because `$NonMaybeType` is a reserved type name. [reserved-keyword]
851+
852+
21| declare class $NonMaybeType {}
853+
^^^^^^^^^^^^^ [1]
854+
855+
856+
Error ------------------------------------------------------------------------------------------- reserved_type.js:22:18
857+
858+
Cannot declare `NonNullable` [1], because `NonNullable` is a reserved type name. [reserved-keyword]
859+
860+
22| declare class NonNullable {}
861+
^^^^^^^^^^^ [1]
862+
863+
864+
Error ------------------------------------------------------------------------------------------- reserved_type.js:23:18
865+
866+
Cannot declare `$ReadOnly` [1], because `$ReadOnly` is a reserved type name. [reserved-keyword]
867+
868+
23| declare class $ReadOnly {}
869+
^^^^^^^^^ [1]
870+
871+
872+
Error ------------------------------------------------------------------------------------------- reserved_type.js:24:18
873+
874+
Cannot declare `Readonly` [1], because `Readonly` is a reserved type name. [reserved-keyword]
875+
876+
24| declare class Readonly {}
877+
^^^^^^^^ [1]
878+
879+
880+
Error ------------------------------------------------------------------------------------------- reserved_type.js:25:18
881+
882+
Cannot declare `$Keys` [1], because `$Keys` is a reserved type name. [reserved-keyword]
883+
884+
25| declare class $Keys<TT> {}
885+
^^^^^ [1]
886+
887+
888+
Error ------------------------------------------------------------------------------------------- reserved_type.js:26:18
889+
890+
Cannot declare `$Values` [1], because `$Values` is a reserved type name. [reserved-keyword]
891+
892+
26| declare class $Values<T> {}
893+
^^^^^^^ [1]
894+
895+
896+
Error ------------------------------------------------------------------------------------------- reserved_type.js:27:18
897+
898+
Cannot declare `Values` [1], because `Values` is a reserved type name. [reserved-keyword]
899+
900+
27| declare class Values {}
901+
^^^^^^ [1]
902+
903+
904+
Error ------------------------------------------------------------------------------------------- reserved_type.js:31:10
905+
906+
Cannot declare `$NonMaybeType` [1], because `$NonMaybeType` is a reserved type name. [reserved-keyword]
907+
908+
31| class $NonMaybeType {}
909+
^^^^^^^^^^^^^ [1]
910+
911+
912+
Error ------------------------------------------------------------------------------------------- reserved_type.js:32:10
913+
914+
Cannot declare `NonNullable` [1], because `NonNullable` is a reserved type name. [reserved-keyword]
915+
916+
32| class NonNullable {}
917+
^^^^^^^^^^^ [1]
918+
919+
920+
Error ------------------------------------------------------------------------------------------- reserved_type.js:33:10
921+
922+
Cannot declare `$ReadOnly` [1], because `$ReadOnly` is a reserved type name. [reserved-keyword]
923+
924+
33| class $ReadOnly {}
925+
^^^^^^^^^ [1]
926+
927+
928+
Error ------------------------------------------------------------------------------------------- reserved_type.js:34:10
929+
930+
Cannot declare `Readonly` [1], because `Readonly` is a reserved type name. [reserved-keyword]
931+
932+
34| class Readonly {}
933+
^^^^^^^^ [1]
934+
935+
936+
Error ------------------------------------------------------------------------------------------- reserved_type.js:35:10
937+
938+
Cannot declare `$Keys` [1], because `$Keys` is a reserved type name. [reserved-keyword]
939+
940+
35| class $Keys<TT> {}
941+
^^^^^ [1]
942+
943+
944+
Error ------------------------------------------------------------------------------------------- reserved_type.js:36:10
945+
946+
Cannot declare `$Values` [1], because `$Values` is a reserved type name. [reserved-keyword]
947+
948+
36| class $Values<T> {}
949+
^^^^^^^ [1]
950+
951+
952+
Error ------------------------------------------------------------------------------------------- reserved_type.js:37:10
953+
954+
Cannot declare `Values` [1], because `Values` is a reserved type name. [reserved-keyword]
955+
956+
37| class Values {}
957+
^^^^^^ [1]
958+
959+
848960
Error ------------------------------------------------------------------------------------------------ satisfies.js:4:18
849961

850962
Cannot build a typed interface for this module. You should annotate the exports of this module with types. Cannot
@@ -910,4 +1022,4 @@ types. [ts-syntax]
9101022

9111023

9121024

913-
Found 108 errors
1025+
Found 122 errors

0 commit comments

Comments
 (0)