Skip to content

Commit 9dce8e0

Browse files
committed
[genType] First step towards emitting components in V4 just as in V3.
1 parent 182177a commit 9dce8e0

File tree

3 files changed

+141
-21
lines changed

3 files changed

+141
-21
lines changed

jscomp/gentype/EmitJs.ml

+68-10
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized
125125
(env, emitters)
126126

127127
let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
128-
~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized
129-
~typeNameIsInterface ~variantTables codeItem =
128+
~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined
129+
~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem =
130130
if !Debug.codeItems then
131131
Log_.item "Code Item: %s\n"
132132
(codeItem |> codeItemToString ~config ~typeNameIsInterface);
@@ -307,6 +307,62 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
307307
in
308308
( Function { function_ with componentName = Some hookName },
309309
Some { HookType.propsType; resolvedTypeName; typeVars } )
310+
| Function
311+
({
312+
argTypes = [ { aType = Ident { name = "props" } as propsType } ];
313+
retType;
314+
} as function_)
315+
when retType |> EmitType.isTypeFunctionComponent ~fields:[] ->
316+
let compType =
317+
match typeGetInlined propsType with
318+
| Object (closedFlags, fields) ->
319+
let propsType =
320+
let fields =
321+
fields
322+
|> List.map (fun (field : field) ->
323+
match
324+
field.nameJS = "children"
325+
&& field.type_ |> EmitType.isTypeReactElement
326+
with
327+
| true ->
328+
{ field with type_ = EmitType.typeReactChild }
329+
| false -> field)
330+
in
331+
Object (closedFlags, fields)
332+
in
333+
let function_ =
334+
{
335+
function_ with
336+
argTypes = [ { aName = ""; aType = propsType } ];
337+
}
338+
in
339+
let chopSuffix suffix =
340+
match resolvedNameStr = suffix with
341+
| true -> ""
342+
| false -> (
343+
match
344+
Filename.check_suffix resolvedNameStr ("_" ^ suffix)
345+
with
346+
| true ->
347+
Filename.chop_suffix resolvedNameStr ("_" ^ suffix)
348+
| false -> resolvedNameStr)
349+
in
350+
let suffix =
351+
if originalName = default then chopSuffix default
352+
else if originalName = make then chopSuffix make
353+
else resolvedNameStr
354+
in
355+
let hookName =
356+
(fileName |> ModuleName.toString)
357+
^
358+
match suffix = "" with
359+
| true -> suffix
360+
| false -> "_" ^ suffix
361+
in
362+
Function { function_ with componentName = Some hookName }
363+
| _ -> type_
364+
in
365+
(compType, None)
310366
| _ -> (type_, None)
311367
in
312368

