nitrogen 0.2.24 → 0.29.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -109
- package/lib/Logger.d.ts +10 -0
- package/lib/Logger.js +56 -0
- package/lib/autolinking/Autolinking.d.ts +8 -0
- package/lib/autolinking/Autolinking.js +1 -0
- package/lib/autolinking/android/createCMakeExtension.d.ts +6 -0
- package/lib/autolinking/android/createCMakeExtension.js +106 -0
- package/lib/autolinking/android/createGradleExtension.d.ts +5 -0
- package/lib/autolinking/android/createGradleExtension.js +36 -0
- package/lib/autolinking/android/createHybridObjectInitializer.d.ts +2 -0
- package/lib/autolinking/android/createHybridObjectInitializer.js +159 -0
- package/lib/autolinking/createAndroidAutolinking.d.ts +11 -0
- package/lib/autolinking/createAndroidAutolinking.js +13 -0
- package/lib/autolinking/createIOSAutolinking.d.ts +5 -0
- package/lib/autolinking/createIOSAutolinking.js +19 -0
- package/lib/autolinking/ios/createHybridObjectInitializer.d.ts +9 -0
- package/lib/autolinking/ios/createHybridObjectInitializer.js +97 -0
- package/lib/autolinking/ios/createPodspecRubyExtension.d.ts +5 -0
- package/lib/autolinking/ios/createPodspecRubyExtension.js +69 -0
- package/lib/autolinking/ios/createSwiftCxxBridge.d.ts +2 -0
- package/lib/autolinking/ios/createSwiftCxxBridge.js +117 -0
- package/lib/autolinking/ios/createSwiftUmbrellaHeader.d.ts +3 -0
- package/lib/autolinking/ios/createSwiftUmbrellaHeader.js +74 -0
- package/lib/config/NitroConfig.d.ts +52 -0
- package/lib/config/NitroConfig.js +112 -0
- package/lib/config/NitroUserConfig.d.ts +22 -0
- package/lib/config/NitroUserConfig.js +88 -0
- package/lib/config/getConfig.d.ts +2 -0
- package/lib/config/getConfig.js +84 -0
- package/lib/createGitAttributes.d.ts +1 -0
- package/lib/createGitAttributes.js +11 -0
- package/lib/createPlatformSpec.d.ts +4 -0
- package/lib/createPlatformSpec.js +127 -0
- package/lib/getFiles.d.ts +1 -0
- package/lib/getFiles.js +28 -0
- package/lib/getPlatformSpecs.d.ts +17 -0
- package/lib/getPlatformSpecs.js +153 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +113 -10
- package/lib/init.d.ts +1 -0
- package/lib/init.js +123 -0
- package/lib/nitrogen.d.ts +11 -0
- package/lib/nitrogen.js +165 -0
- package/lib/prettifyDirectory.d.ts +1 -0
- package/lib/prettifyDirectory.js +27 -0
- package/lib/syntax/BridgedType.d.ts +41 -0
- package/lib/syntax/BridgedType.js +1 -0
- package/lib/syntax/CodeNode.d.ts +23 -0
- package/lib/syntax/CodeNode.js +1 -0
- package/lib/syntax/HybridObjectSpec.d.ts +13 -0
- package/lib/syntax/HybridObjectSpec.js +1 -0
- package/lib/syntax/Method.d.ts +41 -0
- package/lib/syntax/Method.js +108 -0
- package/lib/syntax/Parameter.d.ts +15 -0
- package/lib/syntax/Parameter.js +65 -0
- package/lib/syntax/Property.d.ts +50 -0
- package/lib/syntax/Property.js +147 -0
- package/lib/syntax/SourceFile.d.ts +70 -0
- package/lib/syntax/SourceFile.js +7 -0
- package/lib/syntax/c++/CppEnum.d.ts +6 -0
- package/lib/syntax/c++/CppEnum.js +110 -0
- package/lib/syntax/c++/CppHybridObject.d.ts +3 -0
- package/lib/syntax/c++/CppHybridObject.js +146 -0
- package/lib/syntax/c++/CppHybridObjectRegistration.d.ts +17 -0
- package/lib/syntax/c++/CppHybridObjectRegistration.js +18 -0
- package/lib/syntax/c++/CppStruct.d.ts +3 -0
- package/lib/syntax/c++/CppStruct.js +108 -0
- package/lib/syntax/c++/CppUnion.d.ts +6 -0
- package/lib/syntax/c++/CppUnion.js +88 -0
- package/lib/syntax/c++/getForwardDeclaration.d.ts +3 -0
- package/lib/syntax/c++/getForwardDeclaration.js +14 -0
- package/lib/syntax/c++/includeNitroHeader.d.ts +7 -0
- package/lib/syntax/c++/includeNitroHeader.js +34 -0
- package/lib/syntax/createType.d.ts +15 -0
- package/lib/syntax/createType.js +303 -0
- package/lib/syntax/getAllTypes.d.ts +3 -0
- package/lib/syntax/getAllTypes.js +11 -0
- package/lib/syntax/getCustomTypeConfig.d.ts +8 -0
- package/lib/syntax/getCustomTypeConfig.js +53 -0
- package/lib/syntax/getHybridObjectName.d.ts +36 -0
- package/lib/syntax/getHybridObjectName.js +10 -0
- package/lib/syntax/getInterfaceProperties.d.ts +4 -0
- package/lib/syntax/getInterfaceProperties.js +9 -0
- package/lib/syntax/getReferencedTypes.d.ts +2 -0
- package/lib/syntax/getReferencedTypes.js +47 -0
- package/lib/syntax/helpers.d.ts +13 -0
- package/lib/syntax/helpers.js +53 -0
- package/lib/syntax/isCoreType.d.ts +9 -0
- package/lib/syntax/isCoreType.js +47 -0
- package/lib/syntax/kotlin/FbjniHybridObject.d.ts +3 -0
- package/lib/syntax/kotlin/FbjniHybridObject.js +261 -0
- package/lib/syntax/kotlin/JNINativeRegistrations.d.ts +8 -0
- package/lib/syntax/kotlin/JNINativeRegistrations.js +7 -0
- package/lib/syntax/kotlin/KotlinBoxedPrimitive.d.ts +7 -0
- package/lib/syntax/kotlin/KotlinBoxedPrimitive.js +17 -0
- package/lib/syntax/kotlin/KotlinCxxBridgedType.d.ts +19 -0
- package/lib/syntax/kotlin/KotlinCxxBridgedType.js +893 -0
- package/lib/syntax/kotlin/KotlinEnum.d.ts +3 -0
- package/lib/syntax/kotlin/KotlinEnum.js +113 -0
- package/lib/syntax/kotlin/KotlinFunction.d.ts +3 -0
- package/lib/syntax/kotlin/KotlinFunction.js +256 -0
- package/lib/syntax/kotlin/KotlinHybridObject.d.ts +3 -0
- package/lib/syntax/kotlin/KotlinHybridObject.js +177 -0
- package/lib/syntax/kotlin/KotlinHybridObjectRegistration.d.ts +17 -0
- package/lib/syntax/kotlin/KotlinHybridObjectRegistration.js +26 -0
- package/lib/syntax/kotlin/KotlinStruct.d.ts +3 -0
- package/lib/syntax/kotlin/KotlinStruct.js +172 -0
- package/lib/syntax/kotlin/KotlinVariant.d.ts +3 -0
- package/lib/syntax/kotlin/KotlinVariant.js +191 -0
- package/lib/syntax/swift/SwiftCxxBridgedType.d.ts +21 -0
- package/lib/syntax/swift/SwiftCxxBridgedType.js +819 -0
- package/lib/syntax/swift/SwiftCxxTypeHelper.d.ts +17 -0
- package/lib/syntax/swift/SwiftCxxTypeHelper.js +613 -0
- package/lib/syntax/swift/SwiftEnum.d.ts +3 -0
- package/lib/syntax/swift/SwiftEnum.js +52 -0
- package/lib/syntax/swift/SwiftFunction.d.ts +3 -0
- package/lib/syntax/swift/SwiftFunction.js +83 -0
- package/lib/syntax/swift/SwiftHybridObject.d.ts +3 -0
- package/lib/syntax/swift/SwiftHybridObject.js +103 -0
- package/lib/syntax/swift/SwiftHybridObjectBridge.d.ts +11 -0
- package/lib/syntax/swift/SwiftHybridObjectBridge.js +451 -0
- package/lib/syntax/swift/SwiftHybridObjectRegistration.d.ts +19 -0
- package/lib/syntax/swift/SwiftHybridObjectRegistration.js +42 -0
- package/lib/syntax/swift/SwiftStruct.d.ts +3 -0
- package/lib/syntax/swift/SwiftStruct.js +75 -0
- package/lib/syntax/swift/SwiftVariant.d.ts +3 -0
- package/lib/syntax/swift/SwiftVariant.js +58 -0
- package/lib/syntax/types/ArrayBufferType.d.ts +10 -0
- package/lib/syntax/types/ArrayBufferType.js +37 -0
- package/lib/syntax/types/ArrayType.d.ts +12 -0
- package/lib/syntax/types/ArrayType.js +52 -0
- package/lib/syntax/types/BigIntType.d.ts +10 -0
- package/lib/syntax/types/BigIntType.js +27 -0
- package/lib/syntax/types/BooleanType.d.ts +10 -0
- package/lib/syntax/types/BooleanType.js +27 -0
- package/lib/syntax/types/CustomType.d.ts +14 -0
- package/lib/syntax/types/CustomType.js +36 -0
- package/lib/syntax/types/DateType.d.ts +10 -0
- package/lib/syntax/types/DateType.js +35 -0
- package/lib/syntax/types/EnumType.d.ts +23 -0
- package/lib/syntax/types/EnumType.js +101 -0
- package/lib/syntax/types/ErrorType.d.ts +11 -0
- package/lib/syntax/types/ErrorType.js +37 -0
- package/lib/syntax/types/FunctionType.d.ts +29 -0
- package/lib/syntax/types/FunctionType.js +147 -0
- package/lib/syntax/types/HybridObjectBaseType.d.ts +11 -0
- package/lib/syntax/types/HybridObjectBaseType.js +38 -0
- package/lib/syntax/types/HybridObjectType.d.ts +23 -0
- package/lib/syntax/types/HybridObjectType.js +131 -0
- package/lib/syntax/types/MapType.d.ts +10 -0
- package/lib/syntax/types/MapType.js +37 -0
- package/lib/syntax/types/NamedWrappingType.d.ts +14 -0
- package/lib/syntax/types/NamedWrappingType.js +27 -0
- package/lib/syntax/types/NullType.d.ts +10 -0
- package/lib/syntax/types/NullType.js +23 -0
- package/lib/syntax/types/NumberType.d.ts +10 -0
- package/lib/syntax/types/NumberType.js +27 -0
- package/lib/syntax/types/OptionalType.d.ts +13 -0
- package/lib/syntax/types/OptionalType.js +59 -0
- package/lib/syntax/types/PromiseType.d.ts +16 -0
- package/lib/syntax/types/PromiseType.js +62 -0
- package/lib/syntax/types/RecordType.d.ts +13 -0
- package/lib/syntax/types/RecordType.js +47 -0
- package/lib/syntax/types/ResultWrappingType.d.ts +13 -0
- package/lib/syntax/types/ResultWrappingType.js +44 -0
- package/lib/syntax/types/StringType.d.ts +10 -0
- package/lib/syntax/types/StringType.js +35 -0
- package/lib/syntax/types/StructType.d.ts +14 -0
- package/lib/syntax/types/StructType.js +61 -0
- package/lib/syntax/types/TupleType.d.ts +12 -0
- package/lib/syntax/types/TupleType.js +39 -0
- package/lib/syntax/types/Type.d.ts +55 -0
- package/lib/syntax/types/Type.js +1 -0
- package/lib/syntax/types/VariantType.d.ts +19 -0
- package/lib/syntax/types/VariantType.js +75 -0
- package/lib/syntax/types/VoidType.d.ts +10 -0
- package/lib/syntax/types/VoidType.js +27 -0
- package/lib/syntax/types/getTypeAs.d.ts +2 -0
- package/lib/syntax/types/getTypeAs.js +12 -0
- package/lib/utils.d.ts +22 -0
- package/lib/utils.js +126 -0
- package/lib/views/CppHybridViewComponent.d.ts +14 -0
- package/lib/views/CppHybridViewComponent.js +254 -0
- package/lib/views/createHostComponentJs.d.ts +3 -0
- package/lib/views/createHostComponentJs.js +27 -0
- package/lib/views/kotlin/KotlinHybridViewManager.d.ts +3 -0
- package/lib/views/kotlin/KotlinHybridViewManager.js +229 -0
- package/lib/views/swift/SwiftHybridViewManager.d.ts +3 -0
- package/lib/views/swift/SwiftHybridViewManager.js +131 -0
- package/lib/writeFile.d.ts +5 -0
- package/lib/writeFile.js +19 -0
- package/package.json +58 -29
- package/src/Logger.ts +63 -0
- package/src/autolinking/Autolinking.ts +9 -0
- package/src/autolinking/android/createCMakeExtension.ts +123 -0
- package/src/autolinking/android/createGradleExtension.ts +43 -0
- package/src/autolinking/android/createHybridObjectInitializer.ts +174 -0
- package/src/autolinking/createAndroidAutolinking.ts +28 -0
- package/src/autolinking/createIOSAutolinking.ts +24 -0
- package/src/autolinking/ios/createHybridObjectInitializer.ts +112 -0
- package/src/autolinking/ios/createPodspecRubyExtension.ts +76 -0
- package/src/autolinking/ios/createSwiftCxxBridge.ts +137 -0
- package/src/autolinking/ios/createSwiftUmbrellaHeader.ts +90 -0
- package/src/config/NitroConfig.ts +139 -0
- package/src/config/NitroUserConfig.ts +105 -0
- package/src/config/getConfig.ts +91 -0
- package/src/createGitAttributes.ts +15 -0
- package/src/createPlatformSpec.ts +176 -0
- package/src/getFiles.ts +31 -0
- package/src/getPlatformSpecs.ts +202 -0
- package/src/index.ts +146 -0
- package/src/init.ts +186 -0
- package/src/nitrogen.ts +246 -0
- package/src/prettifyDirectory.ts +32 -0
- package/src/syntax/BridgedType.ts +59 -0
- package/src/syntax/CodeNode.ts +24 -0
- package/src/syntax/HybridObjectSpec.ts +14 -0
- package/src/syntax/Method.ts +154 -0
- package/src/syntax/Parameter.ts +81 -0
- package/src/syntax/Property.ts +203 -0
- package/src/syntax/SourceFile.ts +80 -0
- package/src/syntax/c++/CppEnum.ts +128 -0
- package/src/syntax/c++/CppHybridObject.ts +165 -0
- package/src/syntax/c++/CppHybridObjectRegistration.ts +39 -0
- package/src/syntax/c++/CppStruct.ts +129 -0
- package/src/syntax/c++/CppUnion.ts +105 -0
- package/src/syntax/c++/getForwardDeclaration.ts +19 -0
- package/src/syntax/c++/includeNitroHeader.ts +40 -0
- package/src/syntax/createType.ts +365 -0
- package/src/syntax/getAllTypes.ts +18 -0
- package/src/syntax/getCustomTypeConfig.ts +71 -0
- package/src/syntax/getHybridObjectName.ts +48 -0
- package/src/syntax/getInterfaceProperties.ts +21 -0
- package/src/syntax/getReferencedTypes.ts +57 -0
- package/src/syntax/helpers.ts +79 -0
- package/src/syntax/isCoreType.ts +60 -0
- package/src/syntax/kotlin/FbjniHybridObject.ts +313 -0
- package/src/syntax/kotlin/JNINativeRegistrations.ts +19 -0
- package/src/syntax/kotlin/KotlinBoxedPrimitive.ts +19 -0
- package/src/syntax/kotlin/KotlinCxxBridgedType.ts +942 -0
- package/src/syntax/kotlin/KotlinEnum.ts +130 -0
- package/src/syntax/kotlin/KotlinFunction.ts +277 -0
- package/src/syntax/kotlin/KotlinHybridObject.ts +205 -0
- package/src/syntax/kotlin/KotlinHybridObjectRegistration.ts +51 -0
- package/src/syntax/kotlin/KotlinStruct.ts +198 -0
- package/src/syntax/kotlin/KotlinVariant.ts +212 -0
- package/src/syntax/swift/SwiftCxxBridgedType.ts +874 -0
- package/src/syntax/swift/SwiftCxxTypeHelper.ts +674 -0
- package/src/syntax/swift/SwiftEnum.ts +65 -0
- package/src/syntax/swift/SwiftFunction.ts +91 -0
- package/src/syntax/swift/SwiftHybridObject.ts +121 -0
- package/src/syntax/swift/SwiftHybridObjectBridge.ts +522 -0
- package/src/syntax/swift/SwiftHybridObjectRegistration.ts +75 -0
- package/src/syntax/swift/SwiftStruct.ts +85 -0
- package/src/syntax/swift/SwiftVariant.ts +67 -0
- package/src/syntax/types/ArrayBufferType.ts +49 -0
- package/src/syntax/types/ArrayType.ts +62 -0
- package/src/syntax/types/BigIntType.ts +35 -0
- package/src/syntax/types/BooleanType.ts +35 -0
- package/src/syntax/types/CustomType.ts +47 -0
- package/src/syntax/types/DateType.ts +43 -0
- package/src/syntax/types/EnumType.ts +130 -0
- package/src/syntax/types/ErrorType.ts +44 -0
- package/src/syntax/types/FunctionType.ts +167 -0
- package/src/syntax/types/HybridObjectBaseType.ts +54 -0
- package/src/syntax/types/HybridObjectType.ts +198 -0
- package/src/syntax/types/MapType.ts +49 -0
- package/src/syntax/types/NamedWrappingType.ts +33 -0
- package/src/syntax/types/NullType.ts +30 -0
- package/src/syntax/types/NumberType.ts +34 -0
- package/src/syntax/types/OptionalType.ts +66 -0
- package/src/syntax/types/PromiseType.ts +72 -0
- package/src/syntax/types/RecordType.ts +56 -0
- package/src/syntax/types/ResultWrappingType.ts +53 -0
- package/src/syntax/types/StringType.ts +44 -0
- package/src/syntax/types/StructType.ts +83 -0
- package/src/syntax/types/TupleType.ts +53 -0
- package/src/syntax/types/Type.ts +82 -0
- package/src/syntax/types/VariantType.ts +92 -0
- package/src/syntax/types/VoidType.ts +34 -0
- package/src/syntax/types/getTypeAs.ts +15 -0
- package/src/utils.ts +162 -0
- package/src/views/CppHybridViewComponent.ts +301 -0
- package/src/views/createHostComponentJs.ts +34 -0
- package/src/views/kotlin/KotlinHybridViewManager.ts +258 -0
- package/src/views/swift/SwiftHybridViewManager.ts +153 -0
- package/src/writeFile.ts +27 -0
- package/.jshintignore +0 -6
- package/.jshintrc +0 -3
- package/.npmignore +0 -3
- package/.travis.yml +0 -13
- package/LICENSE +0 -13
- package/browser/nitrogen-min.js +0 -3
- package/browser/nitrogen.js +0 -6369
- package/lib/apiKey.js +0 -67
- package/lib/blob.js +0 -57
- package/lib/commandManager.js +0 -350
- package/lib/device.js +0 -19
- package/lib/memoryStore.js +0 -24
- package/lib/message.js +0 -298
- package/lib/permission.js +0 -121
- package/lib/principal.js +0 -330
- package/lib/service.js +0 -347
- package/lib/session.js +0 -494
- package/lib/user.js +0 -20
- package/publish +0 -2
- package/scripts/build-documentation +0 -4
- package/scripts/build-module +0 -27
- package/scripts/module.js +0 -12
- package/scripts/postamble.js +0 -1
- package/scripts/preamble.js +0 -2
- package/scripts/run-test-server +0 -9
- package/test/config.js +0 -12
- package/test/fixtures/images/image.jpg +0 -0
- package/test/fixtures/images/motion0.jpg +0 -0
- package/test/fixtures/images/motion1.jpg +0 -0
- package/test/fixtures/images/motion2.jpg +0 -0
- package/test/fixtures/index.js +0 -76
- package/test/main.js +0 -5
- package/test/memoryStore.js +0 -22
- package/test/mocha.opts +0 -3
- package/test/units/apiKey.js +0 -46
- package/test/units/blob.js +0 -35
- package/test/units/commandManager.js +0 -67
- package/test/units/device.js +0 -26
- package/test/units/heartbeat.js +0 -28
- package/test/units/message.js +0 -79
- package/test/units/permissions.js +0 -43
- package/test/units/principal.js +0 -116
- package/test/units/service.js +0 -92
- package/test/units/session.js +0 -97
- package/test/units/user.js +0 -48
- package/yuidoc.json +0 -8
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { NitroConfig } from '../../config/NitroConfig.js'
|
|
2
|
+
import { capitalizeName, indent } from '../../utils.js'
|
|
3
|
+
import { includeHeader } from '../c++/includeNitroHeader.js'
|
|
4
|
+
import { getReferencedTypes } from '../getReferencedTypes.js'
|
|
5
|
+
import { createFileMetadataString, isNotDuplicate } from '../helpers.js'
|
|
6
|
+
import type { SourceFile } from '../SourceFile.js'
|
|
7
|
+
import type { StructType } from '../types/StructType.js'
|
|
8
|
+
import { KotlinCxxBridgedType } from './KotlinCxxBridgedType.js'
|
|
9
|
+
|
|
10
|
+
export function createKotlinStruct(structType: StructType): SourceFile[] {
|
|
11
|
+
const packageName = NitroConfig.current.getAndroidPackage('java/kotlin')
|
|
12
|
+
const values = structType.properties.map((p) => {
|
|
13
|
+
const bridged = new KotlinCxxBridgedType(p)
|
|
14
|
+
return `
|
|
15
|
+
@DoNotStrip
|
|
16
|
+
@Keep
|
|
17
|
+
val ${p.escapedName}: ${bridged.getTypeCode('kotlin', false)}
|
|
18
|
+
`.trim()
|
|
19
|
+
})
|
|
20
|
+
let secondaryConstructor: string
|
|
21
|
+
const needsSpecialHandling = structType.properties.some(
|
|
22
|
+
(p) => new KotlinCxxBridgedType(p).needsSpecialHandling
|
|
23
|
+
)
|
|
24
|
+
if (needsSpecialHandling) {
|
|
25
|
+
// If we need special handling for any of our properties, we need to add a convenience initializer.
|
|
26
|
+
const params = structType.properties.map(
|
|
27
|
+
(p) => `${p.escapedName}: ${p.getCode('kotlin')}`
|
|
28
|
+
)
|
|
29
|
+
const paramsForward = structType.properties.map((p) => {
|
|
30
|
+
const bridged = new KotlinCxxBridgedType(p)
|
|
31
|
+
if (bridged.needsSpecialHandling) {
|
|
32
|
+
// We need special parsing for this type
|
|
33
|
+
return bridged.parseFromKotlinToCpp(p.escapedName, 'kotlin', false)
|
|
34
|
+
} else {
|
|
35
|
+
return p.escapedName
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
secondaryConstructor = `
|
|
39
|
+
/**
|
|
40
|
+
* Initialize a new instance of \`${structType.structName}\` from Kotlin.
|
|
41
|
+
*/
|
|
42
|
+
constructor(${indent(params.join(', '), 12)})
|
|
43
|
+
: this(${indent(paramsForward.join(', '), 12)})
|
|
44
|
+
`.trim()
|
|
45
|
+
} else {
|
|
46
|
+
secondaryConstructor = `/* main constructor */`
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const extraImports = structType.properties
|
|
50
|
+
.flatMap((t) => t.getRequiredImports('kotlin'))
|
|
51
|
+
.map((i) => `import ${i.name}`)
|
|
52
|
+
|
|
53
|
+
const code = `
|
|
54
|
+
${createFileMetadataString(`${structType.structName}.kt`)}
|
|
55
|
+
|
|
56
|
+
package ${packageName}
|
|
57
|
+
|
|
58
|
+
import androidx.annotation.Keep
|
|
59
|
+
import com.facebook.proguard.annotations.DoNotStrip
|
|
60
|
+
import com.margelo.nitro.core.*
|
|
61
|
+
${extraImports.join('\n')}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Represents the JavaScript object/struct "${structType.structName}".
|
|
65
|
+
*/
|
|
66
|
+
@DoNotStrip
|
|
67
|
+
@Keep
|
|
68
|
+
data class ${structType.structName}
|
|
69
|
+
@DoNotStrip
|
|
70
|
+
@Keep
|
|
71
|
+
constructor(
|
|
72
|
+
${indent(values.join(',\n'), ' ')}
|
|
73
|
+
) {
|
|
74
|
+
${indent(secondaryConstructor, ' ')}
|
|
75
|
+
}
|
|
76
|
+
`.trim()
|
|
77
|
+
|
|
78
|
+
const cxxNamespace = NitroConfig.current.getCxxNamespace('c++')
|
|
79
|
+
const jniClassDescriptor = NitroConfig.current.getAndroidPackage(
|
|
80
|
+
'c++/jni',
|
|
81
|
+
structType.structName
|
|
82
|
+
)
|
|
83
|
+
const jniStructInitializerBody = createJNIStructInitializer(structType)
|
|
84
|
+
const cppStructInitializerBody = createCppStructInitializer(
|
|
85
|
+
'value',
|
|
86
|
+
structType
|
|
87
|
+
)
|
|
88
|
+
const imports = structType.properties
|
|
89
|
+
.flatMap((p) => getReferencedTypes(p))
|
|
90
|
+
.map((t) => new KotlinCxxBridgedType(t))
|
|
91
|
+
.flatMap((t) => t.getRequiredImports('c++'))
|
|
92
|
+
const includes = imports
|
|
93
|
+
.map((i) => includeHeader(i))
|
|
94
|
+
.filter(isNotDuplicate)
|
|
95
|
+
.sort()
|
|
96
|
+
|
|
97
|
+
const fbjniCode = `
|
|
98
|
+
${createFileMetadataString(`J${structType.structName}.hpp`)}
|
|
99
|
+
|
|
100
|
+
#pragma once
|
|
101
|
+
|
|
102
|
+
#include <fbjni/fbjni.h>
|
|
103
|
+
#include "${structType.declarationFile.name}"
|
|
104
|
+
|
|
105
|
+
${includes.join('\n')}
|
|
106
|
+
|
|
107
|
+
namespace ${cxxNamespace} {
|
|
108
|
+
|
|
109
|
+
using namespace facebook;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The C++ JNI bridge between the C++ struct "${structType.structName}" and the the Kotlin data class "${structType.structName}".
|
|
113
|
+
*/
|
|
114
|
+
struct J${structType.structName} final: public jni::JavaClass<J${structType.structName}> {
|
|
115
|
+
public:
|
|
116
|
+
static auto constexpr kJavaDescriptor = "L${jniClassDescriptor};";
|
|
117
|
+
|
|
118
|
+
public:
|
|
119
|
+
/**
|
|
120
|
+
* Convert this Java/Kotlin-based struct to the C++ struct ${structType.structName} by copying all values to C++.
|
|
121
|
+
*/
|
|
122
|
+
[[maybe_unused]]
|
|
123
|
+
[[nodiscard]]
|
|
124
|
+
${structType.structName} toCpp() const {
|
|
125
|
+
${indent(jniStructInitializerBody, ' ')}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public:
|
|
129
|
+
/**
|
|
130
|
+
* Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
|
|
131
|
+
*/
|
|
132
|
+
[[maybe_unused]]
|
|
133
|
+
static jni::local_ref<J${structType.structName}::javaobject> fromCpp(const ${structType.structName}& value) {
|
|
134
|
+
${indent(cppStructInitializerBody, ' ')}
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
} // namespace ${cxxNamespace}
|
|
139
|
+
`.trim()
|
|
140
|
+
|
|
141
|
+
const files: SourceFile[] = []
|
|
142
|
+
files.push({
|
|
143
|
+
content: code,
|
|
144
|
+
language: 'kotlin',
|
|
145
|
+
name: `${structType.structName}.kt`,
|
|
146
|
+
subdirectory: NitroConfig.current.getAndroidPackageDirectory(),
|
|
147
|
+
platform: 'android',
|
|
148
|
+
})
|
|
149
|
+
files.push({
|
|
150
|
+
content: fbjniCode,
|
|
151
|
+
language: 'c++',
|
|
152
|
+
name: `J${structType.structName}.hpp`,
|
|
153
|
+
subdirectory: [],
|
|
154
|
+
platform: 'android',
|
|
155
|
+
})
|
|
156
|
+
return files
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function createJNIStructInitializer(structType: StructType): string {
|
|
160
|
+
const lines: string[] = ['static const auto clazz = javaClassStatic();']
|
|
161
|
+
for (const prop of structType.properties) {
|
|
162
|
+
const fieldName = `field${capitalizeName(prop.escapedName)}`
|
|
163
|
+
const jniType = new KotlinCxxBridgedType(prop)
|
|
164
|
+
const signatureType = jniType.getTypeCode('c++')
|
|
165
|
+
const valueType = jniType.asJniReferenceType('local')
|
|
166
|
+
lines.push(
|
|
167
|
+
`static const auto ${fieldName} = clazz->getField<${signatureType}>("${prop.escapedName}");`
|
|
168
|
+
)
|
|
169
|
+
lines.push(
|
|
170
|
+
`${valueType} ${prop.escapedName} = this->getFieldValue(${fieldName});`
|
|
171
|
+
)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const propsForward = structType.properties.map((p) => {
|
|
175
|
+
const bridged = new KotlinCxxBridgedType(p)
|
|
176
|
+
return bridged.parse(p.escapedName, 'kotlin', 'c++', 'c++')
|
|
177
|
+
})
|
|
178
|
+
lines.push(`return ${structType.structName}(`)
|
|
179
|
+
lines.push(` ${indent(propsForward.join(',\n'), ' ')}`)
|
|
180
|
+
lines.push(`);`)
|
|
181
|
+
return lines.join('\n')
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function createCppStructInitializer(
|
|
185
|
+
cppValueName: string,
|
|
186
|
+
structType: StructType
|
|
187
|
+
): string {
|
|
188
|
+
const lines: string[] = []
|
|
189
|
+
lines.push(`return newInstance(`)
|
|
190
|
+
const names = structType.properties.map((p) => {
|
|
191
|
+
const name = `${cppValueName}.${p.escapedName}`
|
|
192
|
+
const bridge = new KotlinCxxBridgedType(p)
|
|
193
|
+
return bridge.parse(name, 'c++', 'kotlin', 'c++')
|
|
194
|
+
})
|
|
195
|
+
lines.push(` ${indent(names.join(',\n'), ' ')}`)
|
|
196
|
+
lines.push(');')
|
|
197
|
+
return lines.join('\n')
|
|
198
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { NitroConfig } from '../../config/NitroConfig.js'
|
|
2
|
+
import { capitalizeName, indent } from '../../utils.js'
|
|
3
|
+
import { includeHeader } from '../c++/includeNitroHeader.js'
|
|
4
|
+
import {
|
|
5
|
+
createFileMetadataString,
|
|
6
|
+
isNotDuplicate,
|
|
7
|
+
toReferenceType,
|
|
8
|
+
} from '../helpers.js'
|
|
9
|
+
import type { SourceFile } from '../SourceFile.js'
|
|
10
|
+
import { type VariantType } from '../types/VariantType.js'
|
|
11
|
+
import { KotlinCxxBridgedType } from './KotlinCxxBridgedType.js'
|
|
12
|
+
|
|
13
|
+
export function createKotlinVariant(variant: VariantType): SourceFile[] {
|
|
14
|
+
const jsName = variant.variants.map((v) => v.getCode('kotlin')).join('|')
|
|
15
|
+
const kotlinName = variant.getAliasName('kotlin')
|
|
16
|
+
const namespace = `J${kotlinName}_impl`
|
|
17
|
+
|
|
18
|
+
const innerClasses = variant.cases.map(([label, v]) => {
|
|
19
|
+
const innerName = capitalizeName(label)
|
|
20
|
+
return `
|
|
21
|
+
@DoNotStrip
|
|
22
|
+
data class ${innerName}(@DoNotStrip val value: ${v.getCode('kotlin')}): ${kotlinName}()
|
|
23
|
+
`.trim()
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const packageName = NitroConfig.current.getAndroidPackage('java/kotlin')
|
|
27
|
+
const getterCases = variant.cases.map(([label]) => {
|
|
28
|
+
const innerName = capitalizeName(label)
|
|
29
|
+
return `is ${innerName} -> value as? T`
|
|
30
|
+
})
|
|
31
|
+
const isFunctions = variant.cases.map(([label]) => {
|
|
32
|
+
const innerName = capitalizeName(label)
|
|
33
|
+
return `
|
|
34
|
+
val is${innerName}: Boolean
|
|
35
|
+
get() = this is ${innerName}
|
|
36
|
+
`.trim()
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const createFunctions = variant.cases.map(([label, v]) => {
|
|
40
|
+
const innerName = capitalizeName(label)
|
|
41
|
+
return `
|
|
42
|
+
@JvmStatic
|
|
43
|
+
@DoNotStrip
|
|
44
|
+
fun create(value: ${v.getCode('kotlin')}): ${kotlinName} = ${innerName}(value)
|
|
45
|
+
`.trim()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const extraImports = variant.variants
|
|
49
|
+
.flatMap((t) => t.getRequiredImports('kotlin'))
|
|
50
|
+
.map((i) => `import ${i.name}`)
|
|
51
|
+
|
|
52
|
+
const code = `
|
|
53
|
+
${createFileMetadataString(`${kotlinName}.kt`)}
|
|
54
|
+
|
|
55
|
+
package ${packageName}
|
|
56
|
+
|
|
57
|
+
import com.facebook.proguard.annotations.DoNotStrip
|
|
58
|
+
${extraImports.join('\n')}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Represents the TypeScript variant "${jsName}".
|
|
62
|
+
*/
|
|
63
|
+
@Suppress("ClassName")
|
|
64
|
+
@DoNotStrip
|
|
65
|
+
sealed class ${kotlinName} {
|
|
66
|
+
${indent(innerClasses.join('\n'), ' ')}
|
|
67
|
+
|
|
68
|
+
inline fun <reified T> getAs(): T? = when (this) {
|
|
69
|
+
${indent(getterCases.join('\n'), ' ')}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
${indent(isFunctions.join('\n'), ' ')}
|
|
73
|
+
|
|
74
|
+
companion object {
|
|
75
|
+
${indent(createFunctions.join('\n'), ' ')}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
`.trim()
|
|
79
|
+
|
|
80
|
+
const cxxNamespace = NitroConfig.current.getCxxNamespace('c++')
|
|
81
|
+
const jniClassDescriptor = NitroConfig.current.getAndroidPackage(
|
|
82
|
+
'c++/jni',
|
|
83
|
+
kotlinName
|
|
84
|
+
)
|
|
85
|
+
const cppCreateFuncs = variant.variants.map((v, i) => {
|
|
86
|
+
const bridge = new KotlinCxxBridgedType(v)
|
|
87
|
+
return `
|
|
88
|
+
static jni::local_ref<J${kotlinName}> create_${i}(${bridge.asJniReferenceType('alias')} value) {
|
|
89
|
+
static const auto method = javaClassStatic()->getStaticMethod<J${kotlinName}(${bridge.asJniReferenceType('alias')})>("create");
|
|
90
|
+
return method(javaClassStatic(), value);
|
|
91
|
+
}
|
|
92
|
+
`.trim()
|
|
93
|
+
})
|
|
94
|
+
const variantCases = variant.variants.map((v, i) => {
|
|
95
|
+
const bridge = new KotlinCxxBridgedType(v)
|
|
96
|
+
return `case ${i}: return create_${i}(${bridge.parseFromCppToKotlin(`std::get<${i}>(variant)`, 'c++')});`
|
|
97
|
+
})
|
|
98
|
+
const cppGetIfs = variant.cases.map(([label, v]) => {
|
|
99
|
+
const innerName = capitalizeName(label)
|
|
100
|
+
const bridge = new KotlinCxxBridgedType(v)
|
|
101
|
+
return `
|
|
102
|
+
if (isInstanceOf(${namespace}::${innerName}::javaClassStatic())) {
|
|
103
|
+
// It's a \`${v.getCode('c++')}\`
|
|
104
|
+
auto jniValue = static_cast<const ${namespace}::${innerName}*>(this)->getValue();
|
|
105
|
+
return ${bridge.parseFromKotlinToCpp('jniValue', 'c++')};
|
|
106
|
+
}
|
|
107
|
+
`.trim()
|
|
108
|
+
})
|
|
109
|
+
const cppInnerClasses = variant.cases.map(([label, v]) => {
|
|
110
|
+
const bridge = new KotlinCxxBridgedType(v)
|
|
111
|
+
const innerName = capitalizeName(label)
|
|
112
|
+
const descriptor = NitroConfig.current.getAndroidPackage(
|
|
113
|
+
'c++/jni',
|
|
114
|
+
`${kotlinName}$${innerName}`
|
|
115
|
+
)
|
|
116
|
+
return `
|
|
117
|
+
class ${innerName}: public jni::JavaClass<${innerName}, J${kotlinName}> {
|
|
118
|
+
public:
|
|
119
|
+
static auto constexpr kJavaDescriptor = "L${descriptor};";
|
|
120
|
+
|
|
121
|
+
[[nodiscard]] ${bridge.asJniReferenceType('local')} getValue() const {
|
|
122
|
+
static const auto field = javaClassStatic()->getField<${bridge.getTypeCode('c++')}>("value");
|
|
123
|
+
return getFieldValue(field);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
`.trim()
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
const includes = new KotlinCxxBridgedType(variant)
|
|
130
|
+
.getRequiredImports('c++')
|
|
131
|
+
.filter((i) => i.name !== `J${kotlinName}.hpp`)
|
|
132
|
+
.map((i) => includeHeader(i, true))
|
|
133
|
+
.filter(isNotDuplicate)
|
|
134
|
+
|
|
135
|
+
const fbjniHeaderCode = `
|
|
136
|
+
${createFileMetadataString(`J${kotlinName}.hpp`)}
|
|
137
|
+
|
|
138
|
+
#pragma once
|
|
139
|
+
|
|
140
|
+
#include <fbjni/fbjni.h>
|
|
141
|
+
#include <variant>
|
|
142
|
+
|
|
143
|
+
${includes.join('\n')}
|
|
144
|
+
|
|
145
|
+
namespace ${cxxNamespace} {
|
|
146
|
+
|
|
147
|
+
using namespace facebook;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* The C++ JNI bridge between the C++ std::variant and the Java class "${kotlinName}".
|
|
151
|
+
*/
|
|
152
|
+
class J${kotlinName}: public jni::JavaClass<J${kotlinName}> {
|
|
153
|
+
public:
|
|
154
|
+
static auto constexpr kJavaDescriptor = "L${jniClassDescriptor};";
|
|
155
|
+
|
|
156
|
+
${indent(cppCreateFuncs.join('\n'), ' ')}
|
|
157
|
+
|
|
158
|
+
static jni::local_ref<J${kotlinName}> fromCpp(${toReferenceType(variant.getCode('c++'))} variant) {
|
|
159
|
+
switch (variant.index()) {
|
|
160
|
+
${indent(variantCases.join('\n'), ' ')}
|
|
161
|
+
default: throw std::invalid_argument("Variant holds unknown index! (" + std::to_string(variant.index()) + ")");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
[[nodiscard]] ${variant.getCode('c++')} toCpp() const;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
namespace ${namespace} {
|
|
169
|
+
${indent(cppInnerClasses.join('\n\n'), ' ')}
|
|
170
|
+
} // namespace ${namespace}
|
|
171
|
+
} // namespace ${cxxNamespace}
|
|
172
|
+
`.trim()
|
|
173
|
+
const fbjniImplementationCode = `
|
|
174
|
+
${createFileMetadataString(`J${kotlinName}.cpp`)}
|
|
175
|
+
|
|
176
|
+
#include "J${kotlinName}.hpp"
|
|
177
|
+
|
|
178
|
+
namespace ${cxxNamespace} {
|
|
179
|
+
/**
|
|
180
|
+
* Converts J${kotlinName} to ${variant.getCode('c++')}
|
|
181
|
+
*/
|
|
182
|
+
${variant.getCode('c++')} J${kotlinName}::toCpp() const {
|
|
183
|
+
${indent(cppGetIfs.join(' else '), ' ')}
|
|
184
|
+
throw std::invalid_argument("Variant is unknown Kotlin instance!");
|
|
185
|
+
}
|
|
186
|
+
} // namespace ${cxxNamespace}
|
|
187
|
+
`.trim()
|
|
188
|
+
|
|
189
|
+
const files: SourceFile[] = []
|
|
190
|
+
files.push({
|
|
191
|
+
content: code,
|
|
192
|
+
language: 'kotlin',
|
|
193
|
+
name: `${kotlinName}.kt`,
|
|
194
|
+
subdirectory: NitroConfig.current.getAndroidPackageDirectory(),
|
|
195
|
+
platform: 'android',
|
|
196
|
+
})
|
|
197
|
+
files.push({
|
|
198
|
+
content: fbjniHeaderCode,
|
|
199
|
+
language: 'c++',
|
|
200
|
+
name: `J${kotlinName}.hpp`,
|
|
201
|
+
subdirectory: [],
|
|
202
|
+
platform: 'android',
|
|
203
|
+
})
|
|
204
|
+
files.push({
|
|
205
|
+
content: fbjniImplementationCode,
|
|
206
|
+
language: 'c++',
|
|
207
|
+
name: `J${kotlinName}.cpp`,
|
|
208
|
+
subdirectory: [],
|
|
209
|
+
platform: 'android',
|
|
210
|
+
})
|
|
211
|
+
return files
|
|
212
|
+
}
|