Skip to content

Commit ecb25b2

Browse files
authored
Fix Kotlin Object issue (#1562)
1 parent d7aa9e7 commit ecb25b2

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

test-app/app/src/main/assets/app/tests/kotlin/objects/testObjectsSupport.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ describe("Tests Kotlin objects support", function () {
22
it("Test Kotlin object instances should be the same reference", function () {
33
var kotlinClass = com.tns.tests.kotlin.objects.KotlinSingleton.INSTANCE;
44
var kotlinClass2 = com.tns.tests.kotlin.objects.KotlinSingleton.INSTANCE;
5+
6+
expect(kotlinClass).not.toBe(null);
7+
expect(kotlinClass).not.toBe(undefined);
8+
expect(kotlinClass2).not.toBe(null);
9+
expect(kotlinClass2).not.toBe(undefined);
10+
511
expect(com.tns.EqualityComparator.areReferencesEqual(kotlinClass, kotlinClass2)).toBe(true);
612
});
713
});

test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/parsing/kotlin/classes/KotlinClassDescriptor.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package com.telerik.metadata.parsing.kotlin.classes
22

33
import com.telerik.metadata.ClassRepo
44
import com.telerik.metadata.ClassUtil
5+
import com.telerik.metadata.ClassUtil.getCanonicalName
56
import com.telerik.metadata.parsing.NativeFieldDescriptor
67
import com.telerik.metadata.parsing.NativeMethodDescriptor
78
import com.telerik.metadata.parsing.NativePropertyDescriptor
89
import com.telerik.metadata.parsing.bytecode.classes.NativeClassBytecodeDescriptor
910
import com.telerik.metadata.parsing.kotlin.fields.KotlinCompanionFieldDescriptor
1011
import com.telerik.metadata.parsing.kotlin.fields.KotlinEnumFieldDescriptor
1112
import com.telerik.metadata.parsing.kotlin.fields.KotlinJvmFieldDescriptor
13+
import com.telerik.metadata.parsing.kotlin.fields.KotlinObjectInstanceFieldDescriptor
1214
import com.telerik.metadata.parsing.kotlin.metadata.MetadataAnnotation
1315
import com.telerik.metadata.parsing.kotlin.metadata.bytecode.BytecodeClassMetadataParser
1416
import com.telerik.metadata.parsing.kotlin.methods.KotlinMethodDescriptor
@@ -49,7 +51,12 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati
4951
fields.add(possibleCompanionField.get())
5052
}
5153

52-
if(metaClass.enumEntries.isNotEmpty()){
54+
val possibleObjectInstanceField = getObjectFieldIfAny(nativeClass)
55+
if(possibleObjectInstanceField.isPresent){
56+
fields.add(possibleObjectInstanceField.get())
57+
}
58+
59+
if (metaClass.enumEntries.isNotEmpty()) {
5360
val enumFields = getEnumEntriesAsFields(nativeClass, metaClass.enumEntries)
5461
fields.addAll(enumFields)
5562
}
@@ -113,6 +120,21 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati
113120
return Optional.empty()
114121
}
115122

123+
private fun getObjectFieldIfAny(nativeClass: JavaClass): Optional<KotlinObjectInstanceFieldDescriptor> {
124+
return nativeClass
125+
.fields
126+
.singleOrNull { field ->
127+
field.name == "INSTANCE" && getCanonicalName(field.type.signature) == nativeClass.className
128+
}.run {
129+
if (this != null) {
130+
val objectInstanceField = KotlinObjectInstanceFieldDescriptor(this@run, this@KotlinClassDescriptor)
131+
Optional.of(objectInstanceField)
132+
} else {
133+
Optional.empty()
134+
}
135+
}
136+
}
137+
116138
private fun getEnumEntriesAsFields(nativeClass: JavaClass, metadataEnumEntries: Collection<String>): Collection<KotlinEnumFieldDescriptor> {
117139
val bytecodeFields = nativeClass.fields
118140

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.telerik.metadata.parsing.kotlin.fields
2+
3+
import com.telerik.metadata.parsing.bytecode.fields.NativeFieldBytecodeDescriptor
4+
import com.telerik.metadata.parsing.kotlin.classes.KotlinClassDescriptor
5+
import org.apache.bcel.classfile.Field
6+
7+
class KotlinObjectInstanceFieldDescriptor(field: Field, companion: KotlinClassDescriptor) : NativeFieldBytecodeDescriptor(field) {
8+
override val isPublic = companion.isPublic
9+
override val isInternal = companion.isInternal
10+
override val isProtected = companion.isProtected
11+
}

0 commit comments

Comments
 (0)