nitrogen 0.2.23 → 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 -349
- 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,893 @@
|
|
|
1
|
+
import { indent } from '../../utils.js';
|
|
2
|
+
import { getHybridObjectName } from '../getHybridObjectName.js';
|
|
3
|
+
import { getReferencedTypes } from '../getReferencedTypes.js';
|
|
4
|
+
import { ArrayType } from '../types/ArrayType.js';
|
|
5
|
+
import { EnumType } from '../types/EnumType.js';
|
|
6
|
+
import { FunctionType } from '../types/FunctionType.js';
|
|
7
|
+
import { getTypeAs } from '../types/getTypeAs.js';
|
|
8
|
+
import { HybridObjectType } from '../types/HybridObjectType.js';
|
|
9
|
+
import { OptionalType } from '../types/OptionalType.js';
|
|
10
|
+
import { PromiseType } from '../types/PromiseType.js';
|
|
11
|
+
import { RecordType } from '../types/RecordType.js';
|
|
12
|
+
import { StructType } from '../types/StructType.js';
|
|
13
|
+
import { VariantType } from '../types/VariantType.js';
|
|
14
|
+
import { getKotlinBoxedPrimitiveType } from './KotlinBoxedPrimitive.js';
|
|
15
|
+
import { createKotlinEnum } from './KotlinEnum.js';
|
|
16
|
+
import { createKotlinFunction } from './KotlinFunction.js';
|
|
17
|
+
import { createKotlinStruct } from './KotlinStruct.js';
|
|
18
|
+
import { createKotlinVariant } from './KotlinVariant.js';
|
|
19
|
+
export class KotlinCxxBridgedType {
|
|
20
|
+
type;
|
|
21
|
+
constructor(type) {
|
|
22
|
+
this.type = type;
|
|
23
|
+
}
|
|
24
|
+
get hasType() {
|
|
25
|
+
return this.type.kind !== 'void' && this.type.kind !== 'null';
|
|
26
|
+
}
|
|
27
|
+
get canBePassedByReference() {
|
|
28
|
+
return this.type.canBePassedByReference;
|
|
29
|
+
}
|
|
30
|
+
get needsSpecialHandling() {
|
|
31
|
+
switch (this.type.kind) {
|
|
32
|
+
case 'function':
|
|
33
|
+
// Function needs to be converted from JFunc_... to Lambda
|
|
34
|
+
return true;
|
|
35
|
+
case 'struct':
|
|
36
|
+
// Structs don't need special handling - they have direct mappings
|
|
37
|
+
// Returning false prevents secondary constructor generation that causes duplicates
|
|
38
|
+
return false;
|
|
39
|
+
case 'optional':
|
|
40
|
+
// Optionals need special handling if the wrapped type needs special handling
|
|
41
|
+
const optional = getTypeAs(this.type, OptionalType);
|
|
42
|
+
return new KotlinCxxBridgedType(optional.wrappingType)
|
|
43
|
+
.needsSpecialHandling;
|
|
44
|
+
default:
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
// check if any types this type references (e.g. underlying optional, array element, ...)
|
|
48
|
+
// needs special handling. if yes, we need it as well
|
|
49
|
+
const referencedTypes = getReferencedTypes(this.type)
|
|
50
|
+
.filter((t) => t !== this.type)
|
|
51
|
+
.map((t) => new KotlinCxxBridgedType(t));
|
|
52
|
+
for (const type of referencedTypes) {
|
|
53
|
+
if (type.needsSpecialHandling) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// no special handling needed
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
getRequiredImports(language) {
|
|
61
|
+
const imports = this.type.getRequiredImports(language);
|
|
62
|
+
if (language === 'c++') {
|
|
63
|
+
// All C++ imports we need for the JNI bridge
|
|
64
|
+
switch (this.type.kind) {
|
|
65
|
+
case 'enum':
|
|
66
|
+
const enumType = getTypeAs(this.type, EnumType);
|
|
67
|
+
imports.push({
|
|
68
|
+
language: 'c++',
|
|
69
|
+
name: `J${enumType.enumName}.hpp`,
|
|
70
|
+
space: 'user',
|
|
71
|
+
});
|
|
72
|
+
break;
|
|
73
|
+
case 'struct':
|
|
74
|
+
const structType = getTypeAs(this.type, StructType);
|
|
75
|
+
imports.push({
|
|
76
|
+
language: 'c++',
|
|
77
|
+
name: `J${structType.structName}.hpp`,
|
|
78
|
+
space: 'user',
|
|
79
|
+
});
|
|
80
|
+
break;
|
|
81
|
+
case 'function':
|
|
82
|
+
const functionType = getTypeAs(this.type, FunctionType);
|
|
83
|
+
imports.push({
|
|
84
|
+
language: 'c++',
|
|
85
|
+
name: `J${functionType.specializationName}.hpp`,
|
|
86
|
+
space: 'user',
|
|
87
|
+
});
|
|
88
|
+
break;
|
|
89
|
+
case 'array-buffer':
|
|
90
|
+
imports.push({
|
|
91
|
+
language: 'c++',
|
|
92
|
+
name: 'NitroModules/JArrayBuffer.hpp',
|
|
93
|
+
space: 'system',
|
|
94
|
+
});
|
|
95
|
+
imports.push({
|
|
96
|
+
language: 'c++',
|
|
97
|
+
name: 'NitroModules/JUnit.hpp',
|
|
98
|
+
space: 'system',
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
case 'promise':
|
|
102
|
+
imports.push({
|
|
103
|
+
language: 'c++',
|
|
104
|
+
name: 'NitroModules/JPromise.hpp',
|
|
105
|
+
space: 'system',
|
|
106
|
+
});
|
|
107
|
+
break;
|
|
108
|
+
case 'date':
|
|
109
|
+
imports.push({
|
|
110
|
+
language: 'c++',
|
|
111
|
+
name: 'NitroModules/JInstant.hpp',
|
|
112
|
+
space: 'system',
|
|
113
|
+
});
|
|
114
|
+
break;
|
|
115
|
+
case 'map':
|
|
116
|
+
imports.push({
|
|
117
|
+
language: 'c++',
|
|
118
|
+
name: 'NitroModules/JAnyMap.hpp',
|
|
119
|
+
space: 'system',
|
|
120
|
+
});
|
|
121
|
+
break;
|
|
122
|
+
case 'variant':
|
|
123
|
+
const variantType = getTypeAs(this.type, VariantType);
|
|
124
|
+
const variantName = variantType.getAliasName('kotlin');
|
|
125
|
+
imports.push({
|
|
126
|
+
language: 'c++',
|
|
127
|
+
name: `J${variantName}.hpp`,
|
|
128
|
+
space: 'user',
|
|
129
|
+
});
|
|
130
|
+
break;
|
|
131
|
+
case 'hybrid-object': {
|
|
132
|
+
const hybridObjectType = getTypeAs(this.type, HybridObjectType);
|
|
133
|
+
const name = getHybridObjectName(hybridObjectType.hybridObjectName);
|
|
134
|
+
if (hybridObjectType.sourceConfig.isExternalConfig) {
|
|
135
|
+
// It's an externally imported type
|
|
136
|
+
imports.push({
|
|
137
|
+
language: 'c++',
|
|
138
|
+
name: `${hybridObjectType.sourceConfig.getAndroidCxxLibName()}/${name.JHybridTSpec}.hpp`,
|
|
139
|
+
space: 'system',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// It's our custom type
|
|
144
|
+
imports.push({
|
|
145
|
+
language: 'c++',
|
|
146
|
+
name: `${name.JHybridTSpec}.hpp`,
|
|
147
|
+
space: 'user',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Recursively look into referenced types (e.g. the `T` of a `optional<T>`, or `T` of a `T[]`)
|
|
155
|
+
const referencedTypes = getReferencedTypes(this.type);
|
|
156
|
+
referencedTypes.forEach((t) => {
|
|
157
|
+
if (t === this.type) {
|
|
158
|
+
// break a recursion - we already know this type
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const bridged = new KotlinCxxBridgedType(t);
|
|
162
|
+
imports.push(...bridged.getRequiredImports(language));
|
|
163
|
+
});
|
|
164
|
+
return imports;
|
|
165
|
+
}
|
|
166
|
+
getExtraFiles() {
|
|
167
|
+
const files = [];
|
|
168
|
+
switch (this.type.kind) {
|
|
169
|
+
case 'enum':
|
|
170
|
+
const enumType = getTypeAs(this.type, EnumType);
|
|
171
|
+
const enumFiles = createKotlinEnum(enumType);
|
|
172
|
+
files.push(...enumFiles);
|
|
173
|
+
break;
|
|
174
|
+
case 'struct':
|
|
175
|
+
const structType = getTypeAs(this.type, StructType);
|
|
176
|
+
const structFiles = createKotlinStruct(structType);
|
|
177
|
+
files.push(...structFiles);
|
|
178
|
+
break;
|
|
179
|
+
case 'variant':
|
|
180
|
+
const variantType = getTypeAs(this.type, VariantType);
|
|
181
|
+
const variantFiles = createKotlinVariant(variantType);
|
|
182
|
+
files.push(...variantFiles);
|
|
183
|
+
break;
|
|
184
|
+
case 'function':
|
|
185
|
+
const functionType = getTypeAs(this.type, FunctionType);
|
|
186
|
+
const funcFiles = createKotlinFunction(functionType);
|
|
187
|
+
files.push(...funcFiles);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
// Recursively look into referenced types (e.g. the `T` of a `optional<T>`, or `T` of a `T[]`)
|
|
191
|
+
const referencedTypes = getReferencedTypes(this.type);
|
|
192
|
+
referencedTypes.forEach((t) => {
|
|
193
|
+
if (t === this.type) {
|
|
194
|
+
// break a recursion - we already know this type
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const bridged = new KotlinCxxBridgedType(t);
|
|
198
|
+
files.push(...bridged.getExtraFiles());
|
|
199
|
+
});
|
|
200
|
+
return files;
|
|
201
|
+
}
|
|
202
|
+
asJniReferenceType(referenceType = 'alias') {
|
|
203
|
+
switch (this.type.kind) {
|
|
204
|
+
case 'void':
|
|
205
|
+
case 'number':
|
|
206
|
+
case 'boolean':
|
|
207
|
+
case 'bigint':
|
|
208
|
+
// primitives are not references
|
|
209
|
+
return this.getTypeCode('c++');
|
|
210
|
+
default:
|
|
211
|
+
return `jni::${referenceType}_ref<${this.getTypeCode('c++')}>`;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
getTypeCode(language, isBoxed = false) {
|
|
215
|
+
switch (this.type.kind) {
|
|
216
|
+
case 'number':
|
|
217
|
+
case 'bigint':
|
|
218
|
+
case 'boolean':
|
|
219
|
+
if (isBoxed) {
|
|
220
|
+
return getKotlinBoxedPrimitiveType(this.type);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
if (this.type.kind === 'boolean' && language === 'c++') {
|
|
224
|
+
// JNI does not use `bool`, so it is a jboolean instead.
|
|
225
|
+
return 'jboolean';
|
|
226
|
+
}
|
|
227
|
+
return this.type.getCode(language);
|
|
228
|
+
}
|
|
229
|
+
case 'array':
|
|
230
|
+
const array = getTypeAs(this.type, ArrayType);
|
|
231
|
+
const bridgedItem = new KotlinCxxBridgedType(array.itemType);
|
|
232
|
+
switch (language) {
|
|
233
|
+
case 'c++':
|
|
234
|
+
switch (array.itemType.kind) {
|
|
235
|
+
case 'number':
|
|
236
|
+
return 'jni::JArrayDouble';
|
|
237
|
+
case 'boolean':
|
|
238
|
+
return 'jni::JArrayBoolean';
|
|
239
|
+
case 'bigint':
|
|
240
|
+
return 'jni::JArrayLong';
|
|
241
|
+
default:
|
|
242
|
+
return `jni::JArrayClass<${bridgedItem.getTypeCode(language)}>`;
|
|
243
|
+
}
|
|
244
|
+
case 'kotlin':
|
|
245
|
+
switch (array.itemType.kind) {
|
|
246
|
+
case 'number':
|
|
247
|
+
return 'DoubleArray';
|
|
248
|
+
case 'boolean':
|
|
249
|
+
return 'BooleanArray';
|
|
250
|
+
case 'bigint':
|
|
251
|
+
return 'LongArray';
|
|
252
|
+
default:
|
|
253
|
+
return `Array<${bridgedItem.getTypeCode(language)}>`;
|
|
254
|
+
}
|
|
255
|
+
default:
|
|
256
|
+
return this.type.getCode(language);
|
|
257
|
+
}
|
|
258
|
+
case 'string':
|
|
259
|
+
switch (language) {
|
|
260
|
+
case 'c++':
|
|
261
|
+
return 'jni::JString';
|
|
262
|
+
default:
|
|
263
|
+
return this.type.getCode(language);
|
|
264
|
+
}
|
|
265
|
+
case 'record': {
|
|
266
|
+
switch (language) {
|
|
267
|
+
case 'c++':
|
|
268
|
+
const recordType = getTypeAs(this.type, RecordType);
|
|
269
|
+
const keyType = new KotlinCxxBridgedType(recordType.keyType).getTypeCode(language);
|
|
270
|
+
const valueType = new KotlinCxxBridgedType(recordType.valueType).getTypeCode(language);
|
|
271
|
+
return `jni::JMap<${keyType}, ${valueType}>`;
|
|
272
|
+
default:
|
|
273
|
+
return this.type.getCode(language);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
case 'enum':
|
|
277
|
+
switch (language) {
|
|
278
|
+
case 'c++':
|
|
279
|
+
const enumType = getTypeAs(this.type, EnumType);
|
|
280
|
+
return `J${enumType.enumName}`;
|
|
281
|
+
default:
|
|
282
|
+
return this.type.getCode(language);
|
|
283
|
+
}
|
|
284
|
+
case 'struct':
|
|
285
|
+
switch (language) {
|
|
286
|
+
case 'c++':
|
|
287
|
+
const structType = getTypeAs(this.type, StructType);
|
|
288
|
+
return `J${structType.structName}`;
|
|
289
|
+
default:
|
|
290
|
+
return this.type.getCode(language);
|
|
291
|
+
}
|
|
292
|
+
case 'function':
|
|
293
|
+
const functionType = getTypeAs(this.type, FunctionType);
|
|
294
|
+
switch (language) {
|
|
295
|
+
case 'c++':
|
|
296
|
+
return `J${functionType.specializationName}::javaobject`;
|
|
297
|
+
case 'kotlin':
|
|
298
|
+
return functionType.specializationName;
|
|
299
|
+
default:
|
|
300
|
+
return this.type.getCode(language);
|
|
301
|
+
}
|
|
302
|
+
case 'hybrid-object': {
|
|
303
|
+
switch (language) {
|
|
304
|
+
case 'c++':
|
|
305
|
+
const hybridObjectType = getTypeAs(this.type, HybridObjectType);
|
|
306
|
+
const fullName = this.getFullJHybridObjectName(hybridObjectType);
|
|
307
|
+
return `${fullName}::javaobject`;
|
|
308
|
+
default:
|
|
309
|
+
return this.type.getCode(language);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
case 'array-buffer':
|
|
313
|
+
switch (language) {
|
|
314
|
+
case 'c++':
|
|
315
|
+
return `JArrayBuffer::javaobject`;
|
|
316
|
+
default:
|
|
317
|
+
return this.type.getCode(language);
|
|
318
|
+
}
|
|
319
|
+
case 'date':
|
|
320
|
+
switch (language) {
|
|
321
|
+
case 'c++':
|
|
322
|
+
return `JInstant`;
|
|
323
|
+
default:
|
|
324
|
+
return this.type.getCode(language);
|
|
325
|
+
}
|
|
326
|
+
case 'variant': {
|
|
327
|
+
const variant = getTypeAs(this.type, VariantType);
|
|
328
|
+
const name = variant.getAliasName('kotlin');
|
|
329
|
+
switch (language) {
|
|
330
|
+
case 'c++':
|
|
331
|
+
return `J${name}`;
|
|
332
|
+
case 'kotlin':
|
|
333
|
+
return name;
|
|
334
|
+
default:
|
|
335
|
+
return this.type.getCode(language);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
case 'promise':
|
|
339
|
+
switch (language) {
|
|
340
|
+
case 'c++':
|
|
341
|
+
return `JPromise::javaobject`;
|
|
342
|
+
default:
|
|
343
|
+
return this.type.getCode(language);
|
|
344
|
+
}
|
|
345
|
+
case 'map':
|
|
346
|
+
switch (language) {
|
|
347
|
+
case 'c++':
|
|
348
|
+
return `JAnyMap::javaobject`;
|
|
349
|
+
default:
|
|
350
|
+
return this.type.getCode(language);
|
|
351
|
+
}
|
|
352
|
+
case 'optional': {
|
|
353
|
+
const optional = getTypeAs(this.type, OptionalType);
|
|
354
|
+
const bridgedWrappingType = new KotlinCxxBridgedType(optional.wrappingType);
|
|
355
|
+
switch (language) {
|
|
356
|
+
case 'c++':
|
|
357
|
+
switch (optional.wrappingType.kind) {
|
|
358
|
+
// primitives need to be boxed to make them nullable
|
|
359
|
+
case 'number':
|
|
360
|
+
case 'boolean':
|
|
361
|
+
case 'bigint':
|
|
362
|
+
const boxed = getKotlinBoxedPrimitiveType(optional.wrappingType);
|
|
363
|
+
return boxed;
|
|
364
|
+
default:
|
|
365
|
+
// all other types can be nullable as they are objects.
|
|
366
|
+
return bridgedWrappingType.getTypeCode('c++');
|
|
367
|
+
}
|
|
368
|
+
case 'kotlin':
|
|
369
|
+
return `${bridgedWrappingType.getTypeCode(language)}?`;
|
|
370
|
+
default:
|
|
371
|
+
return this.type.getCode(language);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
case 'error':
|
|
375
|
+
switch (language) {
|
|
376
|
+
case 'c++':
|
|
377
|
+
return 'jni::JThrowable';
|
|
378
|
+
default:
|
|
379
|
+
return this.type.getCode(language);
|
|
380
|
+
}
|
|
381
|
+
default:
|
|
382
|
+
return this.type.getCode(language);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
parse(parameterName, from, to, inLanguage) {
|
|
386
|
+
if (from === 'c++') {
|
|
387
|
+
return this.parseFromCppToKotlin(parameterName, inLanguage);
|
|
388
|
+
}
|
|
389
|
+
else if (from === 'kotlin') {
|
|
390
|
+
return this.parseFromKotlinToCpp(parameterName, inLanguage);
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
throw new Error(`Cannot parse "${parameterName}" from ${from} to ${to}!`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
parseFromCppToKotlin(parameterName, language, isBoxed = false) {
|
|
397
|
+
switch (this.type.kind) {
|
|
398
|
+
case 'number':
|
|
399
|
+
case 'boolean':
|
|
400
|
+
case 'bigint':
|
|
401
|
+
switch (language) {
|
|
402
|
+
case 'c++':
|
|
403
|
+
if (isBoxed) {
|
|
404
|
+
// box a primitive (double) to an object (JDouble)
|
|
405
|
+
const boxed = getKotlinBoxedPrimitiveType(this.type);
|
|
406
|
+
return `${boxed}::valueOf(${parameterName})`;
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
return parameterName;
|
|
410
|
+
}
|
|
411
|
+
default:
|
|
412
|
+
return parameterName;
|
|
413
|
+
}
|
|
414
|
+
case 'string':
|
|
415
|
+
switch (language) {
|
|
416
|
+
case 'c++':
|
|
417
|
+
return `jni::make_jstring(${parameterName})`;
|
|
418
|
+
default:
|
|
419
|
+
return parameterName;
|
|
420
|
+
}
|
|
421
|
+
case 'struct': {
|
|
422
|
+
switch (language) {
|
|
423
|
+
case 'c++':
|
|
424
|
+
const struct = getTypeAs(this.type, StructType);
|
|
425
|
+
return `J${struct.structName}::fromCpp(${parameterName})`;
|
|
426
|
+
default:
|
|
427
|
+
return parameterName;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
case 'variant': {
|
|
431
|
+
switch (language) {
|
|
432
|
+
case 'c++':
|
|
433
|
+
const variant = getTypeAs(this.type, VariantType);
|
|
434
|
+
const name = variant.getAliasName('kotlin');
|
|
435
|
+
return `J${name}::fromCpp(${parameterName})`;
|
|
436
|
+
default:
|
|
437
|
+
return parameterName;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
case 'date': {
|
|
441
|
+
switch (language) {
|
|
442
|
+
case 'c++':
|
|
443
|
+
return `JInstant::fromChrono(${parameterName})`;
|
|
444
|
+
default:
|
|
445
|
+
return parameterName;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
case 'enum': {
|
|
449
|
+
switch (language) {
|
|
450
|
+
case 'c++':
|
|
451
|
+
const enumType = getTypeAs(this.type, EnumType);
|
|
452
|
+
return `J${enumType.enumName}::fromCpp(${parameterName})`;
|
|
453
|
+
default:
|
|
454
|
+
return parameterName;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
case 'function': {
|
|
458
|
+
switch (language) {
|
|
459
|
+
case 'c++':
|
|
460
|
+
const func = getTypeAs(this.type, FunctionType);
|
|
461
|
+
return `J${func.specializationName}_cxx::fromCpp(${parameterName})`;
|
|
462
|
+
case 'kotlin':
|
|
463
|
+
return parameterName;
|
|
464
|
+
default:
|
|
465
|
+
return parameterName;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
case 'hybrid-object': {
|
|
469
|
+
switch (language) {
|
|
470
|
+
case 'c++':
|
|
471
|
+
const hybrid = getTypeAs(this.type, HybridObjectType);
|
|
472
|
+
const fullName = this.getFullJHybridObjectName(hybrid);
|
|
473
|
+
return `std::dynamic_pointer_cast<${fullName}>(${parameterName})->getJavaPart()`;
|
|
474
|
+
default:
|
|
475
|
+
return parameterName;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
case 'optional': {
|
|
479
|
+
const optional = getTypeAs(this.type, OptionalType);
|
|
480
|
+
const bridge = new KotlinCxxBridgedType(optional.wrappingType);
|
|
481
|
+
switch (language) {
|
|
482
|
+
case 'c++':
|
|
483
|
+
return `${parameterName}.has_value() ? ${bridge.parseFromCppToKotlin(`${parameterName}.value()`, 'c++', true)} : nullptr`;
|
|
484
|
+
case 'kotlin':
|
|
485
|
+
if (bridge.needsSpecialHandling) {
|
|
486
|
+
return `${parameterName}?.let { ${bridge.parseFromCppToKotlin('it', language, isBoxed)} }`;
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
return parameterName;
|
|
490
|
+
}
|
|
491
|
+
default:
|
|
492
|
+
return parameterName;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
case 'array-buffer': {
|
|
496
|
+
switch (language) {
|
|
497
|
+
case 'c++':
|
|
498
|
+
return `JArrayBuffer::wrap(${parameterName})`;
|
|
499
|
+
default:
|
|
500
|
+
return parameterName;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
case 'map': {
|
|
504
|
+
switch (language) {
|
|
505
|
+
case 'c++':
|
|
506
|
+
return `JAnyMap::create(${parameterName})`;
|
|
507
|
+
default:
|
|
508
|
+
return parameterName;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
case 'record': {
|
|
512
|
+
switch (language) {
|
|
513
|
+
case 'c++':
|
|
514
|
+
const record = getTypeAs(this.type, RecordType);
|
|
515
|
+
const key = new KotlinCxxBridgedType(record.keyType);
|
|
516
|
+
const value = new KotlinCxxBridgedType(record.valueType);
|
|
517
|
+
const parseKey = key.parseFromCppToKotlin('__entry.first', 'c++');
|
|
518
|
+
const parseValue = value.parseFromCppToKotlin('__entry.second', 'c++');
|
|
519
|
+
const javaMapType = `jni::JMap<${key.getTypeCode('c++')}, ${value.getTypeCode('c++')}>`;
|
|
520
|
+
const javaHashMapType = `jni::JHashMap<${key.getTypeCode('c++')}, ${value.getTypeCode('c++')}>`;
|
|
521
|
+
return `
|
|
522
|
+
[&]() -> jni::local_ref<${javaMapType}> {
|
|
523
|
+
auto __map = ${javaHashMapType}::create(${parameterName}.size());
|
|
524
|
+
for (const auto& __entry : ${parameterName}) {
|
|
525
|
+
__map->put(${indent(parseKey, ' ')}, ${indent(parseValue, ' ')});
|
|
526
|
+
}
|
|
527
|
+
return __map;
|
|
528
|
+
}()
|
|
529
|
+
`.trim();
|
|
530
|
+
default:
|
|
531
|
+
return parameterName;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
case 'array': {
|
|
535
|
+
const array = getTypeAs(this.type, ArrayType);
|
|
536
|
+
const arrayType = this.getTypeCode('c++');
|
|
537
|
+
const bridge = new KotlinCxxBridgedType(array.itemType);
|
|
538
|
+
switch (language) {
|
|
539
|
+
case 'c++': {
|
|
540
|
+
switch (array.itemType.kind) {
|
|
541
|
+
case 'number':
|
|
542
|
+
case 'boolean':
|
|
543
|
+
case 'bigint': {
|
|
544
|
+
// primitive arrays can be constructed more efficiently with region/batch access.
|
|
545
|
+
// no need to iterate through the entire array.
|
|
546
|
+
return `
|
|
547
|
+
[&]() {
|
|
548
|
+
size_t __size = ${parameterName}.size();
|
|
549
|
+
jni::local_ref<${arrayType}> __array = ${arrayType}::newArray(__size);
|
|
550
|
+
__array->setRegion(0, __size, ${parameterName}.data());
|
|
551
|
+
return __array;
|
|
552
|
+
}()
|
|
553
|
+
`.trim();
|
|
554
|
+
}
|
|
555
|
+
default: {
|
|
556
|
+
// other arrays need to loop through
|
|
557
|
+
return `
|
|
558
|
+
[&]() {
|
|
559
|
+
size_t __size = ${parameterName}.size();
|
|
560
|
+
jni::local_ref<${arrayType}> __array = ${arrayType}::newArray(__size);
|
|
561
|
+
for (size_t __i = 0; __i < __size; __i++) {
|
|
562
|
+
const auto& __element = ${parameterName}[__i];
|
|
563
|
+
__array->setElement(__i, *${indent(bridge.parseFromCppToKotlin('__element', 'c++'), ' ')});
|
|
564
|
+
}
|
|
565
|
+
return __array;
|
|
566
|
+
}()
|
|
567
|
+
`.trim();
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
case 'kotlin':
|
|
572
|
+
if (bridge.needsSpecialHandling) {
|
|
573
|
+
return `${parameterName}.map { ${bridge.parseFromCppToKotlin('it', language, isBoxed)} }`;
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
return parameterName;
|
|
577
|
+
}
|
|
578
|
+
default:
|
|
579
|
+
return parameterName;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
case 'promise': {
|
|
583
|
+
switch (language) {
|
|
584
|
+
case 'c++': {
|
|
585
|
+
const promise = getTypeAs(this.type, PromiseType);
|
|
586
|
+
const resolvingType = promise.resultingType.getCode('c++');
|
|
587
|
+
const bridge = new KotlinCxxBridgedType(promise.resultingType);
|
|
588
|
+
if (promise.resultingType.kind === 'void') {
|
|
589
|
+
// void: resolve()
|
|
590
|
+
return `
|
|
591
|
+
[&]() {
|
|
592
|
+
jni::local_ref<JPromise::javaobject> __localPromise = JPromise::create();
|
|
593
|
+
jni::global_ref<JPromise::javaobject> __promise = jni::make_global(__localPromise);
|
|
594
|
+
${parameterName}->addOnResolvedListener([=]() {
|
|
595
|
+
__promise->cthis()->resolve(JUnit::instance());
|
|
596
|
+
});
|
|
597
|
+
${parameterName}->addOnRejectedListener([=](const std::exception_ptr& __error) {
|
|
598
|
+
auto __jniError = jni::getJavaExceptionForCppException(__error);
|
|
599
|
+
__promise->cthis()->reject(__jniError);
|
|
600
|
+
});
|
|
601
|
+
return __localPromise;
|
|
602
|
+
}()
|
|
603
|
+
`.trim();
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
// T: resolve(T)
|
|
607
|
+
return `
|
|
608
|
+
[&]() {
|
|
609
|
+
jni::local_ref<JPromise::javaobject> __localPromise = JPromise::create();
|
|
610
|
+
jni::global_ref<JPromise::javaobject> __promise = jni::make_global(__localPromise);
|
|
611
|
+
${parameterName}->addOnResolvedListener([=](const ${resolvingType}& __result) {
|
|
612
|
+
__promise->cthis()->resolve(${indent(bridge.parseFromCppToKotlin('__result', 'c++', true), ' ')});
|
|
613
|
+
});
|
|
614
|
+
${parameterName}->addOnRejectedListener([=](const std::exception_ptr& __error) {
|
|
615
|
+
auto __jniError = jni::getJavaExceptionForCppException(__error);
|
|
616
|
+
__promise->cthis()->reject(__jniError);
|
|
617
|
+
});
|
|
618
|
+
return __localPromise;
|
|
619
|
+
}()
|
|
620
|
+
`.trim();
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
default:
|
|
624
|
+
return parameterName;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
case 'error':
|
|
628
|
+
switch (language) {
|
|
629
|
+
case 'c++':
|
|
630
|
+
return `jni::getJavaExceptionForCppException(${parameterName})`;
|
|
631
|
+
default:
|
|
632
|
+
return parameterName;
|
|
633
|
+
}
|
|
634
|
+
default:
|
|
635
|
+
// no need to parse anything, just return as is
|
|
636
|
+
return parameterName;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
parseFromKotlinToCpp(parameterName, language, isBoxed = false) {
|
|
640
|
+
switch (this.type.kind) {
|
|
641
|
+
case 'number':
|
|
642
|
+
case 'boolean':
|
|
643
|
+
case 'bigint':
|
|
644
|
+
switch (language) {
|
|
645
|
+
case 'c++':
|
|
646
|
+
let code;
|
|
647
|
+
if (isBoxed) {
|
|
648
|
+
// unbox an object (JDouble) to a primitive (double)
|
|
649
|
+
code = `${parameterName}->value()`;
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
// it's just the primitive type directly
|
|
653
|
+
code = parameterName;
|
|
654
|
+
}
|
|
655
|
+
if (this.type.kind === 'boolean') {
|
|
656
|
+
// jboolean =/= bool (it's a char in Java)
|
|
657
|
+
code = `static_cast<bool>(${code})`;
|
|
658
|
+
}
|
|
659
|
+
return code;
|
|
660
|
+
default:
|
|
661
|
+
return parameterName;
|
|
662
|
+
}
|
|
663
|
+
case 'string':
|
|
664
|
+
switch (language) {
|
|
665
|
+
case 'c++':
|
|
666
|
+
return `${parameterName}->toStdString()`;
|
|
667
|
+
default:
|
|
668
|
+
return parameterName;
|
|
669
|
+
}
|
|
670
|
+
case 'struct':
|
|
671
|
+
case 'enum': {
|
|
672
|
+
switch (language) {
|
|
673
|
+
case 'c++':
|
|
674
|
+
return `${parameterName}->toCpp()`;
|
|
675
|
+
default:
|
|
676
|
+
return parameterName;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
case 'variant': {
|
|
680
|
+
switch (language) {
|
|
681
|
+
case 'c++':
|
|
682
|
+
return `${parameterName}->toCpp()`;
|
|
683
|
+
default:
|
|
684
|
+
return parameterName;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
case 'date': {
|
|
688
|
+
switch (language) {
|
|
689
|
+
case 'c++':
|
|
690
|
+
return `${parameterName}->toChrono()`;
|
|
691
|
+
default:
|
|
692
|
+
return parameterName;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
case 'hybrid-object': {
|
|
696
|
+
switch (language) {
|
|
697
|
+
case 'c++':
|
|
698
|
+
const hybrid = getTypeAs(this.type, HybridObjectType);
|
|
699
|
+
const fullName = this.getFullJHybridObjectName(hybrid);
|
|
700
|
+
return `${parameterName}->cthis()->shared_cast<${fullName}>()`;
|
|
701
|
+
default:
|
|
702
|
+
return parameterName;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
case 'optional': {
|
|
706
|
+
const optional = getTypeAs(this.type, OptionalType);
|
|
707
|
+
const bridge = new KotlinCxxBridgedType(optional.wrappingType);
|
|
708
|
+
switch (language) {
|
|
709
|
+
case 'c++':
|
|
710
|
+
const parsed = bridge.parseFromKotlinToCpp(parameterName, 'c++', true);
|
|
711
|
+
return `${parameterName} != nullptr ? std::make_optional(${parsed}) : std::nullopt`;
|
|
712
|
+
case 'kotlin':
|
|
713
|
+
if (bridge.needsSpecialHandling) {
|
|
714
|
+
return `${parameterName}?.let { ${bridge.parseFromKotlinToCpp('it', language, isBoxed)} }`;
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
return parameterName;
|
|
718
|
+
}
|
|
719
|
+
default:
|
|
720
|
+
return parameterName;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
case 'function': {
|
|
724
|
+
const functionType = getTypeAs(this.type, FunctionType);
|
|
725
|
+
switch (language) {
|
|
726
|
+
case 'c++': {
|
|
727
|
+
const returnType = functionType.returnType.getCode('c++');
|
|
728
|
+
const params = functionType.parameters.map((p) => `${p.getCode('c++')} ${p.escapedName}`);
|
|
729
|
+
const paramsForward = functionType.parameters.map((p) => p.escapedName);
|
|
730
|
+
const jniType = `J${functionType.specializationName}_cxx`;
|
|
731
|
+
return `
|
|
732
|
+
[&]() -> ${functionType.getCode('c++')} {
|
|
733
|
+
if (${parameterName}->isInstanceOf(${jniType}::javaClassStatic())) [[likely]] {
|
|
734
|
+
auto downcast = jni::static_ref_cast<${jniType}::javaobject>(${parameterName});
|
|
735
|
+
return downcast->cthis()->getFunction();
|
|
736
|
+
} else {
|
|
737
|
+
auto ${parameterName}Ref = jni::make_global(${parameterName});
|
|
738
|
+
return [${parameterName}Ref](${params.join(', ')}) -> ${returnType} {
|
|
739
|
+
return ${parameterName}Ref->invoke(${paramsForward});
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
}()
|
|
743
|
+
`.trim();
|
|
744
|
+
}
|
|
745
|
+
case 'kotlin': {
|
|
746
|
+
return `${functionType.specializationName}_java(${parameterName})`;
|
|
747
|
+
}
|
|
748
|
+
default:
|
|
749
|
+
return parameterName;
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
case 'array-buffer': {
|
|
753
|
+
switch (language) {
|
|
754
|
+
case 'c++':
|
|
755
|
+
return `${parameterName}->cthis()->getArrayBuffer()`;
|
|
756
|
+
default:
|
|
757
|
+
return parameterName;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
case 'map': {
|
|
761
|
+
switch (language) {
|
|
762
|
+
case 'c++':
|
|
763
|
+
return `${parameterName}->cthis()->getMap()`;
|
|
764
|
+
default:
|
|
765
|
+
return parameterName;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
case 'record': {
|
|
769
|
+
switch (language) {
|
|
770
|
+
case 'c++':
|
|
771
|
+
const record = getTypeAs(this.type, RecordType);
|
|
772
|
+
const key = new KotlinCxxBridgedType(record.keyType);
|
|
773
|
+
const value = new KotlinCxxBridgedType(record.valueType);
|
|
774
|
+
const parseKey = key.parseFromKotlinToCpp('__entry.first', 'c++');
|
|
775
|
+
const parseValue = value.parseFromKotlinToCpp('__entry.second', 'c++');
|
|
776
|
+
const cxxType = this.type.getCode('c++');
|
|
777
|
+
return `
|
|
778
|
+
[&]() {
|
|
779
|
+
${cxxType} __map;
|
|
780
|
+
__map.reserve(${parameterName}->size());
|
|
781
|
+
for (const auto& __entry : *${parameterName}) {
|
|
782
|
+
__map.emplace(${indent(parseKey, ' ')}, ${indent(parseValue, ' ')});
|
|
783
|
+
}
|
|
784
|
+
return __map;
|
|
785
|
+
}()
|
|
786
|
+
`.trim();
|
|
787
|
+
default:
|
|
788
|
+
return parameterName;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
case 'array': {
|
|
792
|
+
switch (language) {
|
|
793
|
+
case 'c++':
|
|
794
|
+
const array = getTypeAs(this.type, ArrayType);
|
|
795
|
+
const bridge = new KotlinCxxBridgedType(array.itemType);
|
|
796
|
+
const itemType = array.itemType.getCode('c++');
|
|
797
|
+
switch (array.itemType.kind) {
|
|
798
|
+
case 'number':
|
|
799
|
+
case 'boolean':
|
|
800
|
+
case 'bigint': {
|
|
801
|
+
// primitive arrays can use region/batch access,
|
|
802
|
+
// which we can use to construct the vector directly instead of looping through it.
|
|
803
|
+
return `
|
|
804
|
+
[&]() {
|
|
805
|
+
size_t __size = ${parameterName}->size();
|
|
806
|
+
std::vector<${itemType}> __vector(__size);
|
|
807
|
+
${parameterName}->getRegion(0, __size, __vector.data());
|
|
808
|
+
return __vector;
|
|
809
|
+
}()
|
|
810
|
+
`.trim();
|
|
811
|
+
}
|
|
812
|
+
default: {
|
|
813
|
+
// other arrays need to loop through
|
|
814
|
+
return `
|
|
815
|
+
[&]() {
|
|
816
|
+
size_t __size = ${parameterName}->size();
|
|
817
|
+
std::vector<${itemType}> __vector;
|
|
818
|
+
__vector.reserve(__size);
|
|
819
|
+
for (size_t __i = 0; __i < __size; __i++) {
|
|
820
|
+
auto __element = ${parameterName}->getElement(__i);
|
|
821
|
+
__vector.push_back(${bridge.parseFromKotlinToCpp('__element', 'c++')});
|
|
822
|
+
}
|
|
823
|
+
return __vector;
|
|
824
|
+
}()
|
|
825
|
+
`.trim();
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
default:
|
|
829
|
+
return parameterName;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
case 'promise': {
|
|
833
|
+
switch (language) {
|
|
834
|
+
case 'c++':
|
|
835
|
+
const promise = getTypeAs(this.type, PromiseType);
|
|
836
|
+
const actualCppType = promise.resultingType.getCode('c++');
|
|
837
|
+
const resultingType = new KotlinCxxBridgedType(promise.resultingType);
|
|
838
|
+
let resolveBody;
|
|
839
|
+
if (resultingType.hasType) {
|
|
840
|
+
// it's a Promise<T>
|
|
841
|
+
resolveBody = `
|
|
842
|
+
auto __result = jni::static_ref_cast<${resultingType.getTypeCode('c++', true)}>(__boxedResult);
|
|
843
|
+
__promise->resolve(${resultingType.parseFromKotlinToCpp('__result', 'c++', true)});
|
|
844
|
+
`.trim();
|
|
845
|
+
}
|
|
846
|
+
else {
|
|
847
|
+
// it's a Promise<void>
|
|
848
|
+
resolveBody = `
|
|
849
|
+
__promise->resolve();
|
|
850
|
+
`.trim();
|
|
851
|
+
}
|
|
852
|
+
return `
|
|
853
|
+
[&]() {
|
|
854
|
+
auto __promise = Promise<${actualCppType}>::create();
|
|
855
|
+
${parameterName}->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& ${resultingType.hasType ? '__boxedResult' : '/* unit */'}) {
|
|
856
|
+
${indent(resolveBody, ' ')}
|
|
857
|
+
});
|
|
858
|
+
${parameterName}->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
|
|
859
|
+
jni::JniException __jniError(__throwable);
|
|
860
|
+
__promise->reject(std::make_exception_ptr(__jniError));
|
|
861
|
+
});
|
|
862
|
+
return __promise;
|
|
863
|
+
}()
|
|
864
|
+
`.trim();
|
|
865
|
+
default:
|
|
866
|
+
return parameterName;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
case 'error':
|
|
870
|
+
switch (language) {
|
|
871
|
+
case 'c++':
|
|
872
|
+
return `jni::JniException(${parameterName})`;
|
|
873
|
+
default:
|
|
874
|
+
return parameterName;
|
|
875
|
+
}
|
|
876
|
+
default:
|
|
877
|
+
// no need to parse anything, just return as is
|
|
878
|
+
return parameterName;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
getFullJHybridObjectName(hybridObject) {
|
|
882
|
+
const name = getHybridObjectName(hybridObject.hybridObjectName);
|
|
883
|
+
if (hybridObject.sourceConfig.isExternalConfig) {
|
|
884
|
+
// fully qualified name like "margelo::nitro::image::JImage"
|
|
885
|
+
const fullName = hybridObject.sourceConfig.getCxxNamespace('c++', name.JHybridTSpec);
|
|
886
|
+
return fullName;
|
|
887
|
+
}
|
|
888
|
+
else {
|
|
889
|
+
// relative name like "JImage"
|
|
890
|
+
return name.JHybridTSpec;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
}
|