Skip to content

Commit

Permalink
@rnw/codegen generates GetStructInfo instead of REACT_STRUCT (microso…
Browse files Browse the repository at this point in the history
…ft#11982)

* #include <NativeModules.h>

* Separate custom types and reflection in template

* Generate GetStructInfo function instead of REACT_STRUCT

* ...

* Update generated files

* Change files

* ...
  • Loading branch information
ZihanChen-MSFT committed Aug 15, 2023
1 parent 10eaa86 commit 7ef38a1
Show file tree
Hide file tree
Showing 71 changed files with 1,503 additions and 456 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "@rnw/codegen generates GetStructInfo instead of REACT_STRUCT",
"packageName": "@react-native-windows/codegen",
"email": "53799235+ZihanChen-MSFT@users.noreply.github.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "@rnw/codegen generates GetStructInfo instead of REACT_STRUCT",
"packageName": "react-native-windows",
"email": "53799235+ZihanChen-MSFT@users.noreply.github.com",
"dependentChangeType": "patch"
}
58 changes: 45 additions & 13 deletions packages/@react-native-windows/codegen/src/generators/AliasGen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import type {
import {AliasMap, getAliasCppName} from './AliasManaging';
import {CppCodegenOptions, translateField} from './ObjectTypes';

function translateObjectBody(
function translateObjectMembersDefinition(
type: NativeModuleObjectTypeAnnotation,
aliases: AliasMap,
baseAliasName: string,
Expand All @@ -28,14 +28,24 @@ function translateObjectBody(
if (prop.optional && propType.type !== 'NullableTypeAnnotation') {
propType = {type: 'NullableTypeAnnotation', typeAnnotation: propType};
}
const first = `${prefix}REACT_FIELD(${prop.name})`;
const second = `${prefix}${translateField(
return `${prefix}${translateField(
propType,
aliases,
`${baseAliasName}_${prop.name}`,
options,
)} ${prop.name};`;
return `${first}\n${second}`;
})
.join('\n');
}

function translateObjectMembersReflection(
type: NativeModuleObjectTypeAnnotation,
aliasCppName: string,
prefix: string,
) {
return type.properties
.map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {
return `${prefix}{L"${prop.name}", &${aliasCppName}::${prop.name}},`;
})
.join('\n');
}
Expand All @@ -50,8 +60,13 @@ export function createAliasMap(nativeModuleAliases: {
return aliases;
}

interface AliasCode {
definition: string;
reflection: string;
}

interface AliasCodeMap {
[name: string]: string;
[name: string]: AliasCode;
}

function generateSingleAlias(
Expand All @@ -60,13 +75,28 @@ function generateSingleAlias(
aliasCode: AliasCodeMap,
options: CppCodegenOptions,
): void {
const aliasCppName = getAliasCppName(aliasName);
const aliasType = <NativeModuleObjectTypeAnnotation>aliases.types[aliasName];
aliasCode[aliasName] = `
REACT_STRUCT(${getAliasCppName(aliasName)})
struct ${getAliasCppName(aliasName)} {
${translateObjectBody(aliasType, aliases, aliasName, ' ', options)}
const definition = `
struct ${aliasCppName} {
${translateObjectMembersDefinition(
aliasType,
aliases,
aliasName,
' ',
options,
)}
};
`;
const reflection = `
inline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {
winrt::Microsoft::ReactNative::FieldMap fieldMap {
${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}
};
return fieldMap;
}
`;
aliasCode[aliasName] = {definition, reflection};
}

function generateNestedAliasesInCorrectOrder(
Expand Down Expand Up @@ -103,15 +133,17 @@ function generateNestedAliasesInCorrectOrder(
export function generateAliases(
aliases: AliasMap,
options: CppCodegenOptions,
): string {
): [string, string] {
const aliasCode: AliasCodeMap = {};
const aliasOrder: string[] = [];
generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);

// aliasOrder now has the correct order of C++ struct code
let traversedAliasedStructs = '';
let customTypes = '';
let customReflection = '';
for (const aliasName of aliasOrder) {
traversedAliasedStructs = `${traversedAliasedStructs}${aliasCode[aliasName]}`;
customTypes = `${customTypes}${aliasCode[aliasName].definition}`;
customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;
}
return traversedAliasedStructs;
return [customTypes, customReflection];
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@ const moduleTemplate = `
*/
#pragma once
#include "NativeModules.h"
#include <NativeModules.h>
#include <tuple>
namespace ::_NAMESPACE_:: {
::_MODULE_ALIASED_STRUCTS_::
::_MODULE_CUSTPM_TYPES_::
::_MODULE_CUSTPM_TYPES_REFLECTION_::
struct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {
::_MODULE_MEMBERS_TUPLES_::
Expand Down Expand Up @@ -105,14 +106,15 @@ ${errors}`;
}

// generate code for structs
const traversedAliasedStructs = generateAliases(aliases, {
const [customTypes, customReflection] = generateAliases(aliases, {
cppStringType,
});

files.set(
`Native${preferredModuleName}Spec.g.h`,
moduleTemplate
.replace(/::_MODULE_ALIASED_STRUCTS_::/g, traversedAliasedStructs)
.replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)
.replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)
.replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))
.replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))
.replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)
Expand Down
16 changes: 11 additions & 5 deletions packages/sample-apps/codegen/NativeMyModuleSpec.g.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,27 @@
*/
#pragma once

#include "NativeModules.h"
#include <NativeModules.h>
#include <tuple>

namespace SampleLibraryCodegen {

REACT_STRUCT(MyModuleSpec_Constants)
struct MyModuleSpec_Constants {
REACT_FIELD(const1)
bool const1;
REACT_FIELD(const2)
double const2;
REACT_FIELD(const3)
std::string const3;
};


inline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(MyModuleSpec_Constants*) noexcept {
winrt::Microsoft::ReactNative::FieldMap fieldMap {
{L"const1", &MyModuleSpec_Constants::const1},
{L"const2", &MyModuleSpec_Constants::const2},
{L"const3", &MyModuleSpec_Constants::const3},
};
return fieldMap;
}

struct MyModuleSpec : winrt::Microsoft::ReactNative::TurboModuleSpec {
static constexpr auto constants = std::tuple{
TypedConstant<MyModuleSpec_Constants>{0},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@
"NETStandard.Library": "2.0.3"
}
},
"Microsoft.UI.Xaml": {
"type": "Direct",
"requested": "[2.8.0, )",
"resolved": "2.8.0",
"contentHash": "vxdHxTr63s5KVtNddMFpgvjBjUH50z7seq/5jLWmmSuf8poxg+sXrywkofUdE8ZstbpO9y3FL/IXXUcPYbeesA==",
"dependencies": {
"Microsoft.Web.WebView2": "1.0.1264.42"
}
},
"MSTest.TestAdapter": {
"type": "Direct",
"requested": "[2.2.10, )",
Expand All @@ -44,16 +53,6 @@
"resolved": "13.0.1",
"contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
},
"boost": {
"type": "Transitive",
"resolved": "1.76.0",
"contentHash": "p+w3YvNdXL8Cu9Fzrmexssu0tZbWxuf6ywsQqHjDlKFE5ojXHof1HIyMC3zDLfLnh80dIeFcEUAuR2Asg/XHRA=="
},
"Microsoft.JavaScript.Hermes": {
"type": "Transitive",
"resolved": "0.1.15",
"contentHash": "My/u5RvxoymtwWokoweU6iVpuP79w271UjadcmSNqnQ9ESIv00tlVP4sHnIiN3t2lJNDeciyE1EVF4swGPECKQ=="
},
"Microsoft.Net.Native.Compiler": {
"type": "Transitive",
"resolved": "2.2.7-rel-27913-00",
Expand All @@ -78,35 +77,22 @@
"Microsoft.NETCore.Platforms": {
"type": "Transitive",
"resolved": "2.1.0",
"contentHash": "GmkKfoyerqmsHMn7OZj0AKpcBabD+GaafqphvX2Mw406IwiJRy1pKcKqdCfKJfYmkRyJ6+e+RaUylgdJoDa1jQ=="
"contentHash": "ok+RPAtESz/9MUXeIEz6Lv5XAGQsaNmEYXMsgVALj4D7kqC8gveKWXWXbufLySR2fWrwZf8smyN5RmHu0e4BHA=="
},
"Microsoft.NETCore.Targets": {
"type": "Transitive",
"resolved": "1.0.1",
"contentHash": "rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw=="
},
"Microsoft.UI.Xaml": {
"type": "Transitive",
"resolved": "2.8.0",
"contentHash": "vxdHxTr63s5KVtNddMFpgvjBjUH50z7seq/5jLWmmSuf8poxg+sXrywkofUdE8ZstbpO9y3FL/IXXUcPYbeesA==",
"dependencies": {
"Microsoft.Web.WebView2": "1.0.1264.42"
}
},
"Microsoft.Web.WebView2": {
"type": "Transitive",
"resolved": "1.0.1264.42",
"contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
},
"Microsoft.Windows.SDK.BuildTools": {
"type": "Transitive",
"resolved": "10.0.22000.194",
"contentHash": "4L0P3zqut466SIqT3VBeLTNUQTxCBDOrTRymRuROCRJKazcK7ibLz9yAO1nKWRt50ttCj39oAa2Iuz9ZTDmLlg=="
},
"NETStandard.Library": {
"type": "Transitive",
"resolved": "2.0.3",
"contentHash": "548M6mnBSJWxsIlkQHfbzoYxpiYFXZZSL00p4GHYv8PkiqFBnnT68mW5mGEsA/ch9fDO9GkPgkFQpWiXZN7mAQ==",
"contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0"
}
Expand Down Expand Up @@ -250,7 +236,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1"
Expand Down Expand Up @@ -306,7 +292,6 @@
"folly": {
"type": "Project",
"dependencies": {
"boost": "[1.76.0, )",
"fmt": "[1.0.0, )"
}
},
Expand All @@ -315,11 +300,7 @@
"dependencies": {
"Common": "[1.0.0, )",
"Folly": "[1.0.0, )",
"Microsoft.JavaScript.Hermes": "[0.1.15, )",
"Microsoft.UI.Xaml": "[2.8.0, )",
"Microsoft.Windows.SDK.BuildTools": "[10.0.22000.194, )",
"ReactCommon": "[1.0.0, )",
"boost": "[1.76.0, )"
"ReactCommon": "[1.0.0, )"
}
},
"microsoft.reactnative.managed": {
Expand All @@ -332,8 +313,7 @@
"reactcommon": {
"type": "Project",
"dependencies": {
"Folly": "[1.0.0, )",
"boost": "[1.76.0, )"
"Folly": "[1.0.0, )"
}
}
},
Expand Down Expand Up @@ -483,7 +463,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down Expand Up @@ -702,7 +682,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down Expand Up @@ -933,7 +913,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down Expand Up @@ -1142,7 +1122,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down Expand Up @@ -1361,7 +1341,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down Expand Up @@ -1570,7 +1550,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down Expand Up @@ -1789,7 +1769,7 @@
"System.Runtime": {
"type": "Transitive",
"resolved": "4.1.0",
"contentHash": "SwXraLtIWEZwfE/jOT+WFtP/tsX2KhIdgRQt330CQckx/pbRk7e/Aigak2hFjgdkRmdmVXz6lwkDXcdtj913Bg==",
"contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
Expand Down
Loading

0 comments on commit 7ef38a1

Please sign in to comment.