nitro-codegen
Version:
The code-generator for react-native-nitro-modules.
43 lines (42 loc) • 1.92 kB
JavaScript
import { NitroConfig } from '../../config/NitroConfig.js';
import { indent } from '../../utils.js';
import { getHybridObjectName } from '../getHybridObjectName.js';
import { HybridObjectType } from '../types/HybridObjectType.js';
import { SwiftCxxBridgedType } from './SwiftCxxBridgedType.js';
export function getHybridObjectConstructorCall(hybridObjectName) {
const swiftNamespace = NitroConfig.getIosModuleName();
const autolinkingClassName = `${NitroConfig.getIosModuleName()}Autolinking`;
return `${swiftNamespace}::${autolinkingClassName}::create${hybridObjectName}();`;
}
export function createSwiftHybridObjectRegistration({ hybridObjectName, swiftClassName, }) {
const { HybridTSpecCxx, HybridTSpecSwift, HybridTSpec } = getHybridObjectName(hybridObjectName);
const type = new HybridObjectType(hybridObjectName, 'swift', []);
const bridge = new SwiftCxxBridgedType(type);
return {
swiftFunction: `
/**
* Creates an instance of a Swift class that implements \`${HybridTSpec}\`,
* and wraps it in a Swift class that can directly interop with C++ (\`${HybridTSpecCxx}\`)
*
* This is generated by Nitrogen and will initialize the class specified
* in the \`"autolinking"\` property of \`nitro.json\` (in this case, \`${swiftClassName}\`).
*/
public static func create${hybridObjectName}() -> ${bridge.getTypeCode('swift')} {
let hybridObject = ${swiftClassName}()
return ${indent(bridge.parseFromSwiftToCpp('hybridObject', 'swift'), ' ')}
}
`.trim(),
requiredImports: [
{ name: `${HybridTSpecSwift}.hpp`, language: 'c++', space: 'user' },
],
cppCode: `
HybridObjectRegistry::registerHybridObjectConstructor(
"${hybridObjectName}",
[]() -> std::shared_ptr<HybridObject> {
${type.getCode('c++')} hybridObject = ${getHybridObjectConstructorCall(hybridObjectName)}
return hybridObject;
}
);
`.trim(),
};
}