Skip to content

Commit d7aa9e7

Browse files
authored
Fix Kotlin enum accessing issue (#1559)
1 parent d33b5aa commit d7aa9e7

File tree

5 files changed

+46
-1
lines changed

5 files changed

+46
-1
lines changed

test-app/app/src/main/assets/app/mainpage.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ require("./tests/kotlin/delegation/testDelegationSupport");
6161
require("./tests/kotlin/objects/testObjectsSupport");
6262
require("./tests/kotlin/functions/testTopLevelFunctionsSupport");
6363
require("./tests/kotlin/extensions/testExtensionFunctionsSupport");
64+
require("./tests/kotlin/enums/testEnumsSupport");
6465
require("./tests/kotlin/access/testInternalLanguageFeaturesSupport");
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
describe("Tests Kotlin extension functions support", function () {
2+
3+
it("Test Kotlin enum entries are accessible", function () {
4+
var enumEntry = com.tns.tests.kotlin.enums.KotlinEnum.TEST_ENTRY;
5+
6+
expect(enumEntry).not.toBe(undefined);
7+
expect(enumEntry).not.toBe(null);
8+
});
9+
10+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.tns.tests.kotlin.enums
2+
3+
enum class KotlinEnum {
4+
TEST_ENTRY
5+
}

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.telerik.metadata.parsing.NativeMethodDescriptor
77
import com.telerik.metadata.parsing.NativePropertyDescriptor
88
import com.telerik.metadata.parsing.bytecode.classes.NativeClassBytecodeDescriptor
99
import com.telerik.metadata.parsing.kotlin.fields.KotlinCompanionFieldDescriptor
10+
import com.telerik.metadata.parsing.kotlin.fields.KotlinEnumFieldDescriptor
1011
import com.telerik.metadata.parsing.kotlin.fields.KotlinJvmFieldDescriptor
1112
import com.telerik.metadata.parsing.kotlin.metadata.MetadataAnnotation
1213
import com.telerik.metadata.parsing.kotlin.metadata.bytecode.BytecodeClassMetadataParser
@@ -36,7 +37,6 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati
3637

3738
override val fields: Array<NativeFieldDescriptor> by lazy {
3839
val fields = ArrayList<NativeFieldDescriptor>()
39-
4040
val meta = kotlinMetadata
4141
var kotlinMetadataProperties: Collection<KmProperty> = emptyList()
4242

@@ -48,6 +48,12 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati
4848
if (possibleCompanionField.isPresent) {
4949
fields.add(possibleCompanionField.get())
5050
}
51+
52+
if(metaClass.enumEntries.isNotEmpty()){
53+
val enumFields = getEnumEntriesAsFields(nativeClass, metaClass.enumEntries)
54+
fields.addAll(enumFields)
55+
}
56+
5157
} else if (meta is KotlinClassMetadata.FileFacade) {
5258
kotlinMetadataProperties = meta.toKmPackage().properties
5359
} else if (meta is KotlinClassMetadata.MultiFileClassPart) {
@@ -107,6 +113,20 @@ class KotlinClassDescriptor(nativeClass: JavaClass, private val metadataAnnotati
107113
return Optional.empty()
108114
}
109115

116+
private fun getEnumEntriesAsFields(nativeClass: JavaClass, metadataEnumEntries: Collection<String>): Collection<KotlinEnumFieldDescriptor> {
117+
val bytecodeFields = nativeClass.fields
118+
119+
val matchingEnumFields = bytecodeFields
120+
.filter {
121+
metadataEnumEntries.contains(it.name)
122+
}
123+
.map {
124+
KotlinEnumFieldDescriptor(it, isPublic, isInternal, isProtected)
125+
}
126+
127+
return matchingEnumFields
128+
}
129+
110130
override val properties: Array<out NativePropertyDescriptor> by lazy {
111131
val metadata = kotlinMetadata
112132
if (metadata is KotlinClassMetadata.Class) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.telerik.metadata.parsing.kotlin.fields
2+
3+
import com.telerik.metadata.parsing.bytecode.fields.NativeFieldBytecodeDescriptor
4+
import org.apache.bcel.classfile.Field
5+
6+
class KotlinEnumFieldDescriptor(field: Field,
7+
override val isPublic: Boolean,
8+
override val isInternal: Boolean,
9+
override val isProtected: Boolean) : NativeFieldBytecodeDescriptor(field)

0 commit comments

Comments
 (0)