UNPKG

nitro-codegen

Version:

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

74 lines (66 loc) 2.98 kB
import { NitroConfig } from '../../config/NitroConfig.js'; import { getForwardDeclaration } from '../../syntax/c++/getForwardDeclaration.js'; import { includeHeader } from '../../syntax/c++/includeNitroHeader.js'; import { getAllKnownTypes } from '../../syntax/createType.js'; import { getHybridObjectName } from '../../syntax/getHybridObjectName.js'; import { createFileMetadataString, isNotDuplicate, } from '../../syntax/helpers.js'; import { getTypeAs } from '../../syntax/types/getTypeAs.js'; import { HybridObjectType } from '../../syntax/types/HybridObjectType.js'; export function getUmbrellaHeaderName() { const moduleName = NitroConfig.getIosModuleName(); return `${moduleName}-Swift-Cxx-Umbrella.hpp`; } export function createSwiftUmbrellaHeader() { const moduleName = NitroConfig.getIosModuleName(); const filename = getUmbrellaHeaderName(); const types = getAllKnownTypes('swift'); const swiftForwardDeclares = types .filter((t) => t.kind === 'hybrid-object') .map((t) => { const hybridObjectType = getTypeAs(t, HybridObjectType); const name = getHybridObjectName(hybridObjectType.hybridObjectName); return getForwardDeclaration('class', name.HybridTSpecCxx, moduleName); }) .filter(isNotDuplicate); const imports = types.flatMap((t) => t.getRequiredImports()); const forwardDeclarations = imports .map((i) => i.forwardDeclaration) .filter((f) => f != null) .filter(isNotDuplicate); const includes = imports.map((i) => includeHeader(i)).filter(isNotDuplicate); const code = ` ${createFileMetadataString(filename, '///')} #pragma once // Forward declarations of C++ defined types ${forwardDeclarations.sort().join('\n')} // Include C++ defined types ${includes.sort().join('\n')} // C++ helpers for Swift #include "${moduleName}-Swift-Cxx-Bridge.hpp" // Common C++ types used in Swift #include <NitroModules/ArrayBufferHolder.hpp> #include <NitroModules/AnyMapHolder.hpp> #include <NitroModules/RuntimeError.hpp> #include <NitroModules/DateToChronoDate.hpp> // Forward declarations of Swift defined types ${swiftForwardDeclares.sort().join('\n')} // Include Swift defined types #if __has_include("${moduleName}-Swift.h") // This header is generated by Xcode/Swift on every app build. // If it cannot be found, make sure the Swift module's name (= podspec name) is actually "${moduleName}". #include "${moduleName}-Swift.h" // Same as above, but used when building with frameworks (\`use_frameworks\`) #elif __has_include(<${moduleName}/${moduleName}-Swift.h>) #include <${moduleName}/${moduleName}-Swift.h> #else #error ${moduleName}'s autogenerated Swift header cannot be found! Make sure the Swift module's name (= podspec name) is actually "${moduleName}", and try building the app first. #endif `; return { content: code, language: 'c++', name: filename, platform: 'ios', subdirectory: [], }; }