From 232ff85b47d439dead2a12050b174791a4af4639 Mon Sep 17 00:00:00 2001 From: "Zihan Chen (MSFT)" <53799235+ZihanChen-MSFT@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:35:13 -0800 Subject: [PATCH 1/6] Update CodegenSchema.js --- packages/react-native-codegen/src/CodegenSchema.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 8033695ba65513..9371c1a65e3a63 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -53,6 +53,7 @@ export type VoidTypeAnnotation = $ReadOnly<{ export type ObjectTypeAnnotation<+T> = $ReadOnly<{ type: 'ObjectTypeAnnotation', properties: $ReadOnlyArray>, + baseTypes?: $ReadOnlyArray, }>; type FunctionTypeAnnotation<+P, +R> = $ReadOnly<{ From 283380fc94437d26ce31ebf982e31f25eda84e66 Mon Sep 17 00:00:00 2001 From: "Zihan Chen (MSFT)" <53799235+ZihanChen-MSFT@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:44:56 -0800 Subject: [PATCH 2/6] ... --- packages/react-native-codegen/src/CodegenSchema.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 9371c1a65e3a63..4a16783ef0fff3 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -53,6 +53,8 @@ export type VoidTypeAnnotation = $ReadOnly<{ export type ObjectTypeAnnotation<+T> = $ReadOnly<{ type: 'ObjectTypeAnnotation', properties: $ReadOnlyArray>, + + // metadata for objects that generated from interfaces baseTypes?: $ReadOnlyArray, }>; From 3534fbb9fd4cb35a5ca1e73c8bf6494a7dbf83cc Mon Sep 17 00:00:00 2001 From: "Zihan Chen (MSFT)" <53799235+ZihanChen-MSFT@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:53:11 -0800 Subject: [PATCH 3/6] ensure base types exist and appear in aliasMap --- ...script-module-parser-snapshot-test.js.snap | 47 +++++++++++++++++++ .../src/parsers/typescript/modules/index.js | 14 ++++++ 2 files changed, 61 insertions(+) diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index d6f4f9d4e3679e..7b6e6f27b2edab 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -1521,6 +1521,53 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NE } ] }, + 'Base1': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'bar1', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + } + ] + }, + 'Base2': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'bar2', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + } + ] + }, + 'Base3': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'bar2', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + }, + { + 'name': 'bar3', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + } + ] + }, 'Foo': { 'type': 'ObjectTypeAnnotation', 'properties': [ diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index 1d0a222b48d828..621bf9acc75773 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -221,6 +221,20 @@ function translateTypeAnnotation( } } case 'TSInterfaceDeclaration': { + const baseTypes = (typeAnnotation.extends ?? []).map((extend)=>extend.expression.name); + for(const baseType of baseTypes) { + // ensure base types exist and appear in aliasMap + translateTypeAnnotation( + hasteModuleName, + {type:'TSTypeReference',typeName:{type:'Identifier',name:baseType}}, + types, + aliasMap, + tryParse, + cxxOnly, + parser, + ); + } + const objectTypeAnnotation = { type: 'ObjectTypeAnnotation', // $FlowFixMe[missing-type-arg] From a012abf63174cf5ff77fa24df9dc6aa2835ee4d7 Mon Sep 17 00:00:00 2001 From: "Zihan Chen (MSFT)" <53799235+ZihanChen-MSFT@users.noreply.github.com> Date: Mon, 30 Jan 2023 15:54:38 -0800 Subject: [PATCH 4/6] Add baseTypes --- .../typescript-module-parser-snapshot-test.js.snap | 7 +++++++ .../src/parsers/typescript/modules/index.js | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index 7b6e6f27b2edab..38fd3e1186724a 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -1566,6 +1566,9 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NE 'name': 'Bar' } } + ], + 'baseTypes': [ + 'Base2' ] }, 'Foo': { @@ -1603,6 +1606,10 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NE 'name': 'Bar' } } + ], + 'baseTypes': [ + 'Base1', + 'Base3' ] } }, diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index 621bf9acc75773..ea9fb418bce7d0 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -235,7 +235,7 @@ function translateTypeAnnotation( ); } - const objectTypeAnnotation = { + let objectTypeAnnotation = { type: 'ObjectTypeAnnotation', // $FlowFixMe[missing-type-arg] properties: (flattenProperties( @@ -262,6 +262,10 @@ function translateTypeAnnotation( .filter(Boolean), }; + if(baseTypes.length>0){ + objectTypeAnnotation.baseTypes = baseTypes; + } + return typeAliasResolution( typeAliasResolutionStatus, objectTypeAnnotation, From 17b20c688f3e5136f130d91a7d69181c56f8429b Mon Sep 17 00:00:00 2001 From: "Zihan Chen (MSFT)" <53799235+ZihanChen-MSFT@users.noreply.github.com> Date: Mon, 30 Jan 2023 16:04:34 -0800 Subject: [PATCH 5/6] yarn flow-check-ios --- .../src/parsers/typescript/modules/index.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index ea9fb418bce7d0..120e2a32afa77a 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -221,12 +221,17 @@ function translateTypeAnnotation( } } case 'TSInterfaceDeclaration': { - const baseTypes = (typeAnnotation.extends ?? []).map((extend)=>extend.expression.name); - for(const baseType of baseTypes) { + const baseTypes = (typeAnnotation.extends ?? []).map( + extend => extend.expression.name, + ); + for (const baseType of baseTypes) { // ensure base types exist and appear in aliasMap translateTypeAnnotation( hasteModuleName, - {type:'TSTypeReference',typeName:{type:'Identifier',name:baseType}}, + { + type: 'TSTypeReference', + typeName: {type: 'Identifier', name: baseType}, + }, types, aliasMap, tryParse, @@ -260,10 +265,13 @@ function translateTypeAnnotation( }, ) .filter(Boolean), + baseTypes, }; - if(baseTypes.length>0){ - objectTypeAnnotation.baseTypes = baseTypes; + if (objectTypeAnnotation.baseTypes.length == 0) { + // The flow checker does not allow adding a member after an object literal is created + // so here I do it in a reverse way + delete objectTypeAnnotation.baseTypes; } return typeAliasResolution( From 3ba73a816eb3f66b08e26c26c971cddc6c4a544a Mon Sep 17 00:00:00 2001 From: "Zihan Chen (MSFT)" <53799235+ZihanChen-MSFT@users.noreply.github.com> Date: Mon, 30 Jan 2023 16:19:01 -0800 Subject: [PATCH 6/6] Update index.js --- .../src/parsers/typescript/modules/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index 120e2a32afa77a..74331eaeb81b8a 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -268,7 +268,7 @@ function translateTypeAnnotation( baseTypes, }; - if (objectTypeAnnotation.baseTypes.length == 0) { + if (objectTypeAnnotation.baseTypes.length === 0) { // The flow checker does not allow adding a member after an object literal is created // so here I do it in a reverse way delete objectTypeAnnotation.baseTypes;