nitro-codegen
Version:
The code-generator for react-native-nitro-modules.
108 lines (98 loc) • 3.02 kB
text/typescript
import { NitroConfig } from '../../config/NitroConfig.js'
import type { Language } from '../../getPlatformSpecs.js'
import { getForwardDeclaration } from '../c++/getForwardDeclaration.js'
import { getHybridObjectName } from '../getHybridObjectName.js'
import type { HybridObjectSpec } from '../HybridObjectSpec.js'
import type { SourceFile, SourceImport } from '../SourceFile.js'
import type { Type, TypeKind } from './Type.js'
export class HybridObjectType implements Type {
readonly hybridObjectName: string
readonly implementationLanguage: Language
readonly baseTypes: HybridObjectType[]
constructor(
hybridObjectName: string,
implementationLanguage: Language,
baseTypes: HybridObjectType[]
)
constructor(spec: HybridObjectSpec)
constructor(
...args:
| [
hybridObjectName: string,
implementationLanguage: Language,
baseTypes: HybridObjectType[],
]
| [HybridObjectSpec]
) {
if (args.length === 1) {
const [spec] = args
this.hybridObjectName = spec.name
this.implementationLanguage = spec.language
this.baseTypes = spec.baseTypes.map((b) => new HybridObjectType(b))
} else {
const [hybridObjectName, implementationLanguage, baseTypes] = args
this.hybridObjectName = hybridObjectName
this.implementationLanguage = implementationLanguage
this.baseTypes = baseTypes
}
if (this.hybridObjectName.startsWith('__')) {
throw new Error(
`HybridObject name cannot start with two underscores (__)! (In ${this.hybridObjectName})`
)
}
}
get canBePassedByReference(): boolean {
// It's a shared_ptr<..>, no copy.
return true
}
get kind(): TypeKind {
return 'hybrid-object'
}
getCode(language: Language, mode: 'strong' | 'weak' = 'strong'): string {
const name = getHybridObjectName(this.hybridObjectName)
switch (language) {
case 'c++': {
const fullName = NitroConfig.getCxxNamespace('c++', name.HybridTSpec)
if (mode === 'strong') {
return `std::shared_ptr<${fullName}>`
} else {
return `std::weak_ptr<${fullName}>`
}
}
case 'swift': {
return `(any ${name.HybridTSpec})`
}
case 'kotlin': {
return name.HybridTSpec
}
default:
throw new Error(
`Language ${language} is not yet supported for HybridObjectType!`
)
}
}
getExtraFiles(): SourceFile[] {
return []
}
getRequiredImports(): SourceImport[] {
const name = getHybridObjectName(this.hybridObjectName)
const cxxNamespace = NitroConfig.getCxxNamespace('c++')
return [
{
language: 'c++',
name: 'memory',
space: 'system',
},
{
name: `${name.HybridTSpec}.hpp`,
forwardDeclaration: getForwardDeclaration(
'class',
name.HybridTSpec,
cxxNamespace
),
language: 'c++',
space: 'user',
},
]
}
}