[FE] Return Name? instead of List<Name> 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
This commit is contained in:
Dmitriy Novozhilov
2021-12-13 11:57:44 +03:00
parent 09a7a1c09f
commit 17916d4a63
3 changed files with 25 additions and 29 deletions
@@ -222,9 +222,9 @@ class JavaClassUseSiteMemberScope(
override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) { override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
val potentialPropertyNames = getPropertyNamesCandidatesByAccessorName(name) 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 !name.sameAsBuiltinMethodWithErasedValueParameters && !name.sameAsRenamedInJvmBuiltin
) { ) {
return super.processFunctionsByName(name, processor) return super.processFunctionsByName(name, processor)
@@ -233,7 +233,7 @@ class JavaClassUseSiteMemberScope(
val overriddenProperties = potentialPropertyNames.flatMap(this::getProperties).filterIsInstance<FirPropertySymbol>() val overriddenProperties = potentialPropertyNames.flatMap(this::getProperties).filterIsInstance<FirPropertySymbol>()
specialFunctions.getOrPut(name) { specialFunctions.getOrPut(name) {
doProcessSpecialFunctions(name, overriddenProperties, renamedSpecialBuiltInNames) doProcessSpecialFunctions(name, overriddenProperties, renamedSpecialBuiltInName)
}.forEach { }.forEach {
processor(it) processor(it)
} }
@@ -242,14 +242,14 @@ class JavaClassUseSiteMemberScope(
private fun doProcessSpecialFunctions( private fun doProcessSpecialFunctions(
name: Name, name: Name,
overriddenProperties: List<FirPropertySymbol>, overriddenProperties: List<FirPropertySymbol>,
renamedSpecialBuiltInNames: List<Name> renamedSpecialBuiltInName: Name?
): List<FirNamedFunctionSymbol> { ): List<FirNamedFunctionSymbol> {
val result = mutableListOf<FirNamedFunctionSymbol>() val result = mutableListOf<FirNamedFunctionSymbol>()
declaredMemberScope.processFunctionsByName(name) { functionSymbol -> declaredMemberScope.processFunctionsByName(name) { functionSymbol ->
if (functionSymbol.isStatic) return@processFunctionsByName if (functionSymbol.isStatic) return@processFunctionsByName
if (overriddenProperties.none { it.isOverriddenInClassBy(functionSymbol) } && if (overriddenProperties.none { it.isOverriddenInClassBy(functionSymbol) } &&
!functionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInNames) && !functionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInName) &&
!functionSymbol.shouldBeVisibleAsOverrideOfBuiltInWithErasedValueParameters() !functionSymbol.shouldBeVisibleAsOverrideOfBuiltInWithErasedValueParameters()
) { ) {
result += functionSymbol result += functionSymbol
@@ -392,19 +392,17 @@ class JavaClassUseSiteMemberScope(
return upperBound.classId == StandardClassIds.Any return upperBound.classId == StandardClassIds.Any
} }
private fun FirNamedFunctionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInNames: List<Name>): Boolean { private fun FirNamedFunctionSymbol.doesOverrideRenamedBuiltins(renamedSpecialBuiltInName: Name?): Boolean {
return renamedSpecialBuiltInNames.any { if (renamedSpecialBuiltInName == null) return false
// e.g. 'removeAt' or 'toInt' // e.g. 'removeAt' or 'toInt'
builtinName -> val builtinSpecialFromSuperTypes =
val builtinSpecialFromSuperTypes = getFunctionsFromSupertypes(renamedSpecialBuiltInName).filter { it.getOverriddenBuiltinWithDifferentJvmName() != null }
getFunctionsFromSupertypes(builtinName).filter { it.getOverriddenBuiltinWithDifferentJvmName() != null } if (builtinSpecialFromSuperTypes.isEmpty()) return false
if (builtinSpecialFromSuperTypes.isEmpty()) return@any false
val currentJvmDescriptor = fir.computeJvmDescriptor(customName = builtinName.asString()) val currentJvmDescriptor = fir.computeJvmDescriptor(customName = renamedSpecialBuiltInName.asString())
builtinSpecialFromSuperTypes.any { builtinSpecial -> return builtinSpecialFromSuperTypes.any { builtinSpecial ->
builtinSpecial.fir.computeJvmDescriptor() == currentJvmDescriptor builtinSpecial.fir.computeJvmDescriptor() == currentJvmDescriptor
}
} }
} }
@@ -127,13 +127,13 @@ open class SpecialGenericSignatures {
val ORIGINAL_SHORT_NAMES: List<Name> = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.keys.map { it.name } val ORIGINAL_SHORT_NAMES: List<Name> = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.keys.map { it.name }
val JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP: Map<Name, List<Name>> = val JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP: Map<Name, Name> =
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.entries NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.entries
.map { Pair(it.key.name, it.value) } .map { Pair(it.key.name, it.value) }
.groupBy({ it.second }, { it.first }) .associateBy({ it.second }, { it.first })
fun getBuiltinFunctionNamesByJvmName(name: Name): List<Name> = fun getBuiltinFunctionNamesByJvmName(name: Name): Name? =
JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP[name] ?: emptyList() JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP[name]
val Name.sameAsBuiltinMethodWithErasedValueParameters: Boolean val Name.sameAsBuiltinMethodWithErasedValueParameters: Boolean
get() = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES get() = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES
@@ -205,17 +205,15 @@ class LazyJavaClassMemberScope(
} }
private fun SimpleFunctionDescriptor.doesOverrideRenamedBuiltins(): Boolean { private fun SimpleFunctionDescriptor.doesOverrideRenamedBuiltins(): Boolean {
return SpecialGenericSignatures.getBuiltinFunctionNamesByJvmName(name).any { // e.g. 'removeAt' or 'toInt'
// e.g. 'removeAt' or 'toInt' val builtinName = SpecialGenericSignatures.getBuiltinFunctionNamesByJvmName(name) ?: return false
builtinName -> val builtinSpecialFromSuperTypes =
val builtinSpecialFromSuperTypes = getFunctionsFromSupertypes(builtinName).filter { it.doesOverrideBuiltinWithDifferentJvmName() }
getFunctionsFromSupertypes(builtinName).filter { it.doesOverrideBuiltinWithDifferentJvmName() } if (builtinSpecialFromSuperTypes.isEmpty()) return false
if (builtinSpecialFromSuperTypes.isEmpty()) return@any 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 { private fun SimpleFunctionDescriptor.doesOverrideSuspendFunction(): Boolean {