Skip to content

Commit

Permalink
[flow] handle singleton false in renders_kit
Browse files Browse the repository at this point in the history
Summary:
Fill in some cases so that
```
declare const fls: false;
(fls: renders* MenuItem);
```
is not an error.

Changelog: [internal]

Reviewed By: SamChou19815

Differential Revision: D69962310

fbshipit-source-id: cdf4c1fcc39a87a24897561fd6ab23ba1e1e208c
  • Loading branch information
panagosg7 authored and facebook-github-bot committed Feb 21, 2025
1 parent e89fad4 commit 8732aa9
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 27 deletions.
4 changes: 2 additions & 2 deletions src/typing/renders_kit.ml
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ module Make (Flow : INPUT) : S = struct

let non_renders_to_renders cx trace ~use_op l (renders_r, upper_renders) =
match (l, upper_renders) with
| ( DefT (_, (NullT | VoidT | BoolT_UNSOUND false)),
| ( DefT (_, (NullT | VoidT | BoolT_UNSOUND false | SingletonBoolT false)),
( StructuralRenders
{ renders_variant = RendersMaybe | RendersStar; renders_structural_type = _ }
| DefaultRenders )
Expand Down Expand Up @@ -405,7 +405,7 @@ module Make (Flow : INPUT) : S = struct
FailedSynthesisState
else
on_concretized_react_node_types cx ~drop_renders_any ~state ts
| DefT (_, (NullT | VoidT | BoolT_UNSOUND false)) ->
| DefT (_, (NullT | VoidT | BoolT_UNSOUND false | SingletonBoolT false)) ->
let renders_variant = merge_renders_variant (renders_variant, RendersMaybe) in
IntermediateSynthesisState { normalized_render_type_collector; renders_variant }
| DefT (_, ArrT (ArrayAT { elem_t = t; _ } | TupleAT { elem_t = t; _ } | ROArrayAT (t, _)))
Expand Down
50 changes: 25 additions & 25 deletions tests/render_types/render_types.exp
Original file line number Diff line number Diff line change
Expand Up @@ -616,75 +616,75 @@ References:
^^^^ [3]


Error ---------------------------------------------------------------------------------------------- renders_star.js:8:2
Error ---------------------------------------------------------------------------------------------- renders_star.js:9:2

Cannot cast `true` to renders* `MenuItem` because boolean [1] does not render `MenuItem` [2]. [incompatible-cast]

renders_star.js:8:2
8| (true: renders* MenuItem); // ERROR
renders_star.js:9:2
9| (true: renders* MenuItem); // ERROR
^^^^ [1]

References:
renders_star.js:8:8
8| (true: renders* MenuItem); // ERROR
renders_star.js:9:8
9| (true: renders* MenuItem); // ERROR
^^^^^^^^^^^^^^^^^ [2]


Error -------------------------------------------------------------------------------------------- renders_star.js:20:58
Error -------------------------------------------------------------------------------------------- renders_star.js:21:58

Cannot use read-only array type [1] as the type argument of renders type. Only elements of a component-syntax components
can appear in renders. If you want to express the idea of rendering zero or more items, please use `renders*` instead.
[invalid-render]

20| declare const rendersChildrenArrayBlueMenuItem: renders? React.ChildrenArray<BlueMenuItem>; // invalid-render
21| declare const rendersChildrenArrayBlueMenuItem: renders? React.ChildrenArray<BlueMenuItem>; // invalid-render
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1]


Error -------------------------------------------------------------------------------------------- renders_star.js:24:30
Error -------------------------------------------------------------------------------------------- renders_star.js:25:30

Cannot resolve name `RendersHuh`. [cannot-resolve-name]

24| declare const rendersHuhBad: RendersHuh<Bad>;
25| declare const rendersHuhBad: RendersHuh<Bad>;
^^^^^^^^^^


Error -------------------------------------------------------------------------------------------- renders_star.js:28:32
Error -------------------------------------------------------------------------------------------- renders_star.js:29:32

Cannot use boolean literal `false` [1], read-only array type [2], null [3] and undefined [4] as the type argument of
renders type. Only elements of a component-syntax components can appear in renders. If you want to express the idea of
rendering zero or more items, please use `renders*` instead. [invalid-render]

renders_star.js:28:32
28| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
renders_star.js:29:32
29| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

References:
renders_star.js:28:39
28| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
renders_star.js:29:39
29| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
^^^^^ [1]
renders_star.js:28:65
28| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
renders_star.js:29:65
29| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [2]
renders_star.js:28:32
28| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
renders_star.js:29:32
29| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
^^^^ [3]
renders_star.js:28:47
28| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
renders_star.js:29:47
29| (rendersStarMenuItem: renders (null | false | void | MenuItem | $ReadOnlyArray<renders* MenuItem>)); // type checks, but invalid-render
^^^^ [4]


Error -------------------------------------------------------------------------------------------- renders_star.js:30:35
Error -------------------------------------------------------------------------------------------- renders_star.js:31:35

Cannot cast array literal to renders* `MenuItem` because `Bad` element [1] does not render `MenuItem` [2].
[incompatible-cast]

renders_star.js:30:35
30| ([<MenuItem />, <BlueMenuItem />, <Bad />]: renders* MenuItem); // ERROR
renders_star.js:31:35
31| ([<MenuItem />, <BlueMenuItem />, <Bad />]: renders* MenuItem); // ERROR
^^^^^^^ [1]

References:
renders_star.js:30:45
30| ([<MenuItem />, <BlueMenuItem />, <Bad />]: renders* MenuItem); // ERROR
renders_star.js:31:45
31| ([<MenuItem />, <BlueMenuItem />, <Bad />]: renders* MenuItem); // ERROR
^^^^^^^^^^^^^^^^^ [2]


Expand Down
1 change: 1 addition & 0 deletions tests/render_types/renders_star.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as React from 'react';
component MenuItem() { return null }
(null: renders* MenuItem); // OK
(false: renders* MenuItem); // OK
(false as false: renders* MenuItem); // OK
(undefined: renders* MenuItem); // OK
([null, [false, [undefined]]]: renders* MenuItem); // OK
([null, false, undefined]: renders* MenuItem); // OK
Expand Down

0 comments on commit 8732aa9

Please sign in to comment.