From a8ab0d6739d3634f1e93885e6ca2082bebbd3594 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Sat, 27 Aug 2022 07:32:43 +0200 Subject: [PATCH 01/18] Add example of JSX V4 with genType. No special treatment so far, just a normal function as if it were written by hand. --- .../typescript-react-example/src/JSXV4.bs.js | 13 +++++++++++++ .../typescript-react-example/src/JSXV4.gen.tsx | 16 ++++++++++++++++ .../typescript-react-example/src/JSXV4.res | 4 ++++ 3 files changed, 33 insertions(+) create mode 100644 jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js create mode 100644 jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx create mode 100644 jscomp/gentype_tests/typescript-react-example/src/JSXV4.res diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js new file mode 100644 index 0000000000..6895d7a00a --- /dev/null +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js @@ -0,0 +1,13 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +function JSXV4(props) { + return props.x + props.y; +} + +var make = JSXV4; + +export { + make , +} +/* No side effect */ diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx new file mode 100644 index 0000000000..046158c675 --- /dev/null +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -0,0 +1,16 @@ +/* TypeScript file generated from JSXV4.res by genType. */ +/* eslint-disable import/first */ + + +// @ts-ignore: Implicit any on import +import * as JSXV4BS__Es6Import from './JSXV4.bs'; +const JSXV4BS: any = JSXV4BS__Es6Import; + +// tslint:disable-next-line:interface-over-type-literal +export type props = { + readonly key?: string; + readonly x: x; + readonly y: y +}; + +export const make: (_1:props) => JSX.Element = JSXV4BS.make; diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res new file mode 100644 index 0000000000..87636bdbd9 --- /dev/null +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res @@ -0,0 +1,4 @@ +@@jsxConfig({version: 4}) + +@genType @react.component +let make = (~x, ~y) => React.string(x ++ y) From da09dfe898a295396f40cc5e6040a4ee430d4ac9 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Tue, 30 Aug 2022 20:58:03 +0200 Subject: [PATCH 02/18] [genType] First step towards emitting components in V4 just as in V3. --- jscomp/gentype/EmitJs.ml | 78 ++++++++++++++++--- .../src/JSXV4.gen.tsx | 6 +- lib/4.06.1/whole_compiler.ml | 78 ++++++++++++++++--- 3 files changed, 141 insertions(+), 21 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index 892afec66d..d8e5d057c4 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -125,8 +125,8 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized (env, emitters) let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized - ~typeNameIsInterface ~variantTables codeItem = + ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined + ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" (codeItem |> codeItemToString ~config ~typeNameIsInterface); @@ -307,6 +307,62 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in ( Function { function_ with componentName = Some hookName }, Some { HookType.propsType; resolvedTypeName; typeVars } ) + | Function + ({ + argTypes = [ { aType = Ident { name = "props" } as propsType } ]; + retType; + } as function_) + when retType |> EmitType.isTypeFunctionComponent ~fields:[] -> + let compType = + match typeGetInlined propsType with + | Object (closedFlags, fields) -> + let propsType = + let fields = + fields + |> List.map (fun (field : field) -> + match + field.nameJS = "children" + && field.type_ |> EmitType.isTypeReactElement + with + | true -> + { field with type_ = EmitType.typeReactChild } + | false -> field) + in + Object (closedFlags, fields) + in + let function_ = + { + function_ with + argTypes = [ { aName = ""; aType = propsType } ]; + } + in + let chopSuffix suffix = + match resolvedNameStr = suffix with + | true -> "" + | false -> ( + match + Filename.check_suffix resolvedNameStr ("_" ^ suffix) + with + | true -> + Filename.chop_suffix resolvedNameStr ("_" ^ suffix) + | false -> resolvedNameStr) + in + let suffix = + if originalName = default then chopSuffix default + else if originalName = make then chopSuffix make + else resolvedNameStr + in + let hookName = + (fileName |> ModuleName.toString) + ^ + match suffix = "" with + | true -> suffix + | false -> "_" ^ suffix + in + Function { function_ with componentName = Some hookName } + | _ -> type_ + in + (compType, None) | _ -> (type_, None) in @@ -329,7 +385,8 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in (* For doc gen (https://github.com/cristianoc/genType/issues/342) *) config.emitImportReact <- true; - emitExportType ~emitters ~config ~typeGetNormalized + emitExportType ~emitters ~config + ~typeGetNormalized ~typeNameIsInterface exportType | _ -> emitters in @@ -350,14 +407,14 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName (envWithRequires, emitters) and emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized - ~typeNameIsInterface ~variantTables) + ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined + ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters = @@ -627,12 +684,13 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations try exportTypeMap |> StringMap.find s with Not_found -> env.exportTypeMapFromOtherFiles |> StringMap.find s in - let typeGetNormalized_ ~env type_ = + let typeGetNormalized__ ~inline ~env type_ = type_ - |> Converter.typeGetNormalized ~config ~inline:false - ~lookupId:(lookupId_ ~env) + |> Converter.typeGetNormalized ~config ~inline ~lookupId:(lookupId_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) in + let typeGetNormalized_ = typeGetNormalized__ ~inline:false in + let typeGetInlined_ = typeGetNormalized__ ~inline:true in let typeGetConverter_ ~env type_ = type_ |> Converter.typeGetConverter ~config ~lookupId:(lookupId_ ~env) @@ -657,7 +715,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver + ~outputFileRelative ~resolver ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index 046158c675..e85d6b09e1 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -13,4 +13,8 @@ export type props = { readonly y: y }; -export const make: (_1:props) => JSX.Element = JSXV4BS.make; +export const make: React.ComponentType<{ + readonly key?: string; + readonly x: string; + readonly y: string +}> = JSXV4BS.make; diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 4077392d09..9b6502d127 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240335,8 +240335,8 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized (env, emitters) let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized - ~typeNameIsInterface ~variantTables codeItem = + ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined + ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" (codeItem |> codeItemToString ~config ~typeNameIsInterface); @@ -240517,6 +240517,62 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in ( Function { function_ with componentName = Some hookName }, Some { HookType.propsType; resolvedTypeName; typeVars } ) + | Function + ({ + argTypes = [ { aType = Ident { name = "props" } as propsType } ]; + retType; + } as function_) + when retType |> EmitType.isTypeFunctionComponent ~fields:[] -> + let compType = + match typeGetInlined propsType with + | Object (closedFlags, fields) -> + let propsType = + let fields = + fields + |> List.map (fun (field : field) -> + match + field.nameJS = "children" + && field.type_ |> EmitType.isTypeReactElement + with + | true -> + { field with type_ = EmitType.typeReactChild } + | false -> field) + in + Object (closedFlags, fields) + in + let function_ = + { + function_ with + argTypes = [ { aName = ""; aType = propsType } ]; + } + in + let chopSuffix suffix = + match resolvedNameStr = suffix with + | true -> "" + | false -> ( + match + Filename.check_suffix resolvedNameStr ("_" ^ suffix) + with + | true -> + Filename.chop_suffix resolvedNameStr ("_" ^ suffix) + | false -> resolvedNameStr) + in + let suffix = + if originalName = default then chopSuffix default + else if originalName = make then chopSuffix make + else resolvedNameStr + in + let hookName = + (fileName |> ModuleName.toString) + ^ + match suffix = "" with + | true -> suffix + | false -> "_" ^ suffix + in + Function { function_ with componentName = Some hookName } + | _ -> type_ + in + (compType, None) | _ -> (type_, None) in @@ -240539,7 +240595,8 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in (* For doc gen (https://github.com/cristianoc/genType/issues/342) *) config.emitImportReact <- true; - emitExportType ~emitters ~config ~typeGetNormalized + emitExportType ~emitters ~config + ~typeGetNormalized ~typeNameIsInterface exportType | _ -> emitters in @@ -240560,14 +240617,14 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName (envWithRequires, emitters) and emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized - ~typeNameIsInterface ~variantTables) + ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined + ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters = @@ -240837,12 +240894,13 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations try exportTypeMap |> StringMap.find s with Not_found -> env.exportTypeMapFromOtherFiles |> StringMap.find s in - let typeGetNormalized_ ~env type_ = + let typeGetNormalized__ ~inline ~env type_ = type_ - |> Converter.typeGetNormalized ~config ~inline:false - ~lookupId:(lookupId_ ~env) + |> Converter.typeGetNormalized ~config ~inline ~lookupId:(lookupId_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) in + let typeGetNormalized_ = typeGetNormalized__ ~inline:false in + let typeGetInlined_ = typeGetNormalized__ ~inline:true in let typeGetConverter_ ~env type_ = type_ |> Converter.typeGetConverter ~config ~lookupId:(lookupId_ ~env) @@ -240867,7 +240925,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver + ~outputFileRelative ~resolver ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables From d5702791b47ef78390bedab9fd9c858819af90e6 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Tue, 30 Aug 2022 21:08:52 +0200 Subject: [PATCH 03/18] Add V3 and V4 examples of exported components. --- jscomp/gentype/EmitJs.ml | 12 ++++---- .../typescript-react-example/src/JSXV4.bs.js | 18 ++++++++++++ .../src/JSXV4.gen.tsx | 28 +++++++++++++++++++ .../typescript-react-example/src/JSXV4.res | 12 ++++++++ lib/4.06.1/whole_compiler.ml | 12 ++++---- 5 files changed, 68 insertions(+), 14 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index d8e5d057c4..8414401321 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -308,11 +308,10 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ( Function { function_ with componentName = Some hookName }, Some { HookType.propsType; resolvedTypeName; typeVars } ) | Function - ({ - argTypes = [ { aType = Ident { name = "props" } as propsType } ]; - retType; - } as function_) - when retType |> EmitType.isTypeFunctionComponent ~fields:[] -> + ({ argTypes = [ { aType = Ident { name } as propsType } ]; retType } + as function_) + when Filename.check_suffix name "props" + && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> let compType = match typeGetInlined propsType with | Object (closedFlags, fields) -> @@ -385,8 +384,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in (* For doc gen (https://github.com/cristianoc/genType/issues/342) *) config.emitImportReact <- true; - emitExportType ~emitters ~config - ~typeGetNormalized + emitExportType ~emitters ~config ~typeGetNormalized ~typeNameIsInterface exportType | _ -> emitters in diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js index 6895d7a00a..68fc57841c 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js @@ -5,9 +5,27 @@ function JSXV4(props) { return props.x + props.y; } +function JSXV4$CompV4(props) { + return props.x + props.y; +} + +var CompV4 = { + make: JSXV4$CompV4 +}; + +function JSXV4$CompV3(Props) { + return Props.x + Props.y; +} + +var CompV3 = { + make: JSXV4$CompV3 +}; + var make = JSXV4; export { make , + CompV4 , + CompV3 , } /* No side effect */ diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index e85d6b09e1..b8233d67d0 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -2,6 +2,8 @@ /* eslint-disable import/first */ +import * as React from 'react'; + // @ts-ignore: Implicit any on import import * as JSXV4BS__Es6Import from './JSXV4.bs'; const JSXV4BS: any = JSXV4BS__Es6Import; @@ -13,8 +15,34 @@ export type props = { readonly y: y }; +// tslint:disable-next-line:interface-over-type-literal +export type CompV4_props = { + readonly key?: string; + readonly x: x; + readonly y: y +}; + export const make: React.ComponentType<{ readonly key?: string; readonly x: string; readonly y: string }> = JSXV4BS.make; + +export const CompV4_make: React.ComponentType<{ + readonly key?: string; + readonly x: string; + readonly y: string +}> = JSXV4BS.CompV4.make; + +// tslint:disable-next-line:interface-over-type-literal +export type Props = { readonly x: string; readonly y: string }; + +export const CompV3_make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.CompV3.make; + +export const CompV3: { make: React.ComponentType<{ readonly x: string; readonly y: string }> } = JSXV4BS.CompV3 + +export const CompV4: { make: React.ComponentType<{ + readonly key?: string; + readonly x: string; + readonly y: string +}> } = JSXV4BS.CompV4 diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res index 87636bdbd9..ea02144416 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res @@ -2,3 +2,15 @@ @genType @react.component let make = (~x, ~y) => React.string(x ++ y) + +module CompV4 = { + @genType @react.component + let make = (~x, ~y) => React.string(x ++ y) +} + +@@jsxConfig({version: 3}) + +module CompV3 = { + @genType @react.component + let make = (~x, ~y) => React.string(x ++ y) +} diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 9b6502d127..30a76817ae 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240518,11 +240518,10 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ( Function { function_ with componentName = Some hookName }, Some { HookType.propsType; resolvedTypeName; typeVars } ) | Function - ({ - argTypes = [ { aType = Ident { name = "props" } as propsType } ]; - retType; - } as function_) - when retType |> EmitType.isTypeFunctionComponent ~fields:[] -> + ({ argTypes = [ { aType = Ident { name } as propsType } ]; retType } + as function_) + when Filename.check_suffix name "props" + && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> let compType = match typeGetInlined propsType with | Object (closedFlags, fields) -> @@ -240595,8 +240594,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in (* For doc gen (https://github.com/cristianoc/genType/issues/342) *) config.emitImportReact <- true; - emitExportType ~emitters ~config - ~typeGetNormalized + emitExportType ~emitters ~config ~typeGetNormalized ~typeNameIsInterface exportType | _ -> emitters in From bfe431c5530b8e417021772175bc4eb5998c6460 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 06:16:04 +0200 Subject: [PATCH 04/18] Filter out `key`. --- jscomp/gentype/EmitJs.ml | 20 ++++++++++--------- .../src/JSXV4.gen.tsx | 18 +++-------------- lib/4.06.1/whole_compiler.ml | 18 ++++++++--------- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index 8414401321..872a48372d 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -315,17 +315,19 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName let compType = match typeGetInlined propsType with | Object (closedFlags, fields) -> + (* JSX V4 *) let propsType = let fields = - fields - |> List.map (fun (field : field) -> - match - field.nameJS = "children" - && field.type_ |> EmitType.isTypeReactElement - with - | true -> - { field with type_ = EmitType.typeReactChild } - | false -> field) + Ext_list.filter_map fields (fun (field : field) -> + match field.nameJS with + | "children" + when field.type_ |> EmitType.isTypeReactElement -> + Some + { field with type_ = EmitType.typeReactChild } + | "key" -> + (* Filter out key, which is added to the props type definition in V4 *) + None + | _ -> Some field) in Object (closedFlags, fields) in diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index b8233d67d0..c06629a2e8 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -22,17 +22,9 @@ export type CompV4_props = { readonly y: y }; -export const make: React.ComponentType<{ - readonly key?: string; - readonly x: string; - readonly y: string -}> = JSXV4BS.make; +export const make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.make; -export const CompV4_make: React.ComponentType<{ - readonly key?: string; - readonly x: string; - readonly y: string -}> = JSXV4BS.CompV4.make; +export const CompV4_make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.CompV4.make; // tslint:disable-next-line:interface-over-type-literal export type Props = { readonly x: string; readonly y: string }; @@ -41,8 +33,4 @@ export const CompV3_make: React.ComponentType<{ readonly x: string; readonly y: export const CompV3: { make: React.ComponentType<{ readonly x: string; readonly y: string }> } = JSXV4BS.CompV3 -export const CompV4: { make: React.ComponentType<{ - readonly key?: string; - readonly x: string; - readonly y: string -}> } = JSXV4BS.CompV4 +export const CompV4: { make: React.ComponentType<{ readonly x: string; readonly y: string }> } = JSXV4BS.CompV4 diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 30a76817ae..5894fb6427 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240525,17 +240525,17 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName let compType = match typeGetInlined propsType with | Object (closedFlags, fields) -> + (* JSX V4 *) let propsType = let fields = - fields - |> List.map (fun (field : field) -> - match - field.nameJS = "children" - && field.type_ |> EmitType.isTypeReactElement - with - | true -> - { field with type_ = EmitType.typeReactChild } - | false -> field) + Ext_list.filter_map fields (fun (field : field) -> + match field.nameJS with + | "children" + when field.type_ |> EmitType.isTypeReactElement -> + Some + { field with type_ = EmitType.typeReactChild } + | "key" -> None + | _ -> Some field) in Object (closedFlags, fields) in From 0efbcb37d574a8867eceee9440cd1883e654a34e Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 06:22:45 +0200 Subject: [PATCH 05/18] Remove code duplication. --- jscomp/gentype/EmitJs.ml | 65 +++++++++++---------------------- lib/4.06.1/whole_compiler.ml | 69 +++++++++++++----------------------- 2 files changed, 45 insertions(+), 89 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index 872a48372d..3aa0bb95f6 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -249,6 +249,23 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName typeVars : string list; } end in + let getHookName () = + let chopSuffix suffix = + match resolvedNameStr = suffix with + | true -> "" + | false -> ( + match Filename.check_suffix resolvedNameStr ("_" ^ suffix) with + | true -> Filename.chop_suffix resolvedNameStr ("_" ^ suffix) + | false -> resolvedNameStr) + in + let suffix = + if originalName = default then chopSuffix default + else if originalName = make then chopSuffix make + else resolvedNameStr + in + (fileName |> ModuleName.toString) + ^ match suffix = "" with true -> suffix | false -> "_" ^ suffix + in let type_, hookType = match type_ with | Function @@ -258,6 +275,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName typeVars; } as function_) when retType |> EmitType.isTypeFunctionComponent ~fields -> + (* JSX V3 *) let propsType = let fields = fields @@ -277,25 +295,6 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName argTypes = [ { aName = ""; aType = propsType } ]; } in - let chopSuffix suffix = - match resolvedNameStr = suffix with - | true -> "" - | false -> ( - match - Filename.check_suffix resolvedNameStr ("_" ^ suffix) - with - | true -> Filename.chop_suffix resolvedNameStr ("_" ^ suffix) - | false -> resolvedNameStr) - in - let suffix = - if originalName = default then chopSuffix default - else if originalName = make then chopSuffix make - else resolvedNameStr - in - let hookName = - (fileName |> ModuleName.toString) - ^ match suffix = "" with true -> suffix | false -> "_" ^ suffix - in let resolvedTypeName = if (not config.emitTypePropDone) @@ -305,7 +304,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ResolvedName.fromString "Props") else ResolvedName.fromString name |> ResolvedName.dot "Props" in - ( Function { function_ with componentName = Some hookName }, + ( Function { function_ with componentName = Some (getHookName ()) }, Some { HookType.propsType; resolvedTypeName; typeVars } ) | Function ({ argTypes = [ { aType = Ident { name } as propsType } ]; retType } @@ -337,30 +336,8 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName argTypes = [ { aName = ""; aType = propsType } ]; } in - let chopSuffix suffix = - match resolvedNameStr = suffix with - | true -> "" - | false -> ( - match - Filename.check_suffix resolvedNameStr ("_" ^ suffix) - with - | true -> - Filename.chop_suffix resolvedNameStr ("_" ^ suffix) - | false -> resolvedNameStr) - in - let suffix = - if originalName = default then chopSuffix default - else if originalName = make then chopSuffix make - else resolvedNameStr - in - let hookName = - (fileName |> ModuleName.toString) - ^ - match suffix = "" with - | true -> suffix - | false -> "_" ^ suffix - in - Function { function_ with componentName = Some hookName } + Function + { function_ with componentName = Some (getHookName ()) } | _ -> type_ in (compType, None) diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 5894fb6427..0d6d5660e4 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240459,6 +240459,23 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName typeVars : string list; } end in + let getHookName () = + let chopSuffix suffix = + match resolvedNameStr = suffix with + | true -> "" + | false -> ( + match Filename.check_suffix resolvedNameStr ("_" ^ suffix) with + | true -> Filename.chop_suffix resolvedNameStr ("_" ^ suffix) + | false -> resolvedNameStr) + in + let suffix = + if originalName = default then chopSuffix default + else if originalName = make then chopSuffix make + else resolvedNameStr + in + (fileName |> ModuleName.toString) + ^ match suffix = "" with true -> suffix | false -> "_" ^ suffix + in let type_, hookType = match type_ with | Function @@ -240468,6 +240485,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName typeVars; } as function_) when retType |> EmitType.isTypeFunctionComponent ~fields -> + (* JSX V3 *) let propsType = let fields = fields @@ -240487,25 +240505,6 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName argTypes = [ { aName = ""; aType = propsType } ]; } in - let chopSuffix suffix = - match resolvedNameStr = suffix with - | true -> "" - | false -> ( - match - Filename.check_suffix resolvedNameStr ("_" ^ suffix) - with - | true -> Filename.chop_suffix resolvedNameStr ("_" ^ suffix) - | false -> resolvedNameStr) - in - let suffix = - if originalName = default then chopSuffix default - else if originalName = make then chopSuffix make - else resolvedNameStr - in - let hookName = - (fileName |> ModuleName.toString) - ^ match suffix = "" with true -> suffix | false -> "_" ^ suffix - in let resolvedTypeName = if (not config.emitTypePropDone) @@ -240515,7 +240514,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ResolvedName.fromString "Props") else ResolvedName.fromString name |> ResolvedName.dot "Props" in - ( Function { function_ with componentName = Some hookName }, + ( Function { function_ with componentName = Some (getHookName ()) }, Some { HookType.propsType; resolvedTypeName; typeVars } ) | Function ({ argTypes = [ { aType = Ident { name } as propsType } ]; retType } @@ -240534,7 +240533,9 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName when field.type_ |> EmitType.isTypeReactElement -> Some { field with type_ = EmitType.typeReactChild } - | "key" -> None + | "key" -> + (* Filter out key, which is added to the props type definition in V4 *) + None | _ -> Some field) in Object (closedFlags, fields) @@ -240545,30 +240546,8 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName argTypes = [ { aName = ""; aType = propsType } ]; } in - let chopSuffix suffix = - match resolvedNameStr = suffix with - | true -> "" - | false -> ( - match - Filename.check_suffix resolvedNameStr ("_" ^ suffix) - with - | true -> - Filename.chop_suffix resolvedNameStr ("_" ^ suffix) - | false -> resolvedNameStr) - in - let suffix = - if originalName = default then chopSuffix default - else if originalName = make then chopSuffix make - else resolvedNameStr - in - let hookName = - (fileName |> ModuleName.toString) - ^ - match suffix = "" with - | true -> suffix - | false -> "_" ^ suffix - in - Function { function_ with componentName = Some hookName } + Function + { function_ with componentName = Some (getHookName ()) } | _ -> type_ in (compType, None) From e19bd8779a22d48367ca017d7d261cca93053560 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 06:23:10 +0200 Subject: [PATCH 06/18] Update package-lock.json --- jscomp/gentype_tests/typescript-react-example/package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/jscomp/gentype_tests/typescript-react-example/package-lock.json b/jscomp/gentype_tests/typescript-react-example/package-lock.json index cff84db9eb..efa9acb5b8 100644 --- a/jscomp/gentype_tests/typescript-react-example/package-lock.json +++ b/jscomp/gentype_tests/typescript-react-example/package-lock.json @@ -20,6 +20,7 @@ } }, "../../..": { + "name": "rescript", "version": "10.1.0-alpha.1", "dev": true, "hasInstallScript": true, From 4ec05a9dc8c782de6aa42ee4ae4aa9483d11746a Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 06:25:21 +0200 Subject: [PATCH 07/18] Tweak jsxv4 example. --- .../typescript-react-example/src/JSXV4.bs.js | 7 ------- .../typescript-react-example/src/JSXV4.gen.tsx | 9 --------- .../gentype_tests/typescript-react-example/src/JSXV4.res | 4 +--- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js index 68fc57841c..446d10532a 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js @@ -1,10 +1,6 @@ // Generated by ReScript, PLEASE EDIT WITH CARE -function JSXV4(props) { - return props.x + props.y; -} - function JSXV4$CompV4(props) { return props.x + props.y; } @@ -21,10 +17,7 @@ var CompV3 = { make: JSXV4$CompV3 }; -var make = JSXV4; - export { - make , CompV4 , CompV3 , } diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index c06629a2e8..7d783d1599 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -8,13 +8,6 @@ import * as React from 'react'; import * as JSXV4BS__Es6Import from './JSXV4.bs'; const JSXV4BS: any = JSXV4BS__Es6Import; -// tslint:disable-next-line:interface-over-type-literal -export type props = { - readonly key?: string; - readonly x: x; - readonly y: y -}; - // tslint:disable-next-line:interface-over-type-literal export type CompV4_props = { readonly key?: string; @@ -22,8 +15,6 @@ export type CompV4_props = { readonly y: y }; -export const make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.make; - export const CompV4_make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.CompV4.make; // tslint:disable-next-line:interface-over-type-literal diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res index ea02144416..bbf89f462e 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res @@ -1,8 +1,5 @@ @@jsxConfig({version: 4}) -@genType @react.component -let make = (~x, ~y) => React.string(x ++ y) - module CompV4 = { @genType @react.component let make = (~x, ~y) => React.string(x ++ y) @@ -14,3 +11,4 @@ module CompV3 = { @genType @react.component let make = (~x, ~y) => React.string(x ++ y) } + From 56b6cbf99313f4be7dc4c1f706057ccd730b24cf Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 06:31:19 +0200 Subject: [PATCH 08/18] Add example of import for JSX V4. --- .../typescript-react-example/src/JSXV4.bs.js | 8 +++++++- .../src/JSXV4.gen.tsx | 19 ++++++++++++++++--- .../typescript-react-example/src/JSXV4.res | 9 +++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js index 446d10532a..1e2a993b64 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js @@ -1,5 +1,6 @@ // Generated by ReScript, PLEASE EDIT WITH CARE +import * as JSXV4Gen from "./JSXV4.gen"; function JSXV4$CompV4(props) { return props.x + props.y; @@ -17,8 +18,13 @@ var CompV3 = { make: JSXV4$CompV3 }; +function foo4(prim) { + return JSXV4Gen.foo(prim); +} + export { CompV4 , CompV3 , + foo4 , } -/* No side effect */ +/* ./JSXV4.gen Not a pure module */ diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index 7d783d1599..46bb8789ee 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -2,11 +2,21 @@ /* eslint-disable import/first */ +import {foo as fooNotChecked} from './hookExample'; + import * as React from 'react'; -// @ts-ignore: Implicit any on import -import * as JSXV4BS__Es6Import from './JSXV4.bs'; -const JSXV4BS: any = JSXV4BS__Es6Import; +// In case of type error, check the type of 'foo' in 'JSXV4.re' and './hookExample'. +export const fooTypeChecked: (_1:{ readonly person: person }) => string = fooNotChecked; + +// Export 'foo' early to allow circular import from the '.bs.js' file. +export const foo: unknown = function (Argperson: any) { + const result = fooTypeChecked({person:Argperson}); + return result +} as (_1:{ readonly person: person }) => string; + +// tslint:disable-next-line:no-var-requires +const JSXV4BS = require('./JSXV4.bs'); // tslint:disable-next-line:interface-over-type-literal export type CompV4_props = { @@ -15,6 +25,9 @@ export type CompV4_props = { readonly y: y }; +// tslint:disable-next-line:interface-over-type-literal +export type person = { readonly name: string; readonly age: number }; + export const CompV4_make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.CompV4.make; // tslint:disable-next-line:interface-over-type-literal diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res index bbf89f462e..90bfd17931 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res @@ -12,3 +12,12 @@ module CompV3 = { let make = (~x, ~y) => React.string(x ++ y) } +@genType +type person = { + name: string, + age: int, +} + +@@jsxConfig({version: 4}) + +@genType.import("./hookExample") external foo4: (~person: person) => string = "foo" From 47fd1948b6be1b6d1000ec4642fc7eb88ae20124 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 07:43:14 +0200 Subject: [PATCH 09/18] More elaborate example of component import. --- .../typescript-react-example/src/JSXV4.bs.js | 8 +++--- .../src/JSXV4.gen.tsx | 25 +++++++++++++------ .../typescript-react-example/src/JSXV4.res | 10 +++++++- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js index 1e2a993b64..7fec15984d 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.bs.js @@ -18,13 +18,11 @@ var CompV3 = { make: JSXV4$CompV3 }; -function foo4(prim) { - return JSXV4Gen.foo(prim); -} +var make = JSXV4Gen.make; export { CompV4 , CompV3 , - foo4 , + make , } -/* ./JSXV4.gen Not a pure module */ +/* make Not a pure module */ diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index 46bb8789ee..66cf783816 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -2,18 +2,15 @@ /* eslint-disable import/first */ -import {foo as fooNotChecked} from './hookExample'; +import {make as makeNotChecked} from './hookExample'; import * as React from 'react'; -// In case of type error, check the type of 'foo' in 'JSXV4.re' and './hookExample'. -export const fooTypeChecked: (_1:{ readonly person: person }) => string = fooNotChecked; +// In case of type error, check the type of 'make' in 'JSXV4.re' and './hookExample'. +export const makeTypeChecked: (_1:props>) => JSX.Element = makeNotChecked; -// Export 'foo' early to allow circular import from the '.bs.js' file. -export const foo: unknown = function (Argperson: any) { - const result = fooTypeChecked({person:Argperson}); - return result -} as (_1:{ readonly person: person }) => string; +// Export 'make' early to allow circular import from the '.bs.js' file. +export const make: unknown = makeTypeChecked as (_1:props>) => JSX.Element; // tslint:disable-next-line:no-var-requires const JSXV4BS = require('./JSXV4.bs'); @@ -28,6 +25,18 @@ export type CompV4_props = { // tslint:disable-next-line:interface-over-type-literal export type person = { readonly name: string; readonly age: number }; +// tslint:disable-next-line:interface-over-type-literal +export type renderMe = React.ComponentType<{ readonly randomString: string; readonly poly: a }>; + +// tslint:disable-next-line:interface-over-type-literal +export type props = { + readonly key?: string; + readonly actions?: actions; + readonly person: person; + readonly children: children; + readonly renderMe: renderMe +}; + export const CompV4_make: React.ComponentType<{ readonly x: string; readonly y: string }> = JSXV4BS.CompV4.make; // tslint:disable-next-line:interface-over-type-literal diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res index 90bfd17931..97c7584aee 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.res @@ -18,6 +18,14 @@ type person = { age: int, } +@genType type renderMe<'a> = React.component<{"randomString": string, "poly": 'a}> + @@jsxConfig({version: 4}) -@genType.import("./hookExample") external foo4: (~person: person) => string = "foo" +@genType.import("./hookExample") @react.component +external make: ( + ~actions: React.element=?, + ~person: person, + ~children: React.element, + ~renderMe: renderMe<'a>, +) => React.element = "make" From ff553114e457923855026e6c97d3db8d8d9f5651 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 07:52:08 +0200 Subject: [PATCH 10/18] Towards handling V4 components import. --- jscomp/gentype/EmitJs.ml | 38 +++++++++++++++++++ .../src/JSXV4.gen.tsx | 26 ++++++++++++- lib/4.06.1/whole_compiler.ml | 38 +++++++++++++++++++ 3 files changed, 100 insertions(+), 2 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index 3aa0bb95f6..bd301a9431 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -162,6 +162,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName retType; } as function_) when retType |> EmitType.isTypeFunctionComponent ~fields -> + (* JSX V3 *) let componentName = match importFile with "." | ".." -> None | _ -> Some importFile in @@ -182,6 +183,43 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName } in Function { function_ with componentName } + | Function + ({ + argTypes = [ { aType = Ident { name } as propsType; aName } ]; + retType; + } as function_) + when Filename.check_suffix name "props" + && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> ( + let _ = function_ in + let _ = propsType in + match typeGetInlined propsType with + | Object (closedFlags, fields) -> + (* JSX V3 *) + let componentName = + match importFile with + | "." | ".." -> None + | _ -> Some importFile + in + let fields = + Ext_list.filter_map fields (fun (field : field) -> + match field.nameJS with + | "children" + when field.type_ |> EmitType.isTypeReactElement -> + Some { field with type_ = EmitType.typeReactChild } + | "key" -> + (* Filter out key, which is added to the props type definition in V4 *) + None + | _ -> Some field) + in + let function_ = + { + function_ with + argTypes = + [ { aType = Object (closedFlags, fields); aName } ]; + } + in + Function { function_ with componentName } + | _ -> type_) | _ -> type_ in let converter = type_ |> typeGetConverter in diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index 66cf783816..910a303b63 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -7,10 +7,32 @@ import {make as makeNotChecked} from './hookExample'; import * as React from 'react'; // In case of type error, check the type of 'make' in 'JSXV4.re' and './hookExample'. -export const makeTypeChecked: (_1:props>) => JSX.Element = makeNotChecked; +export const makeTypeChecked: React.ComponentType<{ + readonly actions?: JSX.Element; + readonly person: { + readonly name: string; + readonly age: number + }; + readonly children: React.ReactNode; + readonly renderMe: React.ComponentType<{ + readonly randomString: string; + readonly poly: any + }> +}> = makeNotChecked; // Export 'make' early to allow circular import from the '.bs.js' file. -export const make: unknown = makeTypeChecked as (_1:props>) => JSX.Element; +export const make: unknown = makeTypeChecked as React.ComponentType<{ + readonly actions?: JSX.Element; + readonly person: { + readonly name: string; + readonly age: number + }; + readonly children: React.ReactNode; + readonly renderMe: React.ComponentType<{ + readonly randomString: string; + readonly poly: any + }> +}>; // tslint:disable-next-line:no-var-requires const JSXV4BS = require('./JSXV4.bs'); diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 0d6d5660e4..62a6507b6e 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240372,6 +240372,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName retType; } as function_) when retType |> EmitType.isTypeFunctionComponent ~fields -> + (* JSX V3 *) let componentName = match importFile with "." | ".." -> None | _ -> Some importFile in @@ -240392,6 +240393,43 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName } in Function { function_ with componentName } + | Function + ({ + argTypes = [ { aType = Ident { name } as propsType; aName } ]; + retType; + } as function_) + when Filename.check_suffix name "props" + && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> ( + let _ = function_ in + let _ = propsType in + match typeGetInlined propsType with + | Object (closedFlags, fields) -> + (* JSX V3 *) + let componentName = + match importFile with + | "." | ".." -> None + | _ -> Some importFile + in + let fields = + Ext_list.filter_map fields (fun (field : field) -> + match field.nameJS with + | "children" + when field.type_ |> EmitType.isTypeReactElement -> + Some { field with type_ = EmitType.typeReactChild } + | "key" -> + (* Filter out key, which is added to the props type definition in V4 *) + None + | _ -> Some field) + in + let function_ = + { + function_ with + argTypes = + [ { aType = Object (closedFlags, fields); aName } ]; + } + in + Function { function_ with componentName } + | _ -> type_) | _ -> type_ in let converter = type_ |> typeGetConverter in From f067a9f1d368e18e23ee48af34c190ace9ce9ecb Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 08:44:04 +0200 Subject: [PATCH 11/18] Less aggressive type inlining. --- jscomp/gentype/EmitJs.ml | 24 ++++++++++------ .../src/JSXV4.gen.tsx | 28 ++++++------------- lib/4.06.1/whole_compiler.ml | 24 ++++++++++------ 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index bd301a9431..5c12c049a2 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -124,8 +124,8 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized ~typeNameIsInterface) (env, emitters) -let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined +let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" @@ -190,9 +190,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName } as function_) when Filename.check_suffix name "props" && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> ( - let _ = function_ in - let _ = propsType in - match typeGetInlined propsType with + match expandOneLevel propsType with | Object (closedFlags, fields) -> (* JSX V3 *) let componentName = @@ -421,14 +419,14 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in (envWithRequires, emitters) -and emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~typeGetInlined +let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) @@ -727,10 +725,18 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations ~typeGetNormalized:(typeGetNormalized_ ~env) ~env ~typeNameIsInterface:(typeNameIsInterface ~env) in + let expandOneLevel type_ = + match type_ with + | Ident { builtin = false; name } -> ( + match name |> lookupId_ ~env with + | (t : CodeItem.exportTypeItem) -> t.type_ + | exception Not_found -> type_) + | _ -> type_ + in let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetInlined:(typeGetInlined_ ~env) + ~outputFileRelative ~resolver ~expandOneLevel ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index 910a303b63..cb439cc7d4 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -8,30 +8,18 @@ import * as React from 'react'; // In case of type error, check the type of 'make' in 'JSXV4.re' and './hookExample'. export const makeTypeChecked: React.ComponentType<{ - readonly actions?: JSX.Element; - readonly person: { - readonly name: string; - readonly age: number - }; - readonly children: React.ReactNode; - readonly renderMe: React.ComponentType<{ - readonly randomString: string; - readonly poly: any - }> + readonly actions?: actions; + readonly person: person; + readonly children: children; + readonly renderMe: renderMe }> = makeNotChecked; // Export 'make' early to allow circular import from the '.bs.js' file. export const make: unknown = makeTypeChecked as React.ComponentType<{ - readonly actions?: JSX.Element; - readonly person: { - readonly name: string; - readonly age: number - }; - readonly children: React.ReactNode; - readonly renderMe: React.ComponentType<{ - readonly randomString: string; - readonly poly: any - }> + readonly actions?: actions; + readonly person: person; + readonly children: children; + readonly renderMe: renderMe }>; // tslint:disable-next-line:no-var-requires diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 62a6507b6e..70cb498d36 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240334,8 +240334,8 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized ~typeNameIsInterface) (env, emitters) -let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined +let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" @@ -240400,9 +240400,7 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName } as function_) when Filename.check_suffix name "props" && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> ( - let _ = function_ in - let _ = propsType in - match typeGetInlined propsType with + match expandOneLevel propsType with | Object (closedFlags, fields) -> (* JSX V3 *) let componentName = @@ -240631,14 +240629,14 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName in (envWithRequires, emitters) -and emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~typeGetInlined +let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) @@ -240937,10 +240935,18 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations ~typeGetNormalized:(typeGetNormalized_ ~env) ~env ~typeNameIsInterface:(typeNameIsInterface ~env) in + let expandOneLevel type_ = + match type_ with + | Ident { builtin = false; name } -> ( + match name |> lookupId_ ~env with + | (t : CodeItem.exportTypeItem) -> t.type_ + | exception Not_found -> type_) + | _ -> type_ + in let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetInlined:(typeGetInlined_ ~env) + ~outputFileRelative ~resolver ~expandOneLevel ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables From 3b97acd8865c6506a1ad66147003211ee2dfe13f Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 08:53:58 +0200 Subject: [PATCH 12/18] Do instantiate type args. --- jscomp/gentype/EmitJs.ml | 32 +++++++++++++------ .../src/JSXV4.gen.tsx | 12 +++---- lib/4.06.1/whole_compiler.ml | 32 +++++++++++++------ 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index 5c12c049a2..9ddbcca590 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -125,8 +125,9 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized (env, emitters) let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined - ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables + codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" (codeItem |> codeItemToString ~config ~typeNameIsInterface); @@ -420,14 +421,15 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName (envWithRequires, emitters) let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel ~typeGetInlined - ~typeGetNormalized ~variantTables codeItems = + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel + ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined - ~typeGetNormalized ~typeNameIsInterface ~variantTables) + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface + ~variantTables) (env, emitters) let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters = @@ -727,16 +729,28 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations in let expandOneLevel type_ = match type_ with - | Ident { builtin = false; name } -> ( + | Ident { builtin = false; name; typeArgs } -> ( match name |> lookupId_ ~env with - | (t : CodeItem.exportTypeItem) -> t.type_ + | { type_; typeVars } -> + let pairs = + try List.combine typeVars typeArgs with Invalid_argument _ -> [] + in + let f typeVar = + match + pairs |> List.find (fun (typeVar1, _) -> typeVar = typeVar1) + with + | _, typeArgument -> Some typeArgument + | exception Not_found -> None + in + type_ |> TypeVars.substitute ~f | exception Not_found -> type_) | _ -> type_ in let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~expandOneLevel ~typeGetInlined:(typeGetInlined_ ~env) + ~outputFileRelative ~resolver ~expandOneLevel + ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables diff --git a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx index cb439cc7d4..fe1b67a982 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx @@ -8,18 +8,18 @@ import * as React from 'react'; // In case of type error, check the type of 'make' in 'JSXV4.re' and './hookExample'. export const makeTypeChecked: React.ComponentType<{ - readonly actions?: actions; + readonly actions?: JSX.Element; readonly person: person; - readonly children: children; - readonly renderMe: renderMe + readonly children: React.ReactNode; + readonly renderMe: renderMe }> = makeNotChecked; // Export 'make' early to allow circular import from the '.bs.js' file. export const make: unknown = makeTypeChecked as React.ComponentType<{ - readonly actions?: actions; + readonly actions?: JSX.Element; readonly person: person; - readonly children: children; - readonly renderMe: renderMe + readonly children: React.ReactNode; + readonly renderMe: renderMe }>; // tslint:disable-next-line:no-var-requires diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 70cb498d36..281a0e884f 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240335,8 +240335,9 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized (env, emitters) let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined - ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables + codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" (codeItem |> codeItemToString ~config ~typeNameIsInterface); @@ -240630,14 +240631,15 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName (envWithRequires, emitters) let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel ~typeGetInlined - ~typeGetNormalized ~variantTables codeItems = + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel + ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel ~typeGetInlined - ~typeGetNormalized ~typeNameIsInterface ~variantTables) + ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface + ~variantTables) (env, emitters) let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters = @@ -240937,16 +240939,28 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations in let expandOneLevel type_ = match type_ with - | Ident { builtin = false; name } -> ( + | Ident { builtin = false; name; typeArgs } -> ( match name |> lookupId_ ~env with - | (t : CodeItem.exportTypeItem) -> t.type_ + | { type_; typeVars } -> + let pairs = + try List.combine typeVars typeArgs with Invalid_argument _ -> [] + in + let f typeVar = + match + pairs |> List.find (fun (typeVar1, _) -> typeVar = typeVar1) + with + | _, typeArgument -> Some typeArgument + | exception Not_found -> None + in + type_ |> TypeVars.substitute ~f | exception Not_found -> type_) | _ -> type_ in let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~expandOneLevel ~typeGetInlined:(typeGetInlined_ ~env) + ~outputFileRelative ~resolver ~expandOneLevel + ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables From 53797e8dbc21e481e7fc5e12fc9cd87a95816ad0 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 08:55:26 +0200 Subject: [PATCH 13/18] rename --- jscomp/gentype/EmitJs.ml | 12 ++++++------ lib/4.06.1/whole_compiler.ml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index 9ddbcca590..b088a20e61 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -125,7 +125,7 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized (env, emitters) let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then @@ -191,7 +191,7 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName } as function_) when Filename.check_suffix name "props" && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> ( - match expandOneLevel propsType with + match inlineOneLevel propsType with | Object (closedFlags, fields) -> (* JSX V3 *) let componentName = @@ -421,13 +421,13 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName (envWithRequires, emitters) let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~inlineOneLevel ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) @@ -727,7 +727,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations ~typeGetNormalized:(typeGetNormalized_ ~env) ~env ~typeNameIsInterface:(typeNameIsInterface ~env) in - let expandOneLevel type_ = + let inlineOneLevel type_ = match type_ with | Ident { builtin = false; name; typeArgs } -> ( match name |> lookupId_ ~env with @@ -749,7 +749,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~expandOneLevel + ~outputFileRelative ~resolver ~inlineOneLevel ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index 281a0e884f..b7fb2327da 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240335,7 +240335,7 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized (env, emitters) let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then @@ -240401,7 +240401,7 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName } as function_) when Filename.check_suffix name "props" && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> ( - match expandOneLevel propsType with + match inlineOneLevel propsType with | Object (closedFlags, fields) -> (* JSX V3 *) let componentName = @@ -240631,13 +240631,13 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName (envWithRequires, emitters) let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env - ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~expandOneLevel + ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~inlineOneLevel ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~typeGetConverter ~expandOneLevel + ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) @@ -240937,7 +240937,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations ~typeGetNormalized:(typeGetNormalized_ ~env) ~env ~typeNameIsInterface:(typeNameIsInterface ~env) in - let expandOneLevel type_ = + let inlineOneLevel type_ = match type_ with | Ident { builtin = false; name; typeArgs } -> ( match name |> lookupId_ ~env with @@ -240959,7 +240959,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations let env, emitters = translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName - ~outputFileRelative ~resolver ~expandOneLevel + ~outputFileRelative ~resolver ~inlineOneLevel ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) From 18ed30168b998e90cae13545e89258ed04b88479 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 08:58:06 +0200 Subject: [PATCH 14/18] Remove unused `typeGetInlined`. --- jscomp/gentype/EmitJs.ml | 12 ++++-------- lib/4.06.1/whole_compiler.ml | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/jscomp/gentype/EmitJs.ml b/jscomp/gentype/EmitJs.ml index b088a20e61..8a939ff3af 100644 --- a/jscomp/gentype/EmitJs.ml +++ b/jscomp/gentype/EmitJs.ml @@ -126,8 +126,7 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel - ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables - codeItem = + ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" (codeItem |> codeItemToString ~config ~typeNameIsInterface); @@ -349,7 +348,7 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName when Filename.check_suffix name "props" && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> let compType = - match typeGetInlined propsType with + match inlineOneLevel propsType with | Object (closedFlags, fields) -> (* JSX V4 *) let propsType = @@ -422,14 +421,13 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~inlineOneLevel - ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = + ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel - ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface - ~variantTables) + ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters = @@ -705,7 +703,6 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations ~typeNameIsInterface:(typeNameIsInterface ~env) in let typeGetNormalized_ = typeGetNormalized__ ~inline:false in - let typeGetInlined_ = typeGetNormalized__ ~inline:true in let typeGetConverter_ ~env type_ = type_ |> Converter.typeGetConverter ~config ~lookupId:(lookupId_ ~env) @@ -750,7 +747,6 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName ~outputFileRelative ~resolver ~inlineOneLevel - ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables diff --git a/lib/4.06.1/whole_compiler.ml b/lib/4.06.1/whole_compiler.ml index b7fb2327da..3d3693dda7 100644 --- a/lib/4.06.1/whole_compiler.ml +++ b/lib/4.06.1/whole_compiler.ml @@ -240336,8 +240336,7 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel - ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface ~variantTables - codeItem = + ~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem = if !Debug.codeItems then Log_.item "Code Item: %s\n" (codeItem |> codeItemToString ~config ~typeNameIsInterface); @@ -240559,7 +240558,7 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName when Filename.check_suffix name "props" && retType |> EmitType.isTypeFunctionComponent ~fields:[] -> let compType = - match typeGetInlined propsType with + match inlineOneLevel propsType with | Object (closedFlags, fields) -> (* JSX V4 *) let propsType = @@ -240632,14 +240631,13 @@ let emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName let emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env ~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~inlineOneLevel - ~typeGetInlined ~typeGetNormalized ~variantTables codeItems = + ~typeGetNormalized ~variantTables codeItems = codeItems |> List.fold_left (fun (env, emitters) -> emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName ~outputFileRelative ~resolver ~typeGetConverter ~inlineOneLevel - ~typeGetInlined ~typeGetNormalized ~typeNameIsInterface - ~variantTables) + ~typeGetNormalized ~typeNameIsInterface ~variantTables) (env, emitters) let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters = @@ -240915,7 +240913,6 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations ~typeNameIsInterface:(typeNameIsInterface ~env) in let typeGetNormalized_ = typeGetNormalized__ ~inline:false in - let typeGetInlined_ = typeGetNormalized__ ~inline:true in let typeGetConverter_ ~env type_ = type_ |> Converter.typeGetConverter ~config ~lookupId:(lookupId_ ~env) @@ -240960,7 +240957,6 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations translation.codeItems |> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName ~outputFileRelative ~resolver ~inlineOneLevel - ~typeGetInlined:(typeGetInlined_ ~env) ~typeGetNormalized:(typeGetNormalized_ ~env) ~typeGetConverter:(typeGetConverter_ ~env) ~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables From 608d53e59182302a87dfb6b39cb218fd9d643bf1 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Thu, 21 Jul 2022 09:19:38 +0200 Subject: [PATCH 15/18] Run genType test project with V4. --- jscomp/gentype_tests/typescript-react-example/bsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscomp/gentype_tests/typescript-react-example/bsconfig.json b/jscomp/gentype_tests/typescript-react-example/bsconfig.json index b303724d71..de43968009 100644 --- a/jscomp/gentype_tests/typescript-react-example/bsconfig.json +++ b/jscomp/gentype_tests/typescript-react-example/bsconfig.json @@ -16,7 +16,7 @@ }, "name": "sample-typescript-app", "bsc-flags": ["-bs-super-errors"], - "jsx": { "version": 3 }, + "jsx": { "version": 4 }, "bs-dependencies": ["@rescript/react"], "sources": [ { From 28d7156a51a6822d0a4ccd168777dce1cbf11b2a Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Fri, 22 Jul 2022 06:53:39 +0200 Subject: [PATCH 16/18] Use latest syntax. --- .../src/DynamicallyLoadedComponent.bs.js | 4 +- .../src/ExportWithRename.bs.js | 4 +- .../src/ExportWithRename.gen.tsx | 6 +- .../typescript-react-example/src/Hooks.bs.js | 86 ++++----- .../src/Hooks.gen.tsx | 176 +++++++++--------- .../src/ImportHookDefault.gen.tsx | 40 ++-- .../src/ImportHooks.gen.tsx | 23 ++- .../src/ImportIndex.gen.tsx | 7 +- .../src/MyInput.gen.tsx | 7 +- .../src/OnClick2.bs.js | 5 +- .../src/OnClick2.gen.tsx | 6 +- 11 files changed, 175 insertions(+), 189 deletions(-) diff --git a/jscomp/gentype_tests/typescript-react-example/src/DynamicallyLoadedComponent.bs.js b/jscomp/gentype_tests/typescript-react-example/src/DynamicallyLoadedComponent.bs.js index 9eb45eebb7..37002518c2 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/DynamicallyLoadedComponent.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/DynamicallyLoadedComponent.bs.js @@ -1,8 +1,8 @@ // Generated by ReScript, PLEASE EDIT WITH CARE -function DynamicallyLoadedComponent(Props) { - return Props.s; +function DynamicallyLoadedComponent(props) { + return props.s; } var make = DynamicallyLoadedComponent; diff --git a/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.bs.js b/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.bs.js index 41537fe199..9687ab9dc2 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.bs.js @@ -1,8 +1,8 @@ // Generated by ReScript, PLEASE EDIT WITH CARE -function ExportWithRename(Props) { - return Props.s; +function ExportWithRename(props) { + return props.s; } var make = ExportWithRename; diff --git a/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx index 7b7416701c..b1fa0b4244 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx @@ -2,13 +2,11 @@ /* eslint-disable import/first */ -import * as React from 'react'; - // @ts-ignore: Implicit any on import import * as ExportWithRenameBS__Es6Import from './ExportWithRename.bs'; const ExportWithRenameBS: any = ExportWithRenameBS__Es6Import; // tslint:disable-next-line:interface-over-type-literal -export type Props = { readonly s: string }; +export type props = { readonly key?: string; readonly s: s }; -export const ExportWithRename: React.ComponentType<{ readonly s: string }> = ExportWithRenameBS.make; +export const ExportWithRename: (_1:props) => JSX.Element = ExportWithRenameBS.make; diff --git a/jscomp/gentype_tests/typescript-react-example/src/Hooks.bs.js b/jscomp/gentype_tests/typescript-react-example/src/Hooks.bs.js index 500bcd5c7d..edd4362246 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/Hooks.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/Hooks.bs.js @@ -5,14 +5,13 @@ import * as React from "react"; import * as ImportHooks from "./ImportHooks.bs.js"; import * as ImportHookDefault from "./ImportHookDefault.bs.js"; -function Hooks(Props) { - var vehicle = Props.vehicle; +function Hooks(props) { var match = React.useState(function () { return 0; }); var setCount = match[1]; var count = match[0]; - return React.createElement("div", undefined, React.createElement("p", undefined, "Hooks example " + (vehicle.name + (" clicked " + (String(count) + " times")))), React.createElement("button", { + return React.createElement("div", undefined, React.createElement("p", undefined, "Hooks example " + (props.vehicle.name + (" clicked " + (String(count) + " times")))), React.createElement("button", { onClick: (function (param) { Curry._1(setCount, (function (param) { return count + 1 | 0; @@ -39,39 +38,33 @@ function Hooks(Props) { }, "child1", "child2")); } -function Hooks$Another$anotherComponent(Props) { - var vehicle = Props.vehicle; - var callback = Props.callback; - Curry._1(callback, undefined); - return React.createElement("div", undefined, "Another Hook " + vehicle.name); +function Hooks$Another$anotherComponent(props) { + Curry._1(props.callback, undefined); + return React.createElement("div", undefined, "Another Hook " + props.vehicle.name); } var Another = { anotherComponent: Hooks$Another$anotherComponent }; -function Hooks$Inner(Props) { - var vehicle = Props.vehicle; - return React.createElement("div", undefined, "Another Hook " + vehicle.name); +function Hooks$Inner(props) { + return React.createElement("div", undefined, "Another Hook " + props.vehicle.name); } -function Hooks$Inner$Another$anotherComponent(Props) { - var vehicle = Props.vehicle; - return React.createElement("div", undefined, "Another Hook " + vehicle.name); +function Hooks$Inner$Another$anotherComponent(props) { + return React.createElement("div", undefined, "Another Hook " + props.vehicle.name); } var Another$1 = { anotherComponent: Hooks$Inner$Another$anotherComponent }; -function Hooks$Inner$Inner2(Props) { - var vehicle = Props.vehicle; - return React.createElement("div", undefined, "Another Hook " + vehicle.name); +function Hooks$Inner$Inner2(props) { + return React.createElement("div", undefined, "Another Hook " + props.vehicle.name); } -function Hooks$Inner$Inner2$Another$anotherComponent(Props) { - var vehicle = Props.vehicle; - return React.createElement("div", undefined, "Another Hook " + vehicle.name); +function Hooks$Inner$Inner2$Another$anotherComponent(props) { + return React.createElement("div", undefined, "Another Hook " + props.vehicle.name); } var Another$2 = { @@ -89,7 +82,7 @@ var Inner = { Inner2: Inner2 }; -function Hooks$NoProps(Props) { +function Hooks$NoProps(props) { return React.createElement("div", undefined, null); } @@ -102,19 +95,18 @@ function functionWithRenamedArgs(_to, _Type, cb) { return _to.name + _Type.name; } -function Hooks$WithRename$componentWithRenamedArgs(Props) { - var _to = Props.to; - var _Type = Props.Type; - var cb = Props.cb; - Curry._1(cb, _to); - return _to.name + _Type.name; +function Hooks$WithRename$componentWithRenamedArgs(props) { + var _to = props._to; + Curry._1(props.cb, _to); + return _to.name + props._Type.name; } var WithRename = { componentWithRenamedArgs: Hooks$WithRename$componentWithRenamedArgs }; -function makeWithRef(vehicle) { +function makeWithRef(param) { + var vehicle = param.vehicle; return function (ref) { if (ref == null) { return null; @@ -126,49 +118,44 @@ function makeWithRef(vehicle) { }; } -function Hooks$WithRef$makeWithRef(Props) { - return makeWithRef(Props.vehicle); -} +var Hooks$WithRef$makeWithRef = makeWithRef; var WithRef = { makeWithRef: Hooks$WithRef$makeWithRef }; var testForwardRef = React.forwardRef(function (param, param$1) { - return makeWithRef(param.vehicle)(param$1); + return makeWithRef(param)(param$1); }); -var input = React.forwardRef(function (Props, param) { - var partial_arg = Props.r; +var input = React.forwardRef(function (props, ref) { return React.createElement("div", { - ref: param - }, partial_arg.x); + ref: ref + }, props.r.x); }); var ForwardRef = { input: input }; -function Hooks$Poly$polymorphicComponent(Props) { - var param = Props.p; - return param[0].name; +function Hooks$Poly$polymorphicComponent(props) { + return props.p[0].name; } var Poly = { polymorphicComponent: Hooks$Poly$polymorphicComponent }; -function Hooks$Fun$functionReturningReactElement(Props) { - return Props.name; +function Hooks$Fun$functionReturningReactElement(props) { + return props.name; } var Fun = { functionReturningReactElement: Hooks$Fun$functionReturningReactElement }; -function Hooks$RenderPropRequiresConversion(Props) { - var renderVehicle = Props.renderVehicle; - return Curry._1(renderVehicle, { +function Hooks$RenderPropRequiresConversion(props) { + return Curry._1(props.renderVehicle, { vehicle: { name: "Car" }, @@ -180,19 +167,16 @@ var RenderPropRequiresConversion = { make: Hooks$RenderPropRequiresConversion }; -function Hooks$WithChildren$aComponentWithChildren(Props) { - var vehicle = Props.vehicle; - var children = Props.children; - return React.createElement("div", undefined, "Another Hook " + vehicle.name, React.createElement("div", undefined, children)); +function Hooks$WithChildren$aComponentWithChildren(props) { + return React.createElement("div", undefined, "Another Hook " + props.vehicle.name, React.createElement("div", undefined, props.children)); } var WithChildren = { aComponentWithChildren: Hooks$WithChildren$aComponentWithChildren }; -function Hooks$DD(Props) { - var name = Props.name; - return name; +function Hooks$DD(props) { + return props.name; } var DD = { diff --git a/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx index 8ace239838..2128b4d1a3 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx @@ -2,8 +2,6 @@ /* eslint-disable import/first */ -import * as React from 'react'; - // @ts-ignore: Implicit any on import import * as Curry__Es6Import from 'rescript/lib/es6/curry.js'; const Curry: any = Curry__Es6Import; @@ -17,12 +15,55 @@ import type {TypedArray2_Uint8Array_t as Js_TypedArray2_Uint8Array_t} from '../s // tslint:disable-next-line:interface-over-type-literal export type vehicle = { readonly name: string }; +// tslint:disable-next-line:interface-over-type-literal +export type props = { readonly key?: string; readonly vehicle: vehicle }; + +// tslint:disable-next-line:interface-over-type-literal +export type Another_props = { + readonly key?: string; + readonly vehicle: vehicle; + readonly callback: callback +}; + +// tslint:disable-next-line:interface-over-type-literal +export type Inner_props = { readonly key?: string; readonly vehicle: vehicle }; + +// tslint:disable-next-line:interface-over-type-literal +export type Inner_Another_props = { readonly key?: string; readonly vehicle: vehicle }; + +// tslint:disable-next-line:interface-over-type-literal +export type Inner_Inner2_props = { readonly key?: string; readonly vehicle: vehicle }; + +// tslint:disable-next-line:interface-over-type-literal +export type Inner_Inner2_Another_props = { readonly key?: string; readonly vehicle: vehicle }; + +// tslint:disable-next-line:interface-over-type-literal +export type NoProps_props = { readonly key?: string }; + // tslint:disable-next-line:interface-over-type-literal export type cb = (_1:{ readonly to: vehicle }) => void; +// tslint:disable-next-line:interface-over-type-literal +export type WithRename_props = { + readonly key?: string; + readonly _to: T_to; + readonly _Type: T_Type; + readonly cb: cb +}; + +// tslint:disable-next-line:interface-over-type-literal +export type WithRef_props = { readonly key?: string; readonly vehicle: vehicle }; + // tslint:disable-next-line:interface-over-type-literal export type r = { readonly x: string }; +// tslint:disable-next-line:interface-over-type-literal +export type ForwardRef_props = { + readonly key?: string; + readonly ref?: any; + readonly r: r +}; + // tslint:disable-next-line:interface-over-type-literal export type callback = (_1:input) => output; @@ -39,41 +80,43 @@ export type testDomRef = React.Ref; export type testDomRef2 = React.Ref; // tslint:disable-next-line:interface-over-type-literal -export type Props = { readonly vehicle: vehicle }; - -export const $$default: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.default; - -export default $$default; +export type Poly_props
optionMap(x => x)} /> + } +} \ No newline at end of file From e3b6c6e94ec5ffc8b617c49755e39524709289bd Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Wed, 31 Aug 2022 09:15:47 +0200 Subject: [PATCH 18/18] Rebase on top of https://github.com/rescript-lang/rescript-compiler/pull/5619 --- .../src/ExportWithRename.gen.tsx | 2 +- .../src/Hooks.gen.tsx | 73 +++++++++++-------- .../src/ImportHookDefault.gen.tsx | 24 +++++- .../src/ImportHooks.gen.tsx | 14 +++- .../src/ImportIndex.gen.tsx | 4 +- .../src/MyInput.gen.tsx | 4 +- .../src/OnClick2.gen.tsx | 2 +- 7 files changed, 82 insertions(+), 41 deletions(-) diff --git a/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx index b1fa0b4244..95d21e97f5 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ExportWithRename.gen.tsx @@ -9,4 +9,4 @@ const ExportWithRenameBS: any = ExportWithRenameBS__Es6Import; // tslint:disable-next-line:interface-over-type-literal export type props = { readonly key?: string; readonly s: s }; -export const ExportWithRename: (_1:props) => JSX.Element = ExportWithRenameBS.make; +export const ExportWithRename: React.ComponentType<{ readonly s: string }> = ExportWithRenameBS.make; diff --git a/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx index 2128b4d1a3..134ad887fd 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/Hooks.gen.tsx @@ -2,6 +2,8 @@ /* eslint-disable import/first */ +import * as React from 'react'; + // @ts-ignore: Implicit any on import import * as Curry__Es6Import from 'rescript/lib/es6/curry.js'; const Curry: any = Curry__Es6Import; @@ -102,21 +104,21 @@ export type DD_props = { readonly name: name }; -export const $$default: (_1:props) => JSX.Element = HooksBS.default; +export const $$default: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.default; export default $$default; -export const Another_anotherComponent: (_1:Another_props void)>) => JSX.Element = HooksBS.Another.anotherComponent; +export const Another_anotherComponent: React.ComponentType<{ readonly vehicle: vehicle; readonly callback: () => void }> = HooksBS.Another.anotherComponent; -export const Inner_make: (_1:Inner_props) => JSX.Element = HooksBS.Inner.make; +export const Inner_make: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.make; -export const Inner_Another_anotherComponent: (_1:Inner_Another_props) => JSX.Element = HooksBS.Inner.Another.anotherComponent; +export const Inner_Another_anotherComponent: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.Another.anotherComponent; -export const Inner_Inner2_make: (_1:Inner_Inner2_props) => JSX.Element = HooksBS.Inner.Inner2.make; +export const Inner_Inner2_make: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.Inner2.make; -export const Inner_Inner2_Another_anotherComponent: (_1:Inner_Inner2_Another_props) => JSX.Element = HooksBS.Inner.Inner2.Another.anotherComponent; +export const Inner_Inner2_Another_anotherComponent: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.Inner2.Another.anotherComponent; -export const NoProps_make: (_1:NoProps_props) => JSX.Element = HooksBS.NoProps.make; +export const NoProps_make: React.ComponentType<{}> = HooksBS.NoProps.make; export const functionWithRenamedArgs: (_1:{ readonly to: vehicle; @@ -130,11 +132,16 @@ export const functionWithRenamedArgs: (_1:{ return result }; -export const WithRename_componentWithRenamedArgs: (_1:WithRename_props) => JSX.Element = function (Arg1: any) { - const result = HooksBS.WithRename.componentWithRenamedArgs({key:Arg1.key, _to:Arg1._to, _Type:Arg1._Type, cb:function (Argto: any) { +export const WithRename_componentWithRenamedArgs: React.ComponentType<{ + readonly _to: vehicle; + readonly _Type: vehicle; + readonly cb: cb +}> = function Hooks_WithRename_componentWithRenamedArgs(Arg1: any) { + const $props = {_to:Arg1._to, _Type:Arg1._Type, cb:function (Argto: any) { const result1 = Arg1.cb({to:Argto}); return result1 - }}); + }}; + const result = React.createElement(HooksBS.WithRename.componentWithRenamedArgs, $props); return result }; @@ -143,45 +150,53 @@ export const WithRef_makeWithRef: (_1:WithRef_props, _2:(null | undefin return result }; -export const testForwardRef: (_1:WithRef_props) => JSX.Element = HooksBS.testForwardRef; +export const testForwardRef: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.testForwardRef; -export const ForwardRef_input: (_1:ForwardRef_props) => JSX.Element = HooksBS.ForwardRef.input; +export const ForwardRef_input: React.ComponentType<{ readonly ref?: any; readonly r: r }> = HooksBS.ForwardRef.input; -export const Poly_polymorphicComponent: (_1:Poly_props<[vehicle, T1]>) => JSX.Element = HooksBS.Poly.polymorphicComponent; +export const Poly_polymorphicComponent: React.ComponentType<{ readonly p: [vehicle, any] }> = HooksBS.Poly.polymorphicComponent; -export const Fun_functionReturningReactElement: (_1:Fun_props) => JSX.Element = HooksBS.Fun.functionReturningReactElement; +export const Fun_functionReturningReactElement: React.ComponentType<{ readonly name: string }> = HooksBS.Fun.functionReturningReactElement; -export const RenderPropRequiresConversion_make: (_1:RenderPropRequiresConversion_props>) => JSX.Element = HooksBS.RenderPropRequiresConversion.make; +export const RenderPropRequiresConversion_make: React.ComponentType<{ readonly renderVehicle: React.ComponentType<{ readonly number: number; readonly vehicle: vehicle }> }> = HooksBS.RenderPropRequiresConversion.make; -export const WithChildren_aComponentWithChildren: (_1:WithChildren_props) => JSX.Element = HooksBS.WithChildren.aComponentWithChildren; +export const WithChildren_aComponentWithChildren: React.ComponentType<{ readonly vehicle: vehicle; readonly children: React.ReactNode }> = HooksBS.WithChildren.aComponentWithChildren; -export const DD_make: (_1:DD_props) => JSX.Element = HooksBS.DD.make; +export const DD_make: React.ComponentType<{ readonly array: Js_TypedArray2_Uint8Array_t; readonly name: string }> = HooksBS.DD.make; -export const NoProps: { make: (_1:NoProps_props) => JSX.Element } = HooksBS.NoProps +export const NoProps: { make: React.ComponentType<{}> } = HooksBS.NoProps export const Inner: { Inner2: { Another: { - anotherComponent: (_1:Inner_Inner2_Another_props) => JSX.Element + anotherComponent: React.ComponentType<{ + readonly vehicle: vehicle + }> }; - make: (_1:Inner_Inner2_props) => JSX.Element + make: React.ComponentType<{ + readonly vehicle: vehicle + }> }; Another: { - anotherComponent: (_1:Inner_Another_props) => JSX.Element + anotherComponent: React.ComponentType<{ + readonly vehicle: vehicle + }> }; - make: (_1:Inner_props) => JSX.Element + make: React.ComponentType<{ + readonly vehicle: vehicle + }> } = HooksBS.Inner -export const RenderPropRequiresConversion: { make: (_1:RenderPropRequiresConversion_props>) => JSX.Element } = HooksBS.RenderPropRequiresConversion +export const RenderPropRequiresConversion: { make: React.ComponentType<{ readonly renderVehicle: React.ComponentType<{ readonly number: number; readonly vehicle: vehicle }> }> } = HooksBS.RenderPropRequiresConversion -export const ForwardRef: { input: (_1:ForwardRef_props) => JSX.Element } = HooksBS.ForwardRef +export const ForwardRef: { input: React.ComponentType<{ readonly ref?: any; readonly r: r }> } = HooksBS.ForwardRef -export const Fun: { functionReturningReactElement: (_1:Fun_props) => JSX.Element } = HooksBS.Fun +export const Fun: { functionReturningReactElement: React.ComponentType<{ readonly name: string }> } = HooksBS.Fun -export const WithChildren: { aComponentWithChildren: (_1:WithChildren_props) => JSX.Element } = HooksBS.WithChildren +export const WithChildren: { aComponentWithChildren: React.ComponentType<{ readonly vehicle: vehicle; readonly children: React.ReactNode }> } = HooksBS.WithChildren -export const DD: { make: (_1:DD_props) => JSX.Element } = HooksBS.DD +export const DD: { make: React.ComponentType<{ readonly array: Js_TypedArray2_Uint8Array_t; readonly name: string }> } = HooksBS.DD -export const Another: { anotherComponent: (_1:Another_props void)>) => JSX.Element } = HooksBS.Another +export const Another: { anotherComponent: React.ComponentType<{ readonly vehicle: vehicle; readonly callback: () => void }> } = HooksBS.Another -export const Poly: { polymorphicComponent: (_1:Poly_props<[vehicle, T1]>) => JSX.Element } = HooksBS.Poly +export const Poly: { polymorphicComponent: React.ComponentType<{ readonly p: [vehicle, any] }> } = HooksBS.Poly diff --git a/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx index 799282116e..a85256ed51 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx @@ -7,16 +7,32 @@ import {default as makeNotChecked} from './hookExample'; import {default as defaultNotChecked} from './hookExample'; // In case of type error, check the type of 'make' in 'ImportHookDefault.re' and './hookExample'. -export const makeTypeChecked: (_1:props>) => JSX.Element = makeNotChecked; +export const makeTypeChecked: React.ComponentType<{ + readonly person: person; + readonly children: React.ReactNode; + readonly renderMe: ImportHooks_renderMe +}> = makeNotChecked; // Export 'make' early to allow circular import from the '.bs.js' file. -export const make: unknown = makeTypeChecked as (_1:props>) => JSX.Element; +export const make: unknown = makeTypeChecked as React.ComponentType<{ + readonly person: person; + readonly children: React.ReactNode; + readonly renderMe: ImportHooks_renderMe +}>; // In case of type error, check the type of 'default' in 'ImportHookDefault.re' and './hookExample'. -export const defaultTypeChecked: (_1:MM_props>) => JSX.Element = defaultNotChecked; +export const defaultTypeChecked: React.ComponentType<{ + readonly person: person; + readonly children: React.ReactNode; + readonly renderMe: ImportHooks_renderMe +}> = defaultNotChecked; // Export '$$default' early to allow circular import from the '.bs.js' file. -export const $$default: unknown = defaultTypeChecked as (_1:MM_props>) => JSX.Element; +export const $$default: unknown = defaultTypeChecked as React.ComponentType<{ + readonly person: person; + readonly children: React.ReactNode; + readonly renderMe: ImportHooks_renderMe +}>; import type {renderMe as ImportHooks_renderMe} from './ImportHooks.gen'; diff --git a/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx index 56f58a74b1..d9954678bd 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx @@ -7,10 +7,20 @@ import {makeRenamed as makeRenamedNotChecked} from './hookExample'; import {foo as fooNotChecked} from './hookExample'; // In case of type error, check the type of 'makeRenamed' in 'ImportHooks.re' and './hookExample'. -export const makeRenamedTypeChecked: (_1:props>) => JSX.Element = makeRenamedNotChecked; +export const makeRenamedTypeChecked: React.ComponentType<{ + readonly actions?: JSX.Element; + readonly person: person; + readonly children: React.ReactNode; + readonly renderMe: renderMe +}> = makeRenamedNotChecked; // Export 'makeRenamed' early to allow circular import from the '.bs.js' file. -export const makeRenamed: unknown = makeRenamedTypeChecked as (_1:props>) => JSX.Element; +export const makeRenamed: unknown = makeRenamedTypeChecked as React.ComponentType<{ + readonly actions?: JSX.Element; + readonly person: person; + readonly children: React.ReactNode; + readonly renderMe: renderMe +}>; // In case of type error, check the type of 'foo' in 'ImportHooks.re' and './hookExample'. export const fooTypeChecked: (_1:{ readonly person: person }) => string = fooNotChecked; diff --git a/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx index c31f7a092e..c86c27617f 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx @@ -5,10 +5,10 @@ import {default as defaultNotChecked} from './'; // In case of type error, check the type of 'default' in 'ImportIndex.re' and './'. -export const defaultTypeChecked: (_1:props<"push" | "replace">) => JSX.Element = defaultNotChecked; +export const defaultTypeChecked: React.ComponentType<{ readonly method?: "push" | "replace" }> = defaultNotChecked; // Export '$$default' early to allow circular import from the '.bs.js' file. -export const $$default: unknown = defaultTypeChecked as (_1:props<"push" | "replace">) => JSX.Element; +export const $$default: unknown = defaultTypeChecked as React.ComponentType<{ readonly method?: "push" | "replace" }>; // tslint:disable-next-line:interface-over-type-literal export type props = { readonly key?: string; readonly method?: method }; diff --git a/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx index 25a4cbffec..751355a664 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx @@ -5,10 +5,10 @@ import {default as defaultNotChecked} from './MyInput'; // In case of type error, check the type of 'default' in 'MyInput.re' and './MyInput'. -export const defaultTypeChecked: (_1:props<((_1:inputFocusEvent) => void)>) => JSX.Element = defaultNotChecked; +export const defaultTypeChecked: React.ComponentType<{ readonly onFocus?: (_1:inputFocusEvent) => void }> = defaultNotChecked; // Export '$$default' early to allow circular import from the '.bs.js' file. -export const $$default: unknown = defaultTypeChecked as (_1:props<((_1:inputFocusEvent) => void)>) => JSX.Element; +export const $$default: unknown = defaultTypeChecked as React.ComponentType<{ readonly onFocus?: (_1:inputFocusEvent) => void }>; import type {inputFocusEvent as $$inputFocusEvent} from './shims/ReactEvent.shim'; diff --git a/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx index 01d266a36c..7e5833776c 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx @@ -9,4 +9,4 @@ const OnClick2BS: any = OnClick2BS__Es6Import; // tslint:disable-next-line:interface-over-type-literal export type props = { readonly key?: string; readonly onClick: onClick }; -export const make: (_1:props<((_1:MouseEvent) => void)>) => JSX.Element = OnClick2BS.make; +export const make: React.ComponentType<{ readonly onClick: (_1:MouseEvent) => void }> = OnClick2BS.make;

= { readonly key?: string; readonly p: p }; // tslint:disable-next-line:interface-over-type-literal -export type Another_anotherComponent_Props = { readonly callback: () => void; readonly vehicle: vehicle }; - -export const Another_anotherComponent: React.ComponentType<{ readonly callback: () => void; readonly vehicle: vehicle }> = HooksBS.Another.anotherComponent; +export type Fun_props = { readonly key?: string; readonly name: name }; // tslint:disable-next-line:interface-over-type-literal -export type Inner_make_Props = { readonly vehicle: vehicle }; +export type RenderPropRequiresConversion_props = { readonly key?: string; readonly renderVehicle: renderVehicle }; -export const Inner_make: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.make; +// tslint:disable-next-line:interface-over-type-literal +export type WithChildren_props = { + readonly key?: string; + readonly vehicle: vehicle; + readonly children: children +}; // tslint:disable-next-line:interface-over-type-literal -export type Inner_Another_anotherComponent_Props = { readonly vehicle: vehicle }; +export type DD_props = { + readonly key?: string; + readonly array: array; + readonly name: name +}; -export const Inner_Another_anotherComponent: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.Another.anotherComponent; +export const $$default: (_1:props) => JSX.Element = HooksBS.default; -// tslint:disable-next-line:interface-over-type-literal -export type Inner_Inner2_make_Props = { readonly vehicle: vehicle }; +export default $$default; -export const Inner_Inner2_make: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.Inner2.make; +export const Another_anotherComponent: (_1:Another_props void)>) => JSX.Element = HooksBS.Another.anotherComponent; -// tslint:disable-next-line:interface-over-type-literal -export type Inner_Inner2_Another_anotherComponent_Props = { readonly vehicle: vehicle }; +export const Inner_make: (_1:Inner_props) => JSX.Element = HooksBS.Inner.make; -export const Inner_Inner2_Another_anotherComponent: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.Inner.Inner2.Another.anotherComponent; +export const Inner_Another_anotherComponent: (_1:Inner_Another_props) => JSX.Element = HooksBS.Inner.Another.anotherComponent; -// tslint:disable-next-line:interface-over-type-literal -export type NoProps_make_Props = {}; +export const Inner_Inner2_make: (_1:Inner_Inner2_props) => JSX.Element = HooksBS.Inner.Inner2.make; -export const NoProps_make: React.ComponentType<{}> = HooksBS.NoProps.make; +export const Inner_Inner2_Another_anotherComponent: (_1:Inner_Inner2_Another_props) => JSX.Element = HooksBS.Inner.Inner2.Another.anotherComponent; + +export const NoProps_make: (_1:NoProps_props) => JSX.Element = HooksBS.NoProps.make; export const functionWithRenamedArgs: (_1:{ readonly to: vehicle; @@ -87,99 +130,58 @@ export const functionWithRenamedArgs: (_1:{ return result }; -// tslint:disable-next-line:interface-over-type-literal -export type WithRename_componentWithRenamedArgs_Props = { - readonly Type: vehicle; - readonly to: vehicle; - readonly cb: cb -}; - -export const WithRename_componentWithRenamedArgs: React.ComponentType<{ - readonly Type: vehicle; - readonly to: vehicle; - readonly cb: cb -}> = function Hooks_WithRename_componentWithRenamedArgs(Arg1: any) { - const $props = {Type:Arg1.Type, to:Arg1.to, cb:function (Argto: any) { +export const WithRename_componentWithRenamedArgs: (_1:WithRename_props) => JSX.Element = function (Arg1: any) { + const result = HooksBS.WithRename.componentWithRenamedArgs({key:Arg1.key, _to:Arg1._to, _Type:Arg1._Type, cb:function (Argto: any) { const result1 = Arg1.cb({to:Argto}); return result1 - }}; - const result = React.createElement(HooksBS.WithRename.componentWithRenamedArgs, $props); + }}); return result }; -export const WithRef_makeWithRef: (_1:{ readonly vehicle: vehicle }, _2:(null | undefined | any)) => JSX.Element = function (Arg1: any, Arg2: any) { +export const WithRef_makeWithRef: (_1:WithRef_props, _2:(null | undefined | any)) => JSX.Element = function (Arg1: any, Arg2: any) { const result = Curry._2(HooksBS.WithRef.makeWithRef, Arg1, Arg2); return result }; -// tslint:disable-next-line:interface-over-type-literal -export type testForwardRef_Props = { readonly vehicle: vehicle }; - -export const testForwardRef: React.ComponentType<{ readonly vehicle: vehicle }> = HooksBS.testForwardRef; - -// tslint:disable-next-line:interface-over-type-literal -export type ForwardRef_input_Props = { readonly r: r }; - -export const ForwardRef_input: React.ComponentType<{ readonly r: r }> = HooksBS.ForwardRef.input; +export const testForwardRef: (_1:WithRef_props) => JSX.Element = HooksBS.testForwardRef; -// tslint:disable-next-line:interface-over-type-literal -export type Poly_polymorphicComponent_Props = { readonly p: [vehicle, T1] }; +export const ForwardRef_input: (_1:ForwardRef_props) => JSX.Element = HooksBS.ForwardRef.input; -export const Poly_polymorphicComponent: React.ComponentType<{ readonly p: [vehicle, any] }> = HooksBS.Poly.polymorphicComponent; +export const Poly_polymorphicComponent: (_1:Poly_props<[vehicle, T1]>) => JSX.Element = HooksBS.Poly.polymorphicComponent; -// tslint:disable-next-line:interface-over-type-literal -export type Fun_functionReturningReactElement_Props = { readonly name: string }; +export const Fun_functionReturningReactElement: (_1:Fun_props) => JSX.Element = HooksBS.Fun.functionReturningReactElement; -export const Fun_functionReturningReactElement: React.ComponentType<{ readonly name: string }> = HooksBS.Fun.functionReturningReactElement; +export const RenderPropRequiresConversion_make: (_1:RenderPropRequiresConversion_props>) => JSX.Element = HooksBS.RenderPropRequiresConversion.make; -// tslint:disable-next-line:interface-over-type-literal -export type RenderPropRequiresConversion_make_Props = { readonly renderVehicle: React.ComponentType<{ readonly number: number; readonly vehicle: vehicle }> }; - -export const RenderPropRequiresConversion_make: React.ComponentType<{ readonly renderVehicle: React.ComponentType<{ readonly number: number; readonly vehicle: vehicle }> }> = HooksBS.RenderPropRequiresConversion.make; - -// tslint:disable-next-line:interface-over-type-literal -export type WithChildren_aComponentWithChildren_Props = { readonly children: React.ReactNode; readonly vehicle: vehicle }; - -export const WithChildren_aComponentWithChildren: React.ComponentType<{ readonly children: React.ReactNode; readonly vehicle: vehicle }> = HooksBS.WithChildren.aComponentWithChildren; - -// tslint:disable-next-line:interface-over-type-literal -export type DD_make_Props = { readonly array: Js_TypedArray2_Uint8Array_t; readonly name: string }; +export const WithChildren_aComponentWithChildren: (_1:WithChildren_props) => JSX.Element = HooksBS.WithChildren.aComponentWithChildren; -export const DD_make: React.ComponentType<{ readonly array: Js_TypedArray2_Uint8Array_t; readonly name: string }> = HooksBS.DD.make; +export const DD_make: (_1:DD_props) => JSX.Element = HooksBS.DD.make; -export const NoProps: { make: React.ComponentType<{}> } = HooksBS.NoProps +export const NoProps: { make: (_1:NoProps_props) => JSX.Element } = HooksBS.NoProps export const Inner: { Inner2: { Another: { - anotherComponent: React.ComponentType<{ - readonly vehicle: vehicle - }> + anotherComponent: (_1:Inner_Inner2_Another_props) => JSX.Element }; - make: React.ComponentType<{ - readonly vehicle: vehicle - }> + make: (_1:Inner_Inner2_props) => JSX.Element }; Another: { - anotherComponent: React.ComponentType<{ - readonly vehicle: vehicle - }> + anotherComponent: (_1:Inner_Another_props) => JSX.Element }; - make: React.ComponentType<{ - readonly vehicle: vehicle - }> + make: (_1:Inner_props) => JSX.Element } = HooksBS.Inner -export const RenderPropRequiresConversion: { make: React.ComponentType<{ readonly renderVehicle: React.ComponentType<{ readonly number: number; readonly vehicle: vehicle }> }> } = HooksBS.RenderPropRequiresConversion +export const RenderPropRequiresConversion: { make: (_1:RenderPropRequiresConversion_props>) => JSX.Element } = HooksBS.RenderPropRequiresConversion -export const ForwardRef: { input: React.ComponentType<{ readonly r: r }> } = HooksBS.ForwardRef +export const ForwardRef: { input: (_1:ForwardRef_props) => JSX.Element } = HooksBS.ForwardRef -export const Fun: { functionReturningReactElement: React.ComponentType<{ readonly name: string }> } = HooksBS.Fun +export const Fun: { functionReturningReactElement: (_1:Fun_props) => JSX.Element } = HooksBS.Fun -export const WithChildren: { aComponentWithChildren: React.ComponentType<{ readonly children: React.ReactNode; readonly vehicle: vehicle }> } = HooksBS.WithChildren +export const WithChildren: { aComponentWithChildren: (_1:WithChildren_props) => JSX.Element } = HooksBS.WithChildren -export const DD: { make: React.ComponentType<{ readonly array: Js_TypedArray2_Uint8Array_t; readonly name: string }> } = HooksBS.DD +export const DD: { make: (_1:DD_props) => JSX.Element } = HooksBS.DD -export const Another: { anotherComponent: React.ComponentType<{ readonly callback: () => void; readonly vehicle: vehicle }> } = HooksBS.Another +export const Another: { anotherComponent: (_1:Another_props void)>) => JSX.Element } = HooksBS.Another -export const Poly: { polymorphicComponent: React.ComponentType<{ readonly p: [vehicle, any] }> } = HooksBS.Poly +export const Poly: { polymorphicComponent: (_1:Poly_props<[vehicle, T1]>) => JSX.Element } = HooksBS.Poly diff --git a/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx index 8e81e77f70..799282116e 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ImportHookDefault.gen.tsx @@ -7,36 +7,36 @@ import {default as makeNotChecked} from './hookExample'; import {default as defaultNotChecked} from './hookExample'; // In case of type error, check the type of 'make' in 'ImportHookDefault.re' and './hookExample'. -export const makeTypeChecked: React.ComponentType<{ - readonly person: person; - readonly children: React.ReactNode; - readonly renderMe: ImportHooks_renderMe -}> = makeNotChecked; +export const makeTypeChecked: (_1:props>) => JSX.Element = makeNotChecked; // Export 'make' early to allow circular import from the '.bs.js' file. -export const make: unknown = makeTypeChecked as React.ComponentType<{ - readonly person: person; - readonly children: React.ReactNode; - readonly renderMe: ImportHooks_renderMe -}>; +export const make: unknown = makeTypeChecked as (_1:props>) => JSX.Element; // In case of type error, check the type of 'default' in 'ImportHookDefault.re' and './hookExample'. -export const defaultTypeChecked: React.ComponentType<{ - readonly person: person; - readonly children: React.ReactNode; - readonly renderMe: ImportHooks_renderMe -}> = defaultNotChecked; +export const defaultTypeChecked: (_1:MM_props>) => JSX.Element = defaultNotChecked; // Export '$$default' early to allow circular import from the '.bs.js' file. -export const $$default: unknown = defaultTypeChecked as React.ComponentType<{ - readonly person: person; - readonly children: React.ReactNode; - readonly renderMe: ImportHooks_renderMe -}>; +export const $$default: unknown = defaultTypeChecked as (_1:MM_props>) => JSX.Element; import type {renderMe as ImportHooks_renderMe} from './ImportHooks.gen'; // tslint:disable-next-line:interface-over-type-literal export type person = { readonly name: string; readonly age: number }; +// tslint:disable-next-line:interface-over-type-literal +export type props = { + readonly key?: string; + readonly person: person; + readonly children: children; + readonly renderMe: renderMe +}; + +// tslint:disable-next-line:interface-over-type-literal +export type MM_props = { + readonly key?: string; + readonly person: person; + readonly children: children; + readonly renderMe: renderMe +}; + export default $$default; diff --git a/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx index 627a68e112..56f58a74b1 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ImportHooks.gen.tsx @@ -7,20 +7,10 @@ import {makeRenamed as makeRenamedNotChecked} from './hookExample'; import {foo as fooNotChecked} from './hookExample'; // In case of type error, check the type of 'makeRenamed' in 'ImportHooks.re' and './hookExample'. -export const makeRenamedTypeChecked: React.ComponentType<{ - readonly actions?: JSX.Element; - readonly person: person; - readonly children: React.ReactNode; - readonly renderMe: renderMe -}> = makeRenamedNotChecked; +export const makeRenamedTypeChecked: (_1:props>) => JSX.Element = makeRenamedNotChecked; // Export 'makeRenamed' early to allow circular import from the '.bs.js' file. -export const makeRenamed: unknown = makeRenamedTypeChecked as React.ComponentType<{ - readonly actions?: JSX.Element; - readonly person: person; - readonly children: React.ReactNode; - readonly renderMe: renderMe -}>; +export const makeRenamed: unknown = makeRenamedTypeChecked as (_1:props>) => JSX.Element; // In case of type error, check the type of 'foo' in 'ImportHooks.re' and './hookExample'. export const fooTypeChecked: (_1:{ readonly person: person }) => string = fooNotChecked; @@ -36,3 +26,12 @@ export type person = { readonly name: string; readonly age: number }; // tslint:disable-next-line:interface-over-type-literal export type renderMe = React.ComponentType<{ readonly randomString: string; readonly poly: a }>; + +// tslint:disable-next-line:interface-over-type-literal +export type props = { + readonly key?: string; + readonly actions?: actions; + readonly person: person; + readonly children: children; + readonly renderMe: renderMe +}; diff --git a/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx index d0e0fdca0c..c31f7a092e 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/ImportIndex.gen.tsx @@ -5,9 +5,12 @@ import {default as defaultNotChecked} from './'; // In case of type error, check the type of 'default' in 'ImportIndex.re' and './'. -export const defaultTypeChecked: React.ComponentType<{ readonly method?: "push" | "replace" }> = defaultNotChecked; +export const defaultTypeChecked: (_1:props<"push" | "replace">) => JSX.Element = defaultNotChecked; // Export '$$default' early to allow circular import from the '.bs.js' file. -export const $$default: unknown = defaultTypeChecked as React.ComponentType<{ readonly method?: "push" | "replace" }>; +export const $$default: unknown = defaultTypeChecked as (_1:props<"push" | "replace">) => JSX.Element; + +// tslint:disable-next-line:interface-over-type-literal +export type props = { readonly key?: string; readonly method?: method }; export default $$default; diff --git a/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx index 67c7d78233..25a4cbffec 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/MyInput.gen.tsx @@ -5,14 +5,17 @@ import {default as defaultNotChecked} from './MyInput'; // In case of type error, check the type of 'default' in 'MyInput.re' and './MyInput'. -export const defaultTypeChecked: React.ComponentType<{ readonly onFocus?: (_1:inputFocusEvent) => void }> = defaultNotChecked; +export const defaultTypeChecked: (_1:props<((_1:inputFocusEvent) => void)>) => JSX.Element = defaultNotChecked; // Export '$$default' early to allow circular import from the '.bs.js' file. -export const $$default: unknown = defaultTypeChecked as React.ComponentType<{ readonly onFocus?: (_1:inputFocusEvent) => void }>; +export const $$default: unknown = defaultTypeChecked as (_1:props<((_1:inputFocusEvent) => void)>) => JSX.Element; import type {inputFocusEvent as $$inputFocusEvent} from './shims/ReactEvent.shim'; // tslint:disable-next-line:interface-over-type-literal export type inputFocusEvent = $$inputFocusEvent; +// tslint:disable-next-line:interface-over-type-literal +export type props = { readonly key?: string; readonly onFocus?: onFocus }; + export default $$default; diff --git a/jscomp/gentype_tests/typescript-react-example/src/OnClick2.bs.js b/jscomp/gentype_tests/typescript-react-example/src/OnClick2.bs.js index 61e88f26b1..ab3331776a 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/OnClick2.bs.js +++ b/jscomp/gentype_tests/typescript-react-example/src/OnClick2.bs.js @@ -2,10 +2,9 @@ import * as React from "react"; -function OnClick2(Props) { - var onClick = Props.onClick; +function OnClick2(props) { return React.createElement("div", { - onClick: onClick + onClick: props.onClick }); } diff --git a/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx b/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx index 98e003b9be..01d266a36c 100644 --- a/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx +++ b/jscomp/gentype_tests/typescript-react-example/src/OnClick2.gen.tsx @@ -2,13 +2,11 @@ /* eslint-disable import/first */ -import * as React from 'react'; - // @ts-ignore: Implicit any on import import * as OnClick2BS__Es6Import from './OnClick2.bs'; const OnClick2BS: any = OnClick2BS__Es6Import; // tslint:disable-next-line:interface-over-type-literal -export type Props = { readonly onClick: (_1:MouseEvent) => void }; +export type props = { readonly key?: string; readonly onClick: onClick }; -export const make: React.ComponentType<{ readonly onClick: (_1:MouseEvent) => void }> = OnClick2BS.make; +export const make: (_1:props<((_1:MouseEvent) => void)>) => JSX.Element = OnClick2BS.make; From 7e56478e092268e021d13d27d184edf1cca5e4b5 Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Fri, 22 Jul 2022 21:19:37 +0200 Subject: [PATCH 17/18] Add optional arg example. --- .../typescript-react-example/src/V4.bs.js | 33 +++++++++++++++++++ .../typescript-react-example/src/V4.res | 12 +++++++ 2 files changed, 45 insertions(+) create mode 100644 jscomp/gentype_tests/typescript-react-example/src/V4.bs.js create mode 100644 jscomp/gentype_tests/typescript-react-example/src/V4.res diff --git a/jscomp/gentype_tests/typescript-react-example/src/V4.bs.js b/jscomp/gentype_tests/typescript-react-example/src/V4.bs.js new file mode 100644 index 0000000000..2854f5e7ca --- /dev/null +++ b/jscomp/gentype_tests/typescript-react-example/src/V4.bs.js @@ -0,0 +1,33 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Curry from "rescript/lib/es6/curry.js"; +import * as React from "react"; +import * as Caml_option from "rescript/lib/es6/caml_option.js"; + +function optionMap(x, f) { + if (x !== undefined) { + return Caml_option.some(Curry._1(f, Caml_option.valFromOption(x))); + } + +} + +function V4$Parens(props) { + var tmp = {}; + var tmp$1 = optionMap(props.id, (function (x) { + return x; + })); + if (tmp$1 !== undefined) { + tmp.id = Caml_option.valFromOption(tmp$1); + } + return React.createElement("div", tmp); +} + +var Parens = { + make: V4$Parens +}; + +export { + optionMap , + Parens , +} +/* react Not a pure module */ diff --git a/jscomp/gentype_tests/typescript-react-example/src/V4.res b/jscomp/gentype_tests/typescript-react-example/src/V4.res new file mode 100644 index 0000000000..20d66f607e --- /dev/null +++ b/jscomp/gentype_tests/typescript-react-example/src/V4.res @@ -0,0 +1,12 @@ +let optionMap = (x, f) => + switch x { + | None => None + | Some(v) => Some(f(v)) + } + +module Parens = { + @react.component + let make = (~id=?) => { +