Extract special generic signatures to compiler.common.jvm to reuse in FIR
This commit is contained in:
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.config.isReleaseCoroutines
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
|
import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.SpecialSignatureInfo
|
import org.jetbrains.kotlin.load.java.SpecialGenericSignatures.SpecialSignatureInfo
|
||||||
import org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil
|
import org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|||||||
+2
-2
@@ -410,13 +410,13 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
|
|||||||
|
|
||||||
// From BuiltinMethodsWithDifferentJvmName.isBuiltinFunctionWithDifferentNameInJvm, BuiltinMethodsWithDifferentJvmName.getJvmName
|
// From BuiltinMethodsWithDifferentJvmName.isBuiltinFunctionWithDifferentNameInJvm, BuiltinMethodsWithDifferentJvmName.getJvmName
|
||||||
private fun IrSimpleFunction.getDifferentNameForJvmBuiltinFunction(): String? {
|
private fun IrSimpleFunction.getDifferentNameForJvmBuiltinFunction(): String? {
|
||||||
if (name !in BuiltinMethodsWithDifferentJvmName.ORIGINAL_SHORT_NAMES) return null
|
if (name !in SpecialGenericSignatures.ORIGINAL_SHORT_NAMES) return null
|
||||||
if (!isBuiltIn) return null
|
if (!isBuiltIn) return null
|
||||||
return allOverridden(includeSelf = true)
|
return allOverridden(includeSelf = true)
|
||||||
.filter { it.isBuiltIn }
|
.filter { it.isBuiltIn }
|
||||||
.mapNotNull {
|
.mapNotNull {
|
||||||
val signature = it.computeJvmSignature()
|
val signature = it.computeJvmSignature()
|
||||||
BuiltinMethodsWithDifferentJvmName.SIGNATURE_TO_JVM_REPRESENTATION_NAME[signature]?.asString()
|
SpecialGenericSignatures.SIGNATURE_TO_JVM_REPRESENTATION_NAME[signature]?.asString()
|
||||||
}
|
}
|
||||||
.firstOrNull()
|
.firstOrNull()
|
||||||
}
|
}
|
||||||
|
|||||||
+136
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.load.java
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.signatures
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||||
|
|
||||||
|
|
||||||
|
open class SpecialGenericSignatures {
|
||||||
|
enum class TypeSafeBarrierDescription(val defaultValue: Any?) {
|
||||||
|
NULL(null), INDEX(-1), FALSE(false),
|
||||||
|
|
||||||
|
MAP_GET_OR_DEFAULT(null) {
|
||||||
|
override fun checkParameter(index: Int) = index != 1
|
||||||
|
};
|
||||||
|
|
||||||
|
open fun checkParameter(index: Int) = true
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class SpecialSignatureInfo(val valueParametersSignature: String?, val isObjectReplacedWithTypeParameter: Boolean) {
|
||||||
|
ONE_COLLECTION_PARAMETER("Ljava/util/Collection<+Ljava/lang/Object;>;", false),
|
||||||
|
OBJECT_PARAMETER_NON_GENERIC(null, true),
|
||||||
|
OBJECT_PARAMETER_GENERIC("Ljava/lang/Object;", true)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun getSpecialSignatureInfo(builtinSignature: String): SpecialSignatureInfo {
|
||||||
|
if (builtinSignature in ERASED_COLLECTION_PARAMETER_SIGNATURES) return SpecialSignatureInfo.ONE_COLLECTION_PARAMETER
|
||||||
|
|
||||||
|
val defaultValue = SIGNATURE_TO_DEFAULT_VALUES_MAP.getValue(builtinSignature)
|
||||||
|
|
||||||
|
return if (defaultValue == TypeSafeBarrierDescription.NULL) {
|
||||||
|
// return type is some generic type as 'Map.get'
|
||||||
|
SpecialSignatureInfo.OBJECT_PARAMETER_GENERIC
|
||||||
|
} else
|
||||||
|
SpecialSignatureInfo.OBJECT_PARAMETER_NON_GENERIC
|
||||||
|
}
|
||||||
|
|
||||||
|
data class NameAndSignature internal constructor(val name: Name, val signature: String)
|
||||||
|
|
||||||
|
private fun String.method(name: String, parameters: String, returnType: String) =
|
||||||
|
NameAndSignature(
|
||||||
|
Name.identifier(name),
|
||||||
|
SignatureBuildingComponents.signature(this@method, "$name($parameters)$returnType")
|
||||||
|
)
|
||||||
|
|
||||||
|
private val ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES = setOf(
|
||||||
|
"containsAll", "removeAll", "retainAll"
|
||||||
|
).map { "java/util/Collection".method(it, "Ljava/util/Collection;", JvmPrimitiveType.BOOLEAN.desc) }
|
||||||
|
|
||||||
|
val ERASED_COLLECTION_PARAMETER_SIGNATURES = ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES.map { it.signature }
|
||||||
|
val ERASED_COLLECTION_PARAMETER_NAMES = ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES.map { it.name.asString() }
|
||||||
|
|
||||||
|
private val GENERIC_PARAMETERS_METHODS_TO_DEFAULT_VALUES_MAP =
|
||||||
|
signatures {
|
||||||
|
mapOf(
|
||||||
|
javaUtil("Collection")
|
||||||
|
.method("contains", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
||||||
|
javaUtil("Collection")
|
||||||
|
.method("remove", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
||||||
|
|
||||||
|
javaUtil("Map")
|
||||||
|
.method("containsKey", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
||||||
|
javaUtil("Map")
|
||||||
|
.method("containsValue", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
||||||
|
javaUtil("Map")
|
||||||
|
.method(
|
||||||
|
"remove", "Ljava/lang/Object;Ljava/lang/Object;",
|
||||||
|
JvmPrimitiveType.BOOLEAN.desc
|
||||||
|
) to TypeSafeBarrierDescription.FALSE,
|
||||||
|
|
||||||
|
javaUtil("Map")
|
||||||
|
.method(
|
||||||
|
"getOrDefault", "Ljava/lang/Object;Ljava/lang/Object;",
|
||||||
|
"Ljava/lang/Object;"
|
||||||
|
) to TypeSafeBarrierDescription.MAP_GET_OR_DEFAULT,
|
||||||
|
|
||||||
|
javaUtil("Map")
|
||||||
|
.method("get", "Ljava/lang/Object;", "Ljava/lang/Object;") to TypeSafeBarrierDescription.NULL,
|
||||||
|
javaUtil("Map")
|
||||||
|
.method("remove", "Ljava/lang/Object;", "Ljava/lang/Object;") to TypeSafeBarrierDescription.NULL,
|
||||||
|
|
||||||
|
javaUtil("List")
|
||||||
|
.method("indexOf", "Ljava/lang/Object;", JvmPrimitiveType.INT.desc) to TypeSafeBarrierDescription.INDEX,
|
||||||
|
javaUtil("List")
|
||||||
|
.method("lastIndexOf", "Ljava/lang/Object;", JvmPrimitiveType.INT.desc) to TypeSafeBarrierDescription.INDEX
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val SIGNATURE_TO_DEFAULT_VALUES_MAP = GENERIC_PARAMETERS_METHODS_TO_DEFAULT_VALUES_MAP.mapKeys { it.key.signature }
|
||||||
|
val ERASED_VALUE_PARAMETERS_SHORT_NAMES: Set<Name>
|
||||||
|
val ERASED_VALUE_PARAMETERS_SIGNATURES: Set<String>
|
||||||
|
|
||||||
|
init {
|
||||||
|
val allMethods = GENERIC_PARAMETERS_METHODS_TO_DEFAULT_VALUES_MAP.keys + ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES
|
||||||
|
ERASED_VALUE_PARAMETERS_SHORT_NAMES = allMethods.map { it.name }.toSet()
|
||||||
|
ERASED_VALUE_PARAMETERS_SIGNATURES = allMethods.map { it.signature }.toSet()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that signatures here are not real,
|
||||||
|
// e.g. 'java/lang/CharSequence.get(I)C' does not actually exist in JDK
|
||||||
|
// But it doesn't matter here, because signatures are only used to distinguish overloaded built-in definitions
|
||||||
|
val REMOVE_AT_NAME_AND_SIGNATURE =
|
||||||
|
"java/util/List".method("removeAt", JvmPrimitiveType.INT.desc, "Ljava/lang/Object;")
|
||||||
|
|
||||||
|
private val NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP: Map<NameAndSignature, Name> = signatures {
|
||||||
|
mapOf(
|
||||||
|
javaLang("Number").method("toByte", "", JvmPrimitiveType.BYTE.desc) to Name.identifier("byteValue"),
|
||||||
|
javaLang("Number").method("toShort", "", JvmPrimitiveType.SHORT.desc) to Name.identifier("shortValue"),
|
||||||
|
javaLang("Number").method("toInt", "", JvmPrimitiveType.INT.desc) to Name.identifier("intValue"),
|
||||||
|
javaLang("Number").method("toLong", "", JvmPrimitiveType.LONG.desc) to Name.identifier("longValue"),
|
||||||
|
javaLang("Number").method("toFloat", "", JvmPrimitiveType.FLOAT.desc) to Name.identifier("floatValue"),
|
||||||
|
javaLang("Number").method("toDouble", "", JvmPrimitiveType.DOUBLE.desc) to Name.identifier("doubleValue"),
|
||||||
|
REMOVE_AT_NAME_AND_SIGNATURE to Name.identifier("remove"),
|
||||||
|
javaLang("CharSequence")
|
||||||
|
.method("get", JvmPrimitiveType.INT.desc, JvmPrimitiveType.CHAR.desc) to Name.identifier("charAt")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val SIGNATURE_TO_JVM_REPRESENTATION_NAME: Map<String, Name> =
|
||||||
|
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.mapKeys { it.key.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, List<Name>> =
|
||||||
|
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.entries
|
||||||
|
.map { Pair(it.key.name, it.value) }
|
||||||
|
.groupBy({ it.second }, { it.first })
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,88 +24,14 @@ import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.
|
|||||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.sameAsBuiltinMethodWithErasedValueParameters
|
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.sameAsBuiltinMethodWithErasedValueParameters
|
||||||
import org.jetbrains.kotlin.load.java.ClassicBuiltinSpecialProperties.getBuiltinSpecialPropertyGetterName
|
import org.jetbrains.kotlin.load.java.ClassicBuiltinSpecialProperties.getBuiltinSpecialPropertyGetterName
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||||
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.computeJvmSignature
|
import org.jetbrains.kotlin.load.kotlin.computeJvmSignature
|
||||||
import org.jetbrains.kotlin.load.kotlin.signatures
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.firstOverridden
|
import org.jetbrains.kotlin.resolve.descriptorUtil.firstOverridden
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
|
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
|
||||||
import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure
|
import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure
|
||||||
|
|
||||||
private data class NameAndSignature(val name: Name, val signature: String)
|
object BuiltinMethodsWithSpecialGenericSignature : SpecialGenericSignatures() {
|
||||||
|
|
||||||
private fun String.method(name: String, parameters: String, returnType: String) =
|
|
||||||
NameAndSignature(
|
|
||||||
Name.identifier(name),
|
|
||||||
SignatureBuildingComponents.signature(this@method, "$name($parameters)$returnType")
|
|
||||||
)
|
|
||||||
|
|
||||||
object BuiltinMethodsWithSpecialGenericSignature {
|
|
||||||
private val ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES = setOf(
|
|
||||||
"containsAll", "removeAll", "retainAll"
|
|
||||||
).map { "java/util/Collection".method(it, "Ljava/util/Collection;", JvmPrimitiveType.BOOLEAN.desc) }
|
|
||||||
|
|
||||||
private val ERASED_COLLECTION_PARAMETER_SIGNATURES = ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES.map { it.signature }
|
|
||||||
val ERASED_COLLECTION_PARAMETER_NAMES = ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES.map { it.name.asString() }
|
|
||||||
|
|
||||||
enum class TypeSafeBarrierDescription(val defaultValue: Any?) {
|
|
||||||
NULL(null), INDEX(-1), FALSE(false),
|
|
||||||
|
|
||||||
MAP_GET_OR_DEFAULT(null) {
|
|
||||||
override fun checkParameter(index: Int) = index != 1
|
|
||||||
};
|
|
||||||
|
|
||||||
open fun checkParameter(index: Int) = true
|
|
||||||
}
|
|
||||||
|
|
||||||
private val GENERIC_PARAMETERS_METHODS_TO_DEFAULT_VALUES_MAP =
|
|
||||||
signatures {
|
|
||||||
mapOf(
|
|
||||||
javaUtil("Collection")
|
|
||||||
.method("contains", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
|
||||||
javaUtil("Collection")
|
|
||||||
.method("remove", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
|
||||||
|
|
||||||
javaUtil("Map")
|
|
||||||
.method("containsKey", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
|
||||||
javaUtil("Map")
|
|
||||||
.method("containsValue", "Ljava/lang/Object;", JvmPrimitiveType.BOOLEAN.desc) to TypeSafeBarrierDescription.FALSE,
|
|
||||||
javaUtil("Map")
|
|
||||||
.method(
|
|
||||||
"remove", "Ljava/lang/Object;Ljava/lang/Object;",
|
|
||||||
JvmPrimitiveType.BOOLEAN.desc
|
|
||||||
) to TypeSafeBarrierDescription.FALSE,
|
|
||||||
|
|
||||||
javaUtil("Map")
|
|
||||||
.method(
|
|
||||||
"getOrDefault", "Ljava/lang/Object;Ljava/lang/Object;",
|
|
||||||
"Ljava/lang/Object;"
|
|
||||||
) to TypeSafeBarrierDescription.MAP_GET_OR_DEFAULT,
|
|
||||||
|
|
||||||
javaUtil("Map")
|
|
||||||
.method("get", "Ljava/lang/Object;", "Ljava/lang/Object;") to TypeSafeBarrierDescription.NULL,
|
|
||||||
javaUtil("Map")
|
|
||||||
.method("remove", "Ljava/lang/Object;", "Ljava/lang/Object;") to TypeSafeBarrierDescription.NULL,
|
|
||||||
|
|
||||||
javaUtil("List")
|
|
||||||
.method("indexOf", "Ljava/lang/Object;", JvmPrimitiveType.INT.desc) to TypeSafeBarrierDescription.INDEX,
|
|
||||||
javaUtil("List")
|
|
||||||
.method("lastIndexOf", "Ljava/lang/Object;", JvmPrimitiveType.INT.desc) to TypeSafeBarrierDescription.INDEX
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private val SIGNATURE_TO_DEFAULT_VALUES_MAP = GENERIC_PARAMETERS_METHODS_TO_DEFAULT_VALUES_MAP.mapKeys { it.key.signature }
|
|
||||||
private val ERASED_VALUE_PARAMETERS_SHORT_NAMES: Set<Name>
|
|
||||||
val ERASED_VALUE_PARAMETERS_SIGNATURES: Set<String>
|
|
||||||
|
|
||||||
init {
|
|
||||||
val allMethods = GENERIC_PARAMETERS_METHODS_TO_DEFAULT_VALUES_MAP.keys + ERASED_COLLECTION_PARAMETER_NAME_AND_SIGNATURES
|
|
||||||
ERASED_VALUE_PARAMETERS_SHORT_NAMES = allMethods.map { it.name }.toSet()
|
|
||||||
ERASED_VALUE_PARAMETERS_SIGNATURES = allMethods.map { it.signature }.toSet()
|
|
||||||
}
|
|
||||||
|
|
||||||
private val CallableMemberDescriptor.hasErasedValueParametersInJava: Boolean
|
private val CallableMemberDescriptor.hasErasedValueParametersInJava: Boolean
|
||||||
get() = computeJvmSignature() in ERASED_VALUE_PARAMETERS_SIGNATURES
|
get() = computeJvmSignature() in ERASED_VALUE_PARAMETERS_SIGNATURES
|
||||||
|
|
||||||
@@ -128,12 +54,6 @@ object BuiltinMethodsWithSpecialGenericSignature {
|
|||||||
val Name.sameAsBuiltinMethodWithErasedValueParameters: Boolean
|
val Name.sameAsBuiltinMethodWithErasedValueParameters: Boolean
|
||||||
get() = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES
|
get() = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES
|
||||||
|
|
||||||
enum class SpecialSignatureInfo(val valueParametersSignature: String?, val isObjectReplacedWithTypeParameter: Boolean) {
|
|
||||||
ONE_COLLECTION_PARAMETER("Ljava/util/Collection<+Ljava/lang/Object;>;", false),
|
|
||||||
OBJECT_PARAMETER_NON_GENERIC(null, true),
|
|
||||||
OBJECT_PARAMETER_GENERIC("Ljava/lang/Object;", true)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun CallableMemberDescriptor.isBuiltinWithSpecialDescriptorInJvm(): Boolean {
|
fun CallableMemberDescriptor.isBuiltinWithSpecialDescriptorInJvm(): Boolean {
|
||||||
if (!KotlinBuiltIns.isBuiltIn(this)) return false
|
if (!KotlinBuiltIns.isBuiltIn(this)) return false
|
||||||
return getSpecialSignatureInfo()?.isObjectReplacedWithTypeParameter ?: false || doesOverrideBuiltinWithDifferentJvmName()
|
return getSpecialSignatureInfo()?.isObjectReplacedWithTypeParameter ?: false || doesOverrideBuiltinWithDifferentJvmName()
|
||||||
@@ -146,49 +66,11 @@ object BuiltinMethodsWithSpecialGenericSignature {
|
|||||||
val builtinSignature = firstOverridden { it is FunctionDescriptor && it.hasErasedValueParametersInJava }?.computeJvmSignature()
|
val builtinSignature = firstOverridden { it is FunctionDescriptor && it.hasErasedValueParametersInJava }?.computeJvmSignature()
|
||||||
?: return null
|
?: return null
|
||||||
|
|
||||||
if (builtinSignature in ERASED_COLLECTION_PARAMETER_SIGNATURES) return SpecialSignatureInfo.ONE_COLLECTION_PARAMETER
|
return getSpecialSignatureInfo(builtinSignature)
|
||||||
|
|
||||||
val defaultValue = SIGNATURE_TO_DEFAULT_VALUES_MAP.getValue(builtinSignature)
|
|
||||||
|
|
||||||
return if (defaultValue == TypeSafeBarrierDescription.NULL) {
|
|
||||||
// return type is some generic type as 'Map.get'
|
|
||||||
SpecialSignatureInfo.OBJECT_PARAMETER_GENERIC
|
|
||||||
} else
|
|
||||||
SpecialSignatureInfo.OBJECT_PARAMETER_NON_GENERIC
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object BuiltinMethodsWithDifferentJvmName {
|
object BuiltinMethodsWithDifferentJvmName : SpecialGenericSignatures() {
|
||||||
// Note that signatures here are not real,
|
|
||||||
// e.g. 'java/lang/CharSequence.get(I)C' does not actually exist in JDK
|
|
||||||
// But it doesn't matter here, because signatures are only used to distinguish overloaded built-in definitions
|
|
||||||
private val REMOVE_AT_NAME_AND_SIGNATURE =
|
|
||||||
"java/util/List".method("removeAt", JvmPrimitiveType.INT.desc, "Ljava/lang/Object;")
|
|
||||||
|
|
||||||
private val NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP: Map<NameAndSignature, Name> = signatures {
|
|
||||||
mapOf(
|
|
||||||
javaLang("Number").method("toByte", "", JvmPrimitiveType.BYTE.desc) to Name.identifier("byteValue"),
|
|
||||||
javaLang("Number").method("toShort", "", JvmPrimitiveType.SHORT.desc) to Name.identifier("shortValue"),
|
|
||||||
javaLang("Number").method("toInt", "", JvmPrimitiveType.INT.desc) to Name.identifier("intValue"),
|
|
||||||
javaLang("Number").method("toLong", "", JvmPrimitiveType.LONG.desc) to Name.identifier("longValue"),
|
|
||||||
javaLang("Number").method("toFloat", "", JvmPrimitiveType.FLOAT.desc) to Name.identifier("floatValue"),
|
|
||||||
javaLang("Number").method("toDouble", "", JvmPrimitiveType.DOUBLE.desc) to Name.identifier("doubleValue"),
|
|
||||||
REMOVE_AT_NAME_AND_SIGNATURE to Name.identifier("remove"),
|
|
||||||
javaLang("CharSequence")
|
|
||||||
.method("get", JvmPrimitiveType.INT.desc, JvmPrimitiveType.CHAR.desc) to Name.identifier("charAt")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val SIGNATURE_TO_JVM_REPRESENTATION_NAME: Map<String, Name> =
|
|
||||||
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.mapKeys { it.key.signature }
|
|
||||||
|
|
||||||
val ORIGINAL_SHORT_NAMES: List<Name> = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.keys.map { it.name }
|
|
||||||
|
|
||||||
private val JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP: Map<Name, List<Name>> =
|
|
||||||
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.entries
|
|
||||||
.map { Pair(it.key.name, it.value) }
|
|
||||||
.groupBy({ it.second }, { it.first })
|
|
||||||
|
|
||||||
val Name.sameAsRenamedInJvmBuiltin: Boolean
|
val Name.sameAsRenamedInJvmBuiltin: Boolean
|
||||||
get() = this in ORIGINAL_SHORT_NAMES
|
get() = this in ORIGINAL_SHORT_NAMES
|
||||||
|
|
||||||
@@ -212,7 +94,7 @@ object BuiltinMethodsWithDifferentJvmName {
|
|||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun <T : CallableMemberDescriptor> T.getOverriddenBuiltinWithDifferentJvmName(): T? {
|
fun <T : CallableMemberDescriptor> T.getOverriddenBuiltinWithDifferentJvmName(): T? {
|
||||||
if (name !in BuiltinMethodsWithDifferentJvmName.ORIGINAL_SHORT_NAMES
|
if (name !in SpecialGenericSignatures.ORIGINAL_SHORT_NAMES
|
||||||
&& propertyIfAccessor.name !in BuiltinSpecialProperties.SPECIAL_SHORT_NAMES
|
&& propertyIfAccessor.name !in BuiltinSpecialProperties.SPECIAL_SHORT_NAMES
|
||||||
) return null
|
) return null
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -35,9 +35,9 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
|||||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
|
|
||||||
import org.jetbrains.kotlin.load.java.BuiltinSpecialProperties
|
import org.jetbrains.kotlin.load.java.BuiltinSpecialProperties
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
|
import org.jetbrains.kotlin.load.java.SpecialGenericSignatures
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.UserDataProperty
|
import org.jetbrains.kotlin.psi.UserDataProperty
|
||||||
@@ -51,7 +51,7 @@ private val mutableQualifiedNamesToJavaClass = JavaToKotlinClassMap.mutabilityMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val membersWithSpecializedSignature: Set<String> =
|
private val membersWithSpecializedSignature: Set<String> =
|
||||||
BuiltinMethodsWithSpecialGenericSignature.ERASED_VALUE_PARAMETERS_SIGNATURES.mapTo(LinkedHashSet()) {
|
SpecialGenericSignatures.ERASED_VALUE_PARAMETERS_SIGNATURES.mapTo(LinkedHashSet()) {
|
||||||
val fqNameString = it.substringBefore('(').replace('/', '.')
|
val fqNameString = it.substringBefore('(').replace('/', '.')
|
||||||
FqName(fqNameString).shortName().asString()
|
FqName(fqNameString).shortName().asString()
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ class KtLightMutabilityPlatformWrapper(
|
|||||||
return listOf(finalBridgeWithObject, abstractKotlinVariantWithGeneric)
|
return listOf(finalBridgeWithObject, abstractKotlinVariantWithGeneric)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (methodName in BuiltinMethodsWithSpecialGenericSignature.ERASED_COLLECTION_PARAMETER_NAMES) {
|
if (methodName in SpecialGenericSignatures.ERASED_COLLECTION_PARAMETER_NAMES) {
|
||||||
return emptyList()
|
return emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user