nitro-codegen
Version:
The code-generator for react-native-nitro-modules.
76 lines (70 loc) • 2.26 kB
JavaScript
import { NitroConfig } from '../../config/NitroConfig.js';
import { indent } from '../../utils.js';
import { createFileMetadataString } from '../helpers.js';
import { Parameter } from '../Parameter.js';
import { StructType } from '../types/StructType.js';
import { SwiftCxxBridgedType } from './SwiftCxxBridgedType.js';
import { getBridgeNamespace } from './SwiftHybridObjectBridge.js';
export function createSwiftStructBridge(struct) {
const fullName = NitroConfig.getCxxNamespace('swift', struct.structName);
const init = createSwiftBridgedConstructor(struct);
const bridgedProps = struct.properties
.map((p) => {
const bridge = new SwiftCxxBridgedType(p, true);
const cppName = `self.__${p.escapedName}`;
return `
var ${p.escapedName}: ${p.getCode('swift')} {
@inline(__always)
get {
return ${indent(bridge.parseFromCppToSwift(cppName, 'swift'), ' ')}
}
@inline(__always)
set {
${cppName} = ${indent(bridge.parseFromSwiftToCpp('newValue', 'swift'), ' ')}
}
}
`.trim();
})
.join('\n\n');
const code = `
${createFileMetadataString(`${struct.structName}.swift`)}
import NitroModules
/**
* Represents an instance of \`${struct.structName}\`, backed by a C++ struct.
*/
public typealias ${struct.structName} = ${fullName}
public extension ${struct.structName} {
private typealias bridge = ${getBridgeNamespace()}
${indent(init, ' ')}
${indent(bridgedProps, ' ')}
}
`.trim();
return {
content: code,
language: 'swift',
name: `${struct.structName}.swift`,
platform: 'ios',
subdirectory: [],
referencedTypes: struct.properties,
};
}
function createSwiftBridgedConstructor(struct) {
const params = struct.properties
.map((p) => new Parameter(p.escapedName, p))
.map((p) => p.getCode('swift'))
.join(', ');
const paramsForward = struct.properties
.map((p) => {
const bridged = new SwiftCxxBridgedType(p, true);
return bridged.parseFromSwiftToCpp(p.escapedName, 'swift');
})
.join(', ');
return `
/**
* Create a new instance of \`${struct.structName}\`.
*/
init(${params}) {
self.init(${indent(paramsForward, ' ')})
}
`.trim();
}