UNPKG

nitro-codegen

Version:

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

75 lines (74 loc) 2.07 kB
import { escapeCppName, isNotDuplicate } from '../helpers.js'; import {} from '../SourceFile.js'; export const VariantLabels = [ 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eigth', 'ninth', 'tenth', ]; export class VariantType { variants; aliasName; constructor(variants, aliasName) { this.variants = variants; this.aliasName = aliasName; } get canBePassedByReference() { // It's a variant<..> - heavy to copy return true; } get kind() { return 'variant'; } get jsType() { return this.variants.map((v) => v.kind).join(' | '); } get cases() { return this.variants.map((v, i) => { const label = VariantLabels[i]; if (label == null) throw new Error(`Variant<...> (\`${this.jsType}\`) does not support ${i} cases!`); return [label, v]; }); } getAliasName(language) { if (this.aliasName == null) { const variants = this.variants.map((v) => v.getCode(language)); return escapeCppName(`Variant_${variants.join('_')}`); } return this.aliasName; } getCode(language) { const types = this.variants .map((v) => v.getCode(language)) .filter(isNotDuplicate); switch (language) { case 'c++': return `std::variant<${types.join(', ')}>`; case 'swift': case 'kotlin': return this.getAliasName(language); default: throw new Error(`Language ${language} is not yet supported for VariantType!`); } } getExtraFiles() { return this.variants.flatMap((v) => v.getExtraFiles()); } getRequiredImports() { return [ { language: 'c++', name: 'variant', space: 'system', }, ...this.variants.flatMap((v) => v.getRequiredImports()), ]; } }