@react-native-windows/codegen 0.0.0-canary.66 → 0.0.0-canary.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -5
- package/lib-commonjs/generators/AliasGen.d.ts +1 -1
- package/lib-commonjs/generators/AliasGen.js +27 -11
- package/lib-commonjs/generators/AliasGen.js.map +1 -1
- package/lib-commonjs/generators/GenerateNM2.js +6 -4
- package/lib-commonjs/generators/GenerateNM2.js.map +1 -1
- package/package.json +1 -1
- package/src/generators/AliasGen.ts +45 -13
- package/src/generators/GenerateNM2.ts +6 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
# Change Log - @react-native-windows/codegen
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Tue, 08 Aug 2023 05:12:09 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
-
## 0.0.0-canary.
|
|
7
|
+
## 0.0.0-canary.67
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Tue, 08 Aug 2023 05:12:09 GMT
|
|
10
10
|
|
|
11
11
|
### Changes
|
|
12
12
|
|
|
13
|
-
-
|
|
14
|
-
- Bump @rnw-scripts/just-task to v2.3.15
|
|
13
|
+
- @rnw/codegen generates GetStructInfo instead of REACT_STRUCT (53799235+ZihanChen-MSFT@users.noreply.github.com)
|
|
15
14
|
|
|
15
|
+
## 0.0.0-canary.66
|
|
16
|
+
|
|
17
|
+
Fri, 28 Jul 2023 05:14:53 GMT
|
|
18
|
+
|
|
19
|
+
### Changes
|
|
20
|
+
|
|
21
|
+
- Bump @react-native-windows/fs to v0.0.0-canary.27
|
|
22
|
+
- Bump @rnw-scripts/just-task to v2.3.15
|
|
23
|
+
|
|
16
24
|
## 0.0.0-canary.65
|
|
17
25
|
|
|
18
26
|
Wed, 26 Jul 2023 05:15:47 GMT
|
|
@@ -9,4 +9,4 @@ import { CppCodegenOptions } from './ObjectTypes';
|
|
|
9
9
|
export declare function createAliasMap(nativeModuleAliases: {
|
|
10
10
|
[name: string]: NativeModuleObjectTypeAnnotation;
|
|
11
11
|
}): AliasMap;
|
|
12
|
-
export declare function generateAliases(aliases: AliasMap, options: CppCodegenOptions): string;
|
|
12
|
+
export declare function generateAliases(aliases: AliasMap, options: CppCodegenOptions): [string, string];
|
|
@@ -8,16 +8,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.generateAliases = exports.createAliasMap = void 0;
|
|
9
9
|
const AliasManaging_1 = require("./AliasManaging");
|
|
10
10
|
const ObjectTypes_1 = require("./ObjectTypes");
|
|
11
|
-
function
|
|
11
|
+
function translateObjectMembersDefinition(type, aliases, baseAliasName, prefix, options) {
|
|
12
12
|
return type.properties
|
|
13
13
|
.map((prop) => {
|
|
14
14
|
let propType = prop.typeAnnotation;
|
|
15
15
|
if (prop.optional && propType.type !== 'NullableTypeAnnotation') {
|
|
16
16
|
propType = { type: 'NullableTypeAnnotation', typeAnnotation: propType };
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
return `${prefix}${(0, ObjectTypes_1.translateField)(propType, aliases, `${baseAliasName}_${prop.name}`, options)} ${prop.name};`;
|
|
19
|
+
})
|
|
20
|
+
.join('\n');
|
|
21
|
+
}
|
|
22
|
+
function translateObjectMembersReflection(type, aliasCppName, prefix) {
|
|
23
|
+
return type.properties
|
|
24
|
+
.map((prop) => {
|
|
25
|
+
return `${prefix}{L"${prop.name}", &${aliasCppName}::${prop.name}},`;
|
|
21
26
|
})
|
|
22
27
|
.join('\n');
|
|
23
28
|
}
|
|
@@ -30,13 +35,22 @@ function createAliasMap(nativeModuleAliases) {
|
|
|
30
35
|
}
|
|
31
36
|
exports.createAliasMap = createAliasMap;
|
|
32
37
|
function generateSingleAlias(aliases, aliasName, aliasCode, options) {
|
|
38
|
+
const aliasCppName = (0, AliasManaging_1.getAliasCppName)(aliasName);
|
|
33
39
|
const aliasType = aliases.types[aliasName];
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
${translateObjectBody(aliasType, aliases, aliasName, ' ', options)}
|
|
40
|
+
const definition = `
|
|
41
|
+
struct ${aliasCppName} {
|
|
42
|
+
${translateObjectMembersDefinition(aliasType, aliases, aliasName, ' ', options)}
|
|
38
43
|
};
|
|
39
44
|
`;
|
|
45
|
+
const reflection = `
|
|
46
|
+
inline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {
|
|
47
|
+
winrt::Microsoft::ReactNative::FieldMap fieldMap {
|
|
48
|
+
${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}
|
|
49
|
+
};
|
|
50
|
+
return fieldMap;
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
aliasCode[aliasName] = { definition, reflection };
|
|
40
54
|
}
|
|
41
55
|
function generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options) {
|
|
42
56
|
// retrieve and clean all ungenerated aliases
|
|
@@ -62,11 +76,13 @@ function generateAliases(aliases, options) {
|
|
|
62
76
|
const aliasOrder = [];
|
|
63
77
|
generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);
|
|
64
78
|
// aliasOrder now has the correct order of C++ struct code
|
|
65
|
-
let
|
|
79
|
+
let customTypes = '';
|
|
80
|
+
let customReflection = '';
|
|
66
81
|
for (const aliasName of aliasOrder) {
|
|
67
|
-
|
|
82
|
+
customTypes = `${customTypes}${aliasCode[aliasName].definition}`;
|
|
83
|
+
customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;
|
|
68
84
|
}
|
|
69
|
-
return
|
|
85
|
+
return [customTypes, customReflection];
|
|
70
86
|
}
|
|
71
87
|
exports.generateAliases = generateAliases;
|
|
72
88
|
//# sourceMappingURL=AliasGen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AliasGen.js","sourceRoot":"","sources":["../../src/generators/AliasGen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAQb,mDAA0D;AAC1D,+CAAgE;AAEhE,SAAS,
|
|
1
|
+
{"version":3,"file":"AliasGen.js","sourceRoot":"","sources":["../../src/generators/AliasGen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport type {\n NativeModuleBaseTypeAnnotation,\n NativeModuleObjectTypeAnnotation,\n NamedShape,\n Nullable,\n} from '@react-native/codegen/lib/CodegenSchema';\nimport {AliasMap, getAliasCppName} from './AliasManaging';\nimport {CppCodegenOptions, translateField} from './ObjectTypes';\n\nfunction translateObjectMembersDefinition(\n type: NativeModuleObjectTypeAnnotation,\n aliases: AliasMap,\n baseAliasName: string,\n prefix: string,\n options: CppCodegenOptions,\n) {\n return type.properties\n .map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {\n let propType = prop.typeAnnotation;\n if (prop.optional && propType.type !== 'NullableTypeAnnotation') {\n propType = {type: 'NullableTypeAnnotation', typeAnnotation: propType};\n }\n return `${prefix}${translateField(\n propType,\n aliases,\n `${baseAliasName}_${prop.name}`,\n options,\n )} ${prop.name};`;\n })\n .join('\\n');\n}\n\nfunction translateObjectMembersReflection(\n type: NativeModuleObjectTypeAnnotation,\n aliasCppName: string,\n prefix: string,\n) {\n return type.properties\n .map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {\n return `${prefix}{L\"${prop.name}\", &${aliasCppName}::${prop.name}},`;\n })\n .join('\\n');\n}\n\nexport function createAliasMap(nativeModuleAliases: {\n [name: string]: NativeModuleObjectTypeAnnotation;\n}): AliasMap {\n const aliases: AliasMap = {types: {}, jobs: Object.keys(nativeModuleAliases)};\n for (const aliasName of aliases.jobs) {\n aliases.types[aliasName] = nativeModuleAliases[aliasName];\n }\n return aliases;\n}\n\ninterface AliasCode {\n definition: string;\n reflection: string;\n}\n\ninterface AliasCodeMap {\n [name: string]: AliasCode;\n}\n\nfunction generateSingleAlias(\n aliases: AliasMap,\n aliasName: string,\n aliasCode: AliasCodeMap,\n options: CppCodegenOptions,\n): void {\n const aliasCppName = getAliasCppName(aliasName);\n const aliasType = <NativeModuleObjectTypeAnnotation>aliases.types[aliasName];\n const definition = `\nstruct ${aliasCppName} {\n${translateObjectMembersDefinition(\n aliasType,\n aliases,\n aliasName,\n ' ',\n options,\n)}\n};\n`;\n const reflection = `\ninline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {\n winrt::Microsoft::ReactNative::FieldMap fieldMap {\n${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}\n };\n return fieldMap;\n}\n`;\n aliasCode[aliasName] = {definition, reflection};\n}\n\nfunction generateNestedAliasesInCorrectOrder(\n aliases: AliasMap,\n aliasCode: AliasCodeMap,\n aliasOrder: string[],\n options: CppCodegenOptions,\n): void {\n // retrieve and clean all ungenerated aliases\n const jobs = aliases.jobs;\n aliases.jobs = [];\n\n // generate each one in its found order\n for (const aliasName of jobs) {\n // generate a new struct and all fields will be examined\n // new anonymous objects could be found\n // they will be stored in aliases.jobs\n generateSingleAlias(aliases, aliasName, aliasCode, options);\n // nested C++ structs must be put before the current C++ struct\n // as they will be used in the current C++ struct\n // the order will be perfectly and easily ensured by doing this recursively\n generateNestedAliasesInCorrectOrder(\n aliases,\n aliasCode,\n aliasOrder,\n options,\n );\n // all referenced C++ structs are generated\n // put the current one following them\n aliasOrder.push(aliasName);\n }\n}\n\nexport function generateAliases(\n aliases: AliasMap,\n options: CppCodegenOptions,\n): [string, string] {\n const aliasCode: AliasCodeMap = {};\n const aliasOrder: string[] = [];\n generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);\n\n // aliasOrder now has the correct order of C++ struct code\n let customTypes = '';\n let customReflection = '';\n for (const aliasName of aliasOrder) {\n customTypes = `${customTypes}${aliasCode[aliasName].definition}`;\n customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;\n }\n return [customTypes, customReflection];\n}\n"]}
|
|
@@ -20,11 +20,12 @@ const moduleTemplate = `
|
|
|
20
20
|
*/
|
|
21
21
|
#pragma once
|
|
22
22
|
|
|
23
|
-
#include
|
|
23
|
+
#include <NativeModules.h>
|
|
24
24
|
#include <tuple>
|
|
25
25
|
|
|
26
26
|
namespace ::_NAMESPACE_:: {
|
|
27
|
-
::
|
|
27
|
+
::_MODULE_CUSTPM_TYPES_::
|
|
28
|
+
::_MODULE_CUSTPM_TYPES_REFLECTION_::
|
|
28
29
|
struct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {
|
|
29
30
|
::_MODULE_MEMBERS_TUPLES_::
|
|
30
31
|
|
|
@@ -79,11 +80,12 @@ ${constants[0]}
|
|
|
79
80
|
${errors}`;
|
|
80
81
|
}
|
|
81
82
|
// generate code for structs
|
|
82
|
-
const
|
|
83
|
+
const [customTypes, customReflection] = (0, AliasGen_1.generateAliases)(aliases, {
|
|
83
84
|
cppStringType,
|
|
84
85
|
});
|
|
85
86
|
files.set(`Native${preferredModuleName}Spec.g.h`, moduleTemplate
|
|
86
|
-
.replace(/::
|
|
87
|
+
.replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)
|
|
88
|
+
.replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)
|
|
87
89
|
.replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))
|
|
88
90
|
.replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))
|
|
89
91
|
.replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenerateNM2.js","sourceRoot":"","sources":["../../src/generators/GenerateNM2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAGb,mDAAiE;AACjE,yCAA2D;AAC3D,2DAA8D;AAC9D,uDAA0D;AAO1D,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"GenerateNM2.js","sourceRoot":"","sources":["../../src/generators/GenerateNM2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAGb,mDAAiE;AACjE,yCAA2D;AAC3D,2DAA8D;AAC9D,uDAA0D;AAO1D,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BtB,CAAC;AAEF,SAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,SAAS,EACT,aAAa,GAKd;IACC,OAAO,CACL,YAAoB,EACpB,MAAkB,EAClB,eAAuB,EACV,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QAExC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACpD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,4CAA4C;YAC5C,0DAA0D;YAC1D,iCAAiC;YACjC,MAAM,mBAAmB,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACzD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,UAAU,CAAC;YACf,IAAA,sCAAsB,EAAC,mBAAmB,CAAC,CAAC;YAE5C,IAAI,YAAY,CAAC,IAAI,KAAK,cAAc,EAAE;gBACxC,OAAO,CAAC,GAAG,CAAC,oBAAoB,mBAAmB,UAAU,CAAC,CAAC;gBAE/D,6BAA6B;gBAC7B,MAAM,OAAO,GAAa,IAAA,yBAAc,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAEhE,kBAAkB;gBAClB,MAAM,OAAO,GAAG,IAAA,yCAAuB,EAAC,YAAY,EAAE,OAAO,EAAE;oBAC7D,aAAa;iBACd,CAAC,CAAC;gBACH,IAAI,MAAM,GAAG;;EAEnB,OAAO,CAAC,CAAC,CAAC;KACP,CAAC;gBACE,IAAI,MAAM,GAAG;wFACmE,CAAC;gBACjF,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAExB,oBAAoB;gBACpB,MAAM,SAAS,GAAG,IAAA,6CAAyB,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACnE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,EAAE;oBAC1C,MAAM,GAAG;;EAEjB,SAAS,CAAC,CAAC,CAAC;MACR,MAAM,EAAE,CAAC;oBACL,MAAM,GAAG;6FAC0E,MAAM,EAAE,CAAC;oBAC5F,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;;EAEhC,MAAM,EAAE,CAAC;iBACF;gBAED,4BAA4B;gBAC5B,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAAG,IAAA,0BAAe,EAAC,OAAO,EAAE;oBAC/D,aAAa;iBACd,CAAC,CAAC;gBAEH,KAAK,CAAC,GAAG,CACP,SAAS,mBAAmB,UAAU,EACtC,cAAc;qBACX,OAAO,CAAC,4BAA4B,EAAE,WAAW,CAAC;qBAClD,OAAO,CAAC,uCAAuC,EAAE,gBAAgB,CAAC;qBAClE,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;qBAC5D,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;qBAC5D,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC;qBAC/C,OAAO,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;qBAClD,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAC1C,CAAC;aACH;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AA/ED,gDA+EC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport type {SchemaType} from '@react-native/codegen/lib/CodegenSchema';\nimport {AliasMap, setPreferredModuleName} from './AliasManaging';\nimport {createAliasMap, generateAliases} from './AliasGen';\nimport {generateValidateConstants} from './ValidateConstants';\nimport {generateValidateMethods} from './ValidateMethods';\nimport type {CppStringTypes} from './ObjectTypes';\n\nexport type {CppStringTypes} from './ObjectTypes';\n\ntype FilesOutput = Map<string, string>;\n\nconst moduleTemplate = `\n/*\n * This file is auto-generated from a NativeModule spec file in js.\n *\n * This is a C++ Spec class that should be used with MakeTurboModuleProvider to register native modules\n * in a way that also verifies at compile time that the native module matches the interface required\n * by the TurboModule JS spec.\n */\n#pragma once\n\n#include <NativeModules.h>\n#include <tuple>\n\nnamespace ::_NAMESPACE_:: {\n::_MODULE_CUSTPM_TYPES_::\n::_MODULE_CUSTPM_TYPES_REFLECTION_::\nstruct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {\n::_MODULE_MEMBERS_TUPLES_::\n\n template <class TModule>\n static constexpr void ValidateModule() noexcept {\n::_MODULE_MEMBERS_CHECKS_::\n\n::_MODULE_MEMBERS_ERRORS_::\n }\n};\n\n} // namespace ::_NAMESPACE_::\n`;\n\nexport function createNM2Generator({\n methodOnly,\n namespace,\n cppStringType,\n}: {\n methodOnly: boolean;\n namespace: string;\n cppStringType: CppStringTypes;\n}) {\n return (\n _libraryName: string,\n schema: SchemaType,\n _moduleSpecName: string,\n ): FilesOutput => {\n const files = new Map<string, string>();\n\n for (const moduleName of Object.keys(schema.modules)) {\n const nativeModule = schema.modules[moduleName];\n // from 0.65 facebook's react-native-codegen\n // the module name has the Native prefix comparing to 0.63\n // when reading files we provided\n const preferredModuleName = moduleName.startsWith('Native')\n ? moduleName.substr(6)\n : moduleName;\n setPreferredModuleName(preferredModuleName);\n\n if (nativeModule.type === 'NativeModule') {\n console.log(`Generating Native${preferredModuleName}Spec.g.h`);\n\n // copy all explicit to a map\n const aliases: AliasMap = createAliasMap(nativeModule.aliasMap);\n\n // prepare methods\n const methods = generateValidateMethods(nativeModule, aliases, {\n cppStringType,\n });\n let tuples = `\n static constexpr auto methods = std::tuple{\n${methods[0]}\n };`;\n let checks = `\n constexpr auto methodCheckResults = CheckMethods<TModule, ::_MODULE_NAME_::Spec>();`;\n let errors = methods[1];\n\n // prepare constants\n const constants = generateValidateConstants(nativeModule, aliases);\n if (constants !== undefined && !methodOnly) {\n tuples = `\n static constexpr auto constants = std::tuple{\n${constants[0]}\n };${tuples}`;\n checks = `\n constexpr auto constantCheckResults = CheckConstants<TModule, ::_MODULE_NAME_::Spec>();${checks}`;\n errors = `${constants[1]}\n\n${errors}`;\n }\n\n // generate code for structs\n const [customTypes, customReflection] = generateAliases(aliases, {\n cppStringType,\n });\n\n files.set(\n `Native${preferredModuleName}Spec.g.h`,\n moduleTemplate\n .replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)\n .replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)\n .replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))\n .replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))\n .replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)\n .replace(/::_MODULE_NAME_::/g, preferredModuleName)\n .replace(/::_NAMESPACE_::/g, namespace),\n );\n }\n }\n\n return files;\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@ import type {
|
|
|
15
15
|
import {AliasMap, getAliasCppName} from './AliasManaging';
|
|
16
16
|
import {CppCodegenOptions, translateField} from './ObjectTypes';
|
|
17
17
|
|
|
18
|
-
function
|
|
18
|
+
function translateObjectMembersDefinition(
|
|
19
19
|
type: NativeModuleObjectTypeAnnotation,
|
|
20
20
|
aliases: AliasMap,
|
|
21
21
|
baseAliasName: string,
|
|
@@ -28,14 +28,24 @@ function translateObjectBody(
|
|
|
28
28
|
if (prop.optional && propType.type !== 'NullableTypeAnnotation') {
|
|
29
29
|
propType = {type: 'NullableTypeAnnotation', typeAnnotation: propType};
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
const second = `${prefix}${translateField(
|
|
31
|
+
return `${prefix}${translateField(
|
|
33
32
|
propType,
|
|
34
33
|
aliases,
|
|
35
34
|
`${baseAliasName}_${prop.name}`,
|
|
36
35
|
options,
|
|
37
36
|
)} ${prop.name};`;
|
|
38
|
-
|
|
37
|
+
})
|
|
38
|
+
.join('\n');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function translateObjectMembersReflection(
|
|
42
|
+
type: NativeModuleObjectTypeAnnotation,
|
|
43
|
+
aliasCppName: string,
|
|
44
|
+
prefix: string,
|
|
45
|
+
) {
|
|
46
|
+
return type.properties
|
|
47
|
+
.map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {
|
|
48
|
+
return `${prefix}{L"${prop.name}", &${aliasCppName}::${prop.name}},`;
|
|
39
49
|
})
|
|
40
50
|
.join('\n');
|
|
41
51
|
}
|
|
@@ -50,8 +60,13 @@ export function createAliasMap(nativeModuleAliases: {
|
|
|
50
60
|
return aliases;
|
|
51
61
|
}
|
|
52
62
|
|
|
63
|
+
interface AliasCode {
|
|
64
|
+
definition: string;
|
|
65
|
+
reflection: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
53
68
|
interface AliasCodeMap {
|
|
54
|
-
[name: string]:
|
|
69
|
+
[name: string]: AliasCode;
|
|
55
70
|
}
|
|
56
71
|
|
|
57
72
|
function generateSingleAlias(
|
|
@@ -60,13 +75,28 @@ function generateSingleAlias(
|
|
|
60
75
|
aliasCode: AliasCodeMap,
|
|
61
76
|
options: CppCodegenOptions,
|
|
62
77
|
): void {
|
|
78
|
+
const aliasCppName = getAliasCppName(aliasName);
|
|
63
79
|
const aliasType = <NativeModuleObjectTypeAnnotation>aliases.types[aliasName];
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
80
|
+
const definition = `
|
|
81
|
+
struct ${aliasCppName} {
|
|
82
|
+
${translateObjectMembersDefinition(
|
|
83
|
+
aliasType,
|
|
84
|
+
aliases,
|
|
85
|
+
aliasName,
|
|
86
|
+
' ',
|
|
87
|
+
options,
|
|
88
|
+
)}
|
|
68
89
|
};
|
|
69
90
|
`;
|
|
91
|
+
const reflection = `
|
|
92
|
+
inline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {
|
|
93
|
+
winrt::Microsoft::ReactNative::FieldMap fieldMap {
|
|
94
|
+
${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}
|
|
95
|
+
};
|
|
96
|
+
return fieldMap;
|
|
97
|
+
}
|
|
98
|
+
`;
|
|
99
|
+
aliasCode[aliasName] = {definition, reflection};
|
|
70
100
|
}
|
|
71
101
|
|
|
72
102
|
function generateNestedAliasesInCorrectOrder(
|
|
@@ -103,15 +133,17 @@ function generateNestedAliasesInCorrectOrder(
|
|
|
103
133
|
export function generateAliases(
|
|
104
134
|
aliases: AliasMap,
|
|
105
135
|
options: CppCodegenOptions,
|
|
106
|
-
): string {
|
|
136
|
+
): [string, string] {
|
|
107
137
|
const aliasCode: AliasCodeMap = {};
|
|
108
138
|
const aliasOrder: string[] = [];
|
|
109
139
|
generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);
|
|
110
140
|
|
|
111
141
|
// aliasOrder now has the correct order of C++ struct code
|
|
112
|
-
let
|
|
142
|
+
let customTypes = '';
|
|
143
|
+
let customReflection = '';
|
|
113
144
|
for (const aliasName of aliasOrder) {
|
|
114
|
-
|
|
145
|
+
customTypes = `${customTypes}${aliasCode[aliasName].definition}`;
|
|
146
|
+
customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;
|
|
115
147
|
}
|
|
116
|
-
return
|
|
148
|
+
return [customTypes, customReflection];
|
|
117
149
|
}
|
|
@@ -27,11 +27,12 @@ const moduleTemplate = `
|
|
|
27
27
|
*/
|
|
28
28
|
#pragma once
|
|
29
29
|
|
|
30
|
-
#include
|
|
30
|
+
#include <NativeModules.h>
|
|
31
31
|
#include <tuple>
|
|
32
32
|
|
|
33
33
|
namespace ::_NAMESPACE_:: {
|
|
34
|
-
::
|
|
34
|
+
::_MODULE_CUSTPM_TYPES_::
|
|
35
|
+
::_MODULE_CUSTPM_TYPES_REFLECTION_::
|
|
35
36
|
struct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {
|
|
36
37
|
::_MODULE_MEMBERS_TUPLES_::
|
|
37
38
|
|
|
@@ -105,14 +106,15 @@ ${errors}`;
|
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
// generate code for structs
|
|
108
|
-
const
|
|
109
|
+
const [customTypes, customReflection] = generateAliases(aliases, {
|
|
109
110
|
cppStringType,
|
|
110
111
|
});
|
|
111
112
|
|
|
112
113
|
files.set(
|
|
113
114
|
`Native${preferredModuleName}Spec.g.h`,
|
|
114
115
|
moduleTemplate
|
|
115
|
-
.replace(/::
|
|
116
|
+
.replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)
|
|
117
|
+
.replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)
|
|
116
118
|
.replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))
|
|
117
119
|
.replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))
|
|
118
120
|
.replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)
|