K2: Refine how JDK members are mapped to built-in classes

Previously, the semantic was more-or-less correct for most of the cases
but some corner one, like `sort` in MutableList didn't work properly.

Namely, `sort` should be marked there in a way to forbid to call it
everywhere beside super-calls.
Also, overriding it should be allowed.

Mostly, the logic was re-written to K2 model from K1-related
JvmBuiltInsCustomizer.

^KT-57694 In progress
^KT-57269 Fixed
This commit is contained in:
Denis.Zharkov
2023-04-13 11:50:54 +02:00
committed by Space Team
parent 161fe1d2ca
commit 2e5b783cc6
59 changed files with 1225 additions and 595 deletions
@@ -204,7 +204,7 @@ object JavaToKotlinClassMap {
fun isMutable(fqNameUnsafe: FqNameUnsafe?): Boolean = mutableToReadOnly.containsKey(fqNameUnsafe)
fun isReadOnly(fqNameUnsafe: FqNameUnsafe?): Boolean = readOnlyToMutable.containsKey(fqNameUnsafe)
fun isMutable(classId: ClassId?): Boolean = readOnlyToMutableClassId.containsKey(classId)
fun isMutable(classId: ClassId?): Boolean = mutableToReadOnlyClassId.containsKey(classId)
fun isReadOnly(classId: ClassId?): Boolean = readOnlyToMutableClassId.containsKey(classId)
private fun classId(clazz: Class<*>): ClassId {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.load.java
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
@@ -30,6 +31,10 @@ object BuiltinSpecialProperties {
it.value.distinct()
}
val GETTER_FQ_NAMES: Set<FqName> = PROPERTY_FQ_NAME_TO_JVM_GETTER_NAME_MAP.mapTo(mutableSetOf()) {
JavaToKotlinClassMap.mapKotlinToJava(it.key.parent().toUnsafe())!!.asSingleFqName().child(it.value)
}
val SPECIAL_FQ_NAMES: Set<FqName> = PROPERTY_FQ_NAME_TO_JVM_GETTER_NAME_MAP.keys
val SPECIAL_SHORT_NAMES: Set<Name> = SPECIAL_FQ_NAMES.map(FqName::shortName).toSet()
@@ -41,12 +41,15 @@ open class SpecialGenericSignatures {
SpecialSignatureInfo.OBJECT_PARAMETER_NON_GENERIC
}
data class NameAndSignature internal constructor(val name: Name, val signature: String)
data class NameAndSignature(val classInternalName: String, val name: Name, val parameters: String, val returnType: String) {
val signature = SignatureBuildingComponents.signature(classInternalName, "$name($parameters)$returnType")
}
private fun String.method(name: String, parameters: String, returnType: String) =
NameAndSignature(
this@method,
Name.identifier(name),
SignatureBuildingComponents.signature(this@method, "$name($parameters)$returnType")
parameters, returnType,
)
private val ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES = setOf(
@@ -125,6 +128,12 @@ open class SpecialGenericSignatures {
val SIGNATURE_TO_JVM_REPRESENTATION_NAME: Map<String, Name> =
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.mapKeys { it.key.signature }
// java/lang/Number.intValue()I, java/lang/ etc.
val JVM_SIGNATURES_FOR_RENAMED_BUILT_INS: Set<String> =
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.mapTo(mutableSetOf()) { (signatureAndName, jdkName) ->
signatureAndName.copy(name = jdkName).signature
}
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, Name> =