@@ -329,7 +385,8 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
329385
in
330386
(* For doc gen (https://github.com/cristianoc/genType/issues/342) *)
331387
config.emitImportReact <- true;
332-
emitExportType ~emitters ~config ~typeGetNormalized
388+
emitExportType ~emitters ~config
389+
~typeGetNormalized
333390
~typeNameIsInterface exportType
334391
| _ -> emitters
335392
in
@@ -350,14 +407,14 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
350407
(envWithRequires, emitters)
351408

352409
and emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env
353-
~fileName ~resolver ~typeNameIsInterface ~typeGetConverter
410+
~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~typeGetInlined
354411
~typeGetNormalized ~variantTables codeItems =
355412
codeItems
356413
|> List.fold_left
357414
(fun (env, emitters) ->
358415
emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
359-
~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized
360-
~typeNameIsInterface ~variantTables)
416+
~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined
417+
~typeGetNormalized ~typeNameIsInterface ~variantTables)
361418
(env, emitters)
362419

363420
let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters =
@@ -627,12 +684,13 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations
627684
try exportTypeMap |> StringMap.find s
628685
with Not_found -> env.exportTypeMapFromOtherFiles |> StringMap.find s
629686
in
630-
let typeGetNormalized_ ~env type_ =
687+
let typeGetNormalized__ ~inline ~env type_ =
631688
type_
632-
|> Converter.typeGetNormalized ~config ~inline:false
633-
~lookupId:(lookupId_ ~env)
689+
|> Converter.typeGetNormalized ~config ~inline ~lookupId:(lookupId_ ~env)
634690
~typeNameIsInterface:(typeNameIsInterface ~env)
635691
in
692+
let typeGetNormalized_ = typeGetNormalized__ ~inline:false in
693+
let typeGetInlined_ = typeGetNormalized__ ~inline:true in
636694
let typeGetConverter_ ~env type_ =
637695
type_
638696
|> Converter.typeGetConverter ~config ~lookupId:(lookupId_ ~env)
@@ -657,7 +715,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations
657715
let env, emitters =
658716
translation.codeItems
659717
|> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName
660-
~outputFileRelative ~resolver
718+
~outputFileRelative ~resolver ~typeGetInlined:(typeGetInlined_ ~env)
661719
~typeGetNormalized:(typeGetNormalized_ ~env)
662720
~typeGetConverter:(typeGetConverter_ ~env)
663721
~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables

jscomp/gentype_tests/typescript-react-example/src/JSXV4.gen.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@ export type props<x,y> = {
1313
readonly y: y
1414
};
1515

16-
export const make: (_1:props<string,string>) => JSX.Element = JSXV4BS.make;
16+
export const make: React.ComponentType<{
17+
readonly key?: string;
18+
readonly x: string;
19+
readonly y: string
20+
}> = JSXV4BS.make;

lib/4.06.1/whole_compiler.ml

+68-10
Original file line numberDiff line numberDiff line change
@@ -240335,8 +240335,8 @@ let emitExportFromTypeDeclarations ~config ~emitters ~env ~typeGetNormalized
240335240335
(env, emitters)
240336240336

240337240337
let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
240338-
~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized
240339-
~typeNameIsInterface ~variantTables codeItem =
240338+
~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined
240339+
~typeGetNormalized ~typeNameIsInterface ~variantTables codeItem =
240340240340
if !Debug.codeItems then
240341240341
Log_.item "Code Item: %s\n"
240342240342
(codeItem |> codeItemToString ~config ~typeNameIsInterface);
@@ -240517,6 +240517,62 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
240517240517
in
240518240518
( Function { function_ with componentName = Some hookName },
240519240519
Some { HookType.propsType; resolvedTypeName; typeVars } )
240520+
| Function
240521+
({
240522+
argTypes = [ { aType = Ident { name = "props" } as propsType } ];
240523+
retType;
240524+
} as function_)
240525+
when retType |> EmitType.isTypeFunctionComponent ~fields:[] ->
240526+
let compType =
240527+
match typeGetInlined propsType with
240528+
| Object (closedFlags, fields) ->
240529+
let propsType =
240530+
let fields =
240531+
fields
240532+
|> List.map (fun (field : field) ->
240533+
match
240534+
field.nameJS = "children"
240535+
&& field.type_ |> EmitType.isTypeReactElement
240536+
with
240537+
| true ->
240538+
{ field with type_ = EmitType.typeReactChild }
240539+
| false -> field)
240540+
in
240541+
Object (closedFlags, fields)
240542+
in
240543+
let function_ =
240544+
{
240545+
function_ with
240546+
argTypes = [ { aName = ""; aType = propsType } ];
240547+
}
240548+
in
240549+
let chopSuffix suffix =
240550+
match resolvedNameStr = suffix with
240551+
| true -> ""
240552+
| false -> (
240553+
match
240554+
Filename.check_suffix resolvedNameStr ("_" ^ suffix)
240555+
with
240556+
| true ->
240557+
Filename.chop_suffix resolvedNameStr ("_" ^ suffix)
240558+
| false -> resolvedNameStr)
240559+
in
240560+
let suffix =
240561+
if originalName = default then chopSuffix default
240562+
else if originalName = make then chopSuffix make
240563+
else resolvedNameStr
240564+
in
240565+
let hookName =
240566+
(fileName |> ModuleName.toString)
240567+
^
240568+
match suffix = "" with
240569+
| true -> suffix
240570+
| false -> "_" ^ suffix
240571+
in
240572+
Function { function_ with componentName = Some hookName }
240573+
| _ -> type_
240574+
in
240575+
(compType, None)
240520240576
| _ -> (type_, None)
240521240577
in
240522240578

@@ -240539,7 +240595,8 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
240539240595
in
240540240596
(* For doc gen (https://github.com/cristianoc/genType/issues/342) *)
240541240597
config.emitImportReact <- true;
240542-
emitExportType ~emitters ~config ~typeGetNormalized
240598+
emitExportType ~emitters ~config
240599+
~typeGetNormalized
240543240600
~typeNameIsInterface exportType
240544240601
| _ -> emitters
240545240602
in
@@ -240560,14 +240617,14 @@ let rec emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
240560240617
(envWithRequires, emitters)
240561240618

240562240619
and emitCodeItems ~config ~outputFileRelative ~emitters ~moduleItemsEmitter ~env
240563-
~fileName ~resolver ~typeNameIsInterface ~typeGetConverter
240620+
~fileName ~resolver ~typeNameIsInterface ~typeGetConverter ~typeGetInlined
240564240621
~typeGetNormalized ~variantTables codeItems =
240565240622
codeItems
240566240623
|> List.fold_left
240567240624
(fun (env, emitters) ->
240568240625
emitCodeItem ~config ~emitters ~moduleItemsEmitter ~env ~fileName
240569-
~outputFileRelative ~resolver ~typeGetConverter ~typeGetNormalized
240570-
~typeNameIsInterface ~variantTables)
240626+
~outputFileRelative ~resolver ~typeGetConverter ~typeGetInlined
240627+
~typeGetNormalized ~typeNameIsInterface ~variantTables)
240571240628
(env, emitters)
240572240629

240573240630
let emitRequires ~importedValueOrComponent ~early ~config ~requires emitters =
@@ -240837,12 +240894,13 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations
240837240894
try exportTypeMap |> StringMap.find s
240838240895
with Not_found -> env.exportTypeMapFromOtherFiles |> StringMap.find s
240839240896
in
240840-
let typeGetNormalized_ ~env type_ =
240897+
let typeGetNormalized__ ~inline ~env type_ =
240841240898
type_
240842-
|> Converter.typeGetNormalized ~config ~inline:false
240843-
~lookupId:(lookupId_ ~env)
240899+
|> Converter.typeGetNormalized ~config ~inline ~lookupId:(lookupId_ ~env)
240844240900
~typeNameIsInterface:(typeNameIsInterface ~env)
240845240901
in
240902+
let typeGetNormalized_ = typeGetNormalized__ ~inline:false in
240903+
let typeGetInlined_ = typeGetNormalized__ ~inline:true in
240846240904
let typeGetConverter_ ~env type_ =
240847240905
type_
240848240906
|> Converter.typeGetConverter ~config ~lookupId:(lookupId_ ~env)
@@ -240867,7 +240925,7 @@ let emitTranslationAsString ~config ~fileName ~inputCmtTranslateTypeDeclarations
240867240925
let env, emitters =
240868240926
translation.codeItems
240869240927
|> emitCodeItems ~config ~emitters ~moduleItemsEmitter ~env ~fileName
240870-
~outputFileRelative ~resolver
240928+
~outputFileRelative ~resolver ~typeGetInlined:(typeGetInlined_ ~env)
240871240929
~typeGetNormalized:(typeGetNormalized_ ~env)
240872240930
~typeGetConverter:(typeGetConverter_ ~env)
240873240931
~typeNameIsInterface:(typeNameIsInterface ~env) ~variantTables

0 commit comments

Comments
 (0)