From 17916d4a637344eace85c0d9917eb07464563f85 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 13 Dec 2021 11:57:44 +0300 Subject: [PATCH] [FE] Return Name? instead of List from `getBuiltinFunctionNamesByJvmName` This is much more correct, because we have one to one mapping for special java functions in this case, so using single nullable name instead of list of names makes code more readable --- .../scopes/JavaClassUseSiteMemberScope.kt | 30 +++++++++---------- .../load/java/SpecialGenericSignatures.kt | 8 ++--- .../descriptors/LazyJavaClassMemberScope.kt | 16 +++++----- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index d9d49dd2ac0..76f01c4c10a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -222,9 +222,9 @@ class JavaClassUseSiteMemberScope( override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) { val potentialPropertyNames = getPropertyNamesCandidatesByAccessorName(name) - val renamedSpecialBuiltInNames = SpecialGenericSignatures.getBuiltinFunctionNamesByJvmName(name) + val renamedSpecialBuiltInName = SpecialGenericSignatures.getBuiltinFunctionNamesByJvmName(name) - if (potentialPropertyNames.isEmpty() && renamedSpecialBuiltInNames.isEmpty() && + if (potentialPropertyNames.isEmpty() && renamedSpecialBuiltInName == null && !name.sameAsBuiltinMethodWithErasedValueParameters && !name.sameAsRenamedInJvmBuiltin ) { return super.processFunctionsByName(name, processor) @@ -233,7 +233,7 @@ class JavaClassUseSiteMemberScope( val overriddenProperties = potentialPropertyNames.flatMap(this::getProperties).filterIsInstance() specialFunctions.getOrPut(name) { - doProcessSpecialFunctions(name, overriddenProperties, renamedSpecialBuiltInNames) + doProcessSpecialFunctions(name, overriddenProperties, renamedSpecialBuiltInName) }.forEach { processor(it) } @@ -242,14 +242,14 @@ class JavaClassUseSiteMemberScope( private fun doProcessSpecialFunctions( name: Name, overriddenProperties: List, - renamedSpecialBuiltInNames: List + renamedSpecialBuiltInName: Name? ): List { val result = mutableListOf() declaredMemberScope.processFunctionsByName(name) { functionSymbol -> if (functionSymbol.isStatic) return@processFunctionsByName if (overriddenProperties.none { it.isOverriddenInClassBy(functionSymbol) } && - !functionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInNames) && + !functionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInName) && !functionSymbol.shouldBeVisibleAsOverrideOfBuiltInWithErasedValueParameters() ) { result += functionSymbol @@ -392,19 +392,17 @@ class JavaClassUseSiteMemberScope( return upperBound.classId == StandardClassIds.Any } - private fun FirNamedFunctionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInNames: List): Boolean { - return renamedSpecialBuiltInNames.any { - // e.g. 'removeAt' or 'toInt' - builtinName -> - val builtinSpecialFromSuperTypes = - getFunctionsFromSupertypes(builtinName).filter { it.getOverriddenBuiltinWithDifferentJvmName() != null } - if (builtinSpecialFromSuperTypes.isEmpty()) return@any false + private fun FirNamedFunctionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInName: Name?): Boolean { + if (renamedSpecialBuiltInName == null) return false + // e.g. 'removeAt' or 'toInt' + val builtinSpecialFromSuperTypes = + getFunctionsFromSupertypes(renamedSpecialBuiltInName).filter { it.getOverriddenBuiltinWithDifferentJvmName() != null } + if (builtinSpecialFromSuperTypes.isEmpty()) return false - val currentJvmDescriptor = fir.computeJvmDescriptor(customName = builtinName.asString()) + val currentJvmDescriptor = fir.computeJvmDescriptor(customName = renamedSpecialBuiltInName.asString()) - builtinSpecialFromSuperTypes.any { builtinSpecial -> - builtinSpecial.fir.computeJvmDescriptor() == currentJvmDescriptor - } + return builtinSpecialFromSuperTypes.any { builtinSpecial -> + builtinSpecial.fir.computeJvmDescriptor() == currentJvmDescriptor } } diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/SpecialGenericSignatures.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/SpecialGenericSignatures.kt index 6314884ae22..02516c4df75 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/SpecialGenericSignatures.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/SpecialGenericSignatures.kt @@ -127,13 +127,13 @@ open class SpecialGenericSignatures { val ORIGINAL_SHORT_NAMES: List = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.keys.map { it.name } - val JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP: Map> = + val JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP: Map = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.entries .map { Pair(it.key.name, it.value) } - .groupBy({ it.second }, { it.first }) + .associateBy({ it.second }, { it.first }) - fun getBuiltinFunctionNamesByJvmName(name: Name): List = - JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP[name] ?: emptyList() + fun getBuiltinFunctionNamesByJvmName(name: Name): Name? = + JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP[name] val Name.sameAsBuiltinMethodWithErasedValueParameters: Boolean get() = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES 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 a1749ae64c1..03d6eb484b3 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 @@ -205,17 +205,15 @@ class LazyJavaClassMemberScope( } private fun SimpleFunctionDescriptor.doesOverrideRenamedBuiltins(): Boolean { - return SpecialGenericSignatures.getBuiltinFunctionNamesByJvmName(name).any { - // e.g. 'removeAt' or 'toInt' - builtinName -> - val builtinSpecialFromSuperTypes = - getFunctionsFromSupertypes(builtinName).filter { it.doesOverrideBuiltinWithDifferentJvmName() } - if (builtinSpecialFromSuperTypes.isEmpty()) return@any false + // e.g. 'removeAt' or 'toInt' + val builtinName = SpecialGenericSignatures.getBuiltinFunctionNamesByJvmName(name) ?: return false + val builtinSpecialFromSuperTypes = + getFunctionsFromSupertypes(builtinName).filter { it.doesOverrideBuiltinWithDifferentJvmName() } + if (builtinSpecialFromSuperTypes.isEmpty()) return false - val methodDescriptor = this.createRenamedCopy(builtinName) + val methodDescriptor = this.createRenamedCopy(builtinName) - builtinSpecialFromSuperTypes.any { doesOverrideRenamedDescriptor(it, methodDescriptor) } - } + return builtinSpecialFromSuperTypes.any { doesOverrideRenamedDescriptor(it, methodDescriptor) } } private fun SimpleFunctionDescriptor.doesOverrideSuspendFunction(): Boolean {