From 4ea0b4911a073600095dcf0a3a417864c043985d Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 2 Mar 2020 20:04:43 +0300 Subject: [PATCH] Avoid excessive JavaForKotlinOverridePropertyDescriptors When there are two candidates for a Java method to be interpreted as a getter for inherited Kotlin property, one from current class, another from supertype, create just one JavaForKotlinOverridePropertyDescriptor. Case in point: java.lang.Hashtable. --- .../java/lazy/descriptors/LazyJavaClassMemberScope.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 7a53b2356af..ef4a0c65db9 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -447,11 +447,13 @@ class LazyJavaClassMemberScope( val propertiesFromSupertypes = getPropertiesFromSupertypes(name) if (propertiesFromSupertypes.isEmpty()) return + val handledProperties = SmartSet.create() + val propertiesOverridesFromSuperTypes = SmartSet.create() - addPropertyOverrideByMethod(propertiesFromSupertypes, result) { searchMethodsByNameWithoutBuiltinMagic(it) } + addPropertyOverrideByMethod(propertiesFromSupertypes, result, handledProperties) { searchMethodsByNameWithoutBuiltinMagic(it) } - addPropertyOverrideByMethod(propertiesFromSupertypes, propertiesOverridesFromSuperTypes) { + addPropertyOverrideByMethod(propertiesFromSupertypes - handledProperties, propertiesOverridesFromSuperTypes, null) { searchMethodsInSupertypesWithoutBuiltinMagic(it) } @@ -470,12 +472,14 @@ class LazyJavaClassMemberScope( private fun addPropertyOverrideByMethod( propertiesFromSupertypes: Set, result: MutableCollection, + handledProperties: MutableSet?, functions: (Name) -> Collection ) { for (property in propertiesFromSupertypes) { val newProperty = createPropertyDescriptorByMethods(property, functions) if (newProperty != null) { result.add(newProperty) + handledProperties?.add(property) break } }