nitro-codegen
Version:
The code-generator for react-native-nitro-modules.
98 lines (88 loc) • 3.44 kB
JavaScript
import { NitroConfig } from '../../config/NitroConfig.js';
import { createCppHybridObjectRegistration } from '../../syntax/c++/CppHybridObjectRegistration.js';
import { includeHeader } from '../../syntax/c++/includeNitroHeader.js';
import { createFileMetadataString } from '../../syntax/helpers.js';
import { getBridgeNamespace } from '../../syntax/swift/SwiftHybridObjectBridge.js';
import { createSwiftHybridObjectRegistration } from '../../syntax/swift/SwiftHybridObjectRegistration.js';
import { indent } from '../../utils.js';
import { getUmbrellaHeaderName } from './createSwiftUmbrellaHeader.js';
export function createHybridObjectIntializer() {
const autolinkingClassName = `${NitroConfig.getIosModuleName()}Autolinking`;
const umbrellaHeaderName = getUmbrellaHeaderName();
const autolinkedHybridObjects = NitroConfig.getAutolinkedHybridObjects();
const swiftFunctions = [];
const cppRegistrations = [];
const cppImports = [];
let containsSwiftObjects = false;
for (const hybridObjectName of Object.keys(autolinkedHybridObjects)) {
const config = autolinkedHybridObjects[hybridObjectName];
if (config?.cpp != null) {
// Autolink a C++ HybridObject!
const { cppCode, requiredImports } = createCppHybridObjectRegistration({
hybridObjectName: hybridObjectName,
cppClassName: config.cpp,
});
cppImports.push(...requiredImports);
cppRegistrations.push(cppCode);
}
if (config?.swift != null) {
// Autolink a Swift HybridObject!
containsSwiftObjects = true;
const { cppCode, requiredImports, swiftFunction } = createSwiftHybridObjectRegistration({
hybridObjectName: hybridObjectName,
swiftClassName: config.swift,
});
cppImports.push(...requiredImports);
cppRegistrations.push(cppCode);
swiftFunctions.push(swiftFunction);
}
}
if (cppRegistrations.length === 0) {
// Nothing to autolink!
return [];
}
const umbrellaImport = containsSwiftObjects
? `#import "${umbrellaHeaderName}"`
: '';
const imports = cppImports.map((i) => includeHeader(i, true)).join('\n');
const objcCode = `
${createFileMetadataString(`${autolinkingClassName}.mm`)}
#import <Foundation/Foundation.h>
#import <NitroModules/HybridObjectRegistry.hpp>
${umbrellaImport}
#import <type_traits>
${imports}
@interface ${autolinkingClassName} : NSObject
@end
@implementation ${autolinkingClassName}
+ (void) load {
using namespace margelo::nitro;
using namespace ${NitroConfig.getCxxNamespace('c++')};
${indent(cppRegistrations.join('\n'), ' ')}
}
@end
`.trim();
const swiftCode = `
${createFileMetadataString(`${autolinkingClassName}.swift`)}
public final class ${autolinkingClassName} {
public typealias bridge = ${getBridgeNamespace()}
${indent(swiftFunctions.join('\n\n'), ' ')}
}
`.trim();
return [
{
content: objcCode,
language: 'objective-c++',
name: `${autolinkingClassName}.mm`,
platform: 'ios',
subdirectory: [],
},
{
content: swiftCode,
language: 'swift',
name: `${autolinkingClassName}.swift`,
platform: 'ios',
subdirectory: [],
},
];
}