UNPKG

nitro-codegen

Version:

The code-generator for react-native-nitro-modules.

71 lines (64 loc) 2.37 kB
import { NitroConfig } from '../../config/NitroConfig.js' import { indent } from '../../utils.js' import { getHybridObjectName } from '../getHybridObjectName.js' import type { SourceImport } from '../SourceFile.js' import { HybridObjectType } from '../types/HybridObjectType.js' import { SwiftCxxBridgedType } from './SwiftCxxBridgedType.js' interface Props { /** * The name of the Hybrid Object under which it should be registered and exposed to JS to. */ hybridObjectName: string /** * The name of the Swift class that will be default-constructed */ swiftClassName: string } interface SwiftHybridObjectRegistration { cppCode: string swiftFunction: string requiredImports: SourceImport[] } export function getHybridObjectConstructorCall( hybridObjectName: string ): string { const swiftNamespace = NitroConfig.getIosModuleName() const autolinkingClassName = `${NitroConfig.getIosModuleName()}Autolinking` return `${swiftNamespace}::${autolinkingClassName}::create${hybridObjectName}();` } export function createSwiftHybridObjectRegistration({ hybridObjectName, swiftClassName, }: Props): SwiftHybridObjectRegistration { 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(), } }