diff --git a/test-app/app/src/main/assets/app/tests/kotlin/objects/testObjectsSupport.js b/test-app/app/src/main/assets/app/tests/kotlin/objects/testObjectsSupport.js index 62d070346..304bd3582 100644 --- a/test-app/app/src/main/assets/app/tests/kotlin/objects/testObjectsSupport.js +++ b/test-app/app/src/main/assets/app/tests/kotlin/objects/testObjectsSupport.js @@ -2,6 +2,12 @@ describe("Tests Kotlin objects support", function () { it("Test Kotlin object instances should be the same reference", function () { var kotlinClass = com.tns.tests.kotlin.objects.KotlinSingleton.INSTANCE; var kotlinClass2 = com.tns.tests.kotlin.objects.KotlinSingleton.INSTANCE; + + expect(kotlinClass).not.toBe(null); + expect(kotlinClass).not.toBe(undefined); + expect(kotlinClass2).not.toBe(null); + expect(kotlinClass2).not.toBe(undefined); + expect(com.tns.EqualityComparator.areReferencesEqual(kotlinClass, kotlinClass2)).toBe(true); }); }); \ No newline at end of file diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/classes/KotlinClassDescriptor.kt b/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/classes/KotlinClassDescriptor.kt index eb42a1814..93c87c5ca 100644 --- a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/classes/KotlinClassDescriptor.kt +++ b/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/classes/KotlinClassDescriptor.kt @@ -2,6 +2,7 @@ package com.telerik.metadata.parsing.kotlin.classes import com.telerik.metadata.ClassRepo import com.telerik.metadata.ClassUtil +import com.telerik.metadata.ClassUtil.getCanonicalName import com.telerik.metadata.parsing.NativeFieldDescriptor import com.telerik.metadata.parsing.NativeMethodDescriptor import com.telerik.metadata.parsing.NativePropertyDescriptor @@ -9,6 +10,7 @@ import com.telerik.metadata.parsing.bytecode.classes.NativeClassBytecodeDescript import com.telerik.metadata.parsing.kotlin.fields.KotlinCompanionFieldDescriptor import com.telerik.metadata.parsing.kotlin.fields.KotlinEnumFieldDescriptor import com.telerik.metadata.parsing.kotlin.fields.KotlinJvmFieldDescriptor +import com.telerik.metadata.parsing.kotlin.fields.KotlinObjectInstanceFieldDescriptor import com.telerik.metadata.parsing.kotlin.metadata.MetadataAnnotation import com.telerik.metadata.parsing.kotlin.metadata.bytecode.BytecodeClassMetadataParser import com.telerik.metadata.parsing.kotlin.methods.KotlinMethodDescriptor @@ -49,7 +51,12 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati fields.add(possibleCompanionField.get()) } - if(metaClass.enumEntries.isNotEmpty()){ + val possibleObjectInstanceField = getObjectFieldIfAny(nativeClass) + if(possibleObjectInstanceField.isPresent){ + fields.add(possibleObjectInstanceField.get()) + } + + if (metaClass.enumEntries.isNotEmpty()) { val enumFields = getEnumEntriesAsFields(nativeClass, metaClass.enumEntries) fields.addAll(enumFields) } @@ -113,6 +120,21 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati return Optional.empty() } + private fun getObjectFieldIfAny(nativeClass: JavaClass): Optional { + return nativeClass + .fields + .singleOrNull { field -> + field.name == "INSTANCE" && getCanonicalName(field.type.signature) == nativeClass.className + }.run { + if (this != null) { + val objectInstanceField = KotlinObjectInstanceFieldDescriptor(this@run, this@KotlinClassDescriptor) + Optional.of(objectInstanceField) + } else { + Optional.empty() + } + } + } + private fun getEnumEntriesAsFields(nativeClass: JavaClass, metadataEnumEntries: Collection): Collection { val bytecodeFields = nativeClass.fields diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/fields/KotlinObjectInstanceFieldDescriptor.kt b/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/fields/KotlinObjectInstanceFieldDescriptor.kt new file mode 100644 index 000000000..329fe81d8 --- /dev/null +++ b/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/fields/KotlinObjectInstanceFieldDescriptor.kt @@ -0,0 +1,11 @@ +package com.telerik.metadata.parsing.kotlin.fields + +import com.telerik.metadata.parsing.bytecode.fields.NativeFieldBytecodeDescriptor +import com.telerik.metadata.parsing.kotlin.classes.KotlinClassDescriptor +import org.apache.bcel.classfile.Field + +class KotlinObjectInstanceFieldDescriptor(field: Field, companion: KotlinClassDescriptor) : NativeFieldBytecodeDescriptor(field) { + override val isPublic = companion.isPublic + override val isInternal = companion.isInternal + override val isProtected = companion.isProtected +} \ No newline at end of file