Use correct naming for additional built-in member lists
This commit is contained in:
@@ -19,14 +19,14 @@ class JvmMappedScope(
|
|||||||
) : FirTypeScope() {
|
) : FirTypeScope() {
|
||||||
|
|
||||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
|
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
|
||||||
val whiteListSignatures = signatures.whiteListSignaturesByName[name]
|
val visibleMethods = signatures.visibleMethodSignaturesByName[name]
|
||||||
?: return declaredMemberScope.processFunctionsByName(name, processor)
|
?: return declaredMemberScope.processFunctionsByName(name, processor)
|
||||||
javaMappedClassUseSiteScope.processFunctionsByName(name) { symbol ->
|
javaMappedClassUseSiteScope.processFunctionsByName(name) { symbol ->
|
||||||
val jvmSignature = symbol.fir.computeJvmDescriptor()
|
val jvmSignature = symbol.fir.computeJvmDescriptor()
|
||||||
.replace("kotlin/Any", "java/lang/Object")
|
.replace("kotlin/Any", "java/lang/Object")
|
||||||
.replace("kotlin/String", "java/lang/String")
|
.replace("kotlin/String", "java/lang/String")
|
||||||
.replace("kotlin/Throwable", "java/lang/Throwable")
|
.replace("kotlin/Throwable", "java/lang/Throwable")
|
||||||
if (jvmSignature in whiteListSignatures) {
|
if (jvmSignature in visibleMethods) {
|
||||||
processor(symbol)
|
processor(symbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -40,14 +40,14 @@ class JvmMappedScope(
|
|||||||
) = ProcessorAction.NONE
|
) = ProcessorAction.NONE
|
||||||
|
|
||||||
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
|
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
|
||||||
val constructorBlackList = signatures.constructorBlackList
|
val hiddenConstructors = signatures.hiddenConstructors
|
||||||
if (constructorBlackList.isNotEmpty()) {
|
if (hiddenConstructors.isNotEmpty()) {
|
||||||
javaMappedClassUseSiteScope.processDeclaredConstructors { symbol ->
|
javaMappedClassUseSiteScope.processDeclaredConstructors { symbol ->
|
||||||
val jvmSignature = symbol.fir.computeJvmDescriptor()
|
val jvmSignature = symbol.fir.computeJvmDescriptor()
|
||||||
.replace("kotlin/Any", "java/lang/Object")
|
.replace("kotlin/Any", "java/lang/Object")
|
||||||
.replace("kotlin/String", "java/lang/String")
|
.replace("kotlin/String", "java/lang/String")
|
||||||
.replace("kotlin/Throwable", "java/lang/Throwable")
|
.replace("kotlin/Throwable", "java/lang/Throwable")
|
||||||
if (jvmSignature !in constructorBlackList) {
|
if (jvmSignature !in hiddenConstructors) {
|
||||||
processor(symbol)
|
processor(symbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,14 +80,14 @@ class JvmMappedScope(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
data class Signatures(val whiteListSignaturesByName: Map<Name, Set<String>>, val constructorBlackList: Set<String>) {
|
data class Signatures(val visibleMethodSignaturesByName: Map<Name, Set<String>>, val hiddenConstructors: Set<String>) {
|
||||||
fun isEmpty() = whiteListSignaturesByName.isEmpty() && constructorBlackList.isEmpty()
|
fun isEmpty() = visibleMethodSignaturesByName.isEmpty() && hiddenConstructors.isEmpty()
|
||||||
fun isNotEmpty() = !isEmpty()
|
fun isNotEmpty() = !isEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: No-arg constructors
|
// NOTE: No-arg constructors
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
private val additionalConstructorBlackList = buildSet<String> {
|
private val additionalHiddenConstructors = buildSet<String> {
|
||||||
// kotlin.text.String pseudo-constructors should be used instead of java.lang.String constructors
|
// kotlin.text.String pseudo-constructors should be used instead of java.lang.String constructors
|
||||||
listOf(
|
listOf(
|
||||||
"",
|
"",
|
||||||
@@ -113,22 +113,22 @@ class JvmMappedScope(
|
|||||||
fun prepareSignatures(klass: FirRegularClass): Signatures {
|
fun prepareSignatures(klass: FirRegularClass): Signatures {
|
||||||
|
|
||||||
val signaturePrefix = klass.symbol.classId.toString()
|
val signaturePrefix = klass.symbol.classId.toString()
|
||||||
val whiteListSignaturesByName = mutableMapOf<Name, MutableSet<String>>()
|
val visibleMethodsByName = mutableMapOf<Name, MutableSet<String>>()
|
||||||
JvmBuiltInsSignatures.WHITE_LIST_METHOD_SIGNATURES.filter { signature ->
|
JvmBuiltInsSignatures.VISIBLE_METHOD_SIGNATURES.filter { signature ->
|
||||||
signature.startsWith(signaturePrefix)
|
signature.startsWith(signaturePrefix)
|
||||||
}.map { signature ->
|
}.map { signature ->
|
||||||
// +1 to delete dot before function name
|
// +1 to delete dot before function name
|
||||||
signature.substring(signaturePrefix.length + 1)
|
signature.substring(signaturePrefix.length + 1)
|
||||||
}.forEach {
|
}.forEach {
|
||||||
whiteListSignaturesByName.getOrPut(Name.identifier(it.substringBefore("("))) { mutableSetOf() }.add(it)
|
visibleMethodsByName.getOrPut(Name.identifier(it.substringBefore("("))) { mutableSetOf() }.add(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
val constructorBlackList =
|
val hiddenConstructors =
|
||||||
(JvmBuiltInsSignatures.BLACK_LIST_CONSTRUCTOR_SIGNATURES + additionalConstructorBlackList)
|
(JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES + additionalHiddenConstructors)
|
||||||
.filter { it.startsWith(signaturePrefix) }
|
.filter { it.startsWith(signaturePrefix) }
|
||||||
.mapTo(mutableSetOf()) { it.substring(signaturePrefix.length + 1) }
|
.mapTo(mutableSetOf()) { it.substring(signaturePrefix.length + 1) }
|
||||||
|
|
||||||
return Signatures(whiteListSignaturesByName, constructorBlackList)
|
return Signatures(visibleMethodsByName, hiddenConstructors)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-16
@@ -38,22 +38,21 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
|
|||||||
fun testAllListedSignaturesExistInJdk() {
|
fun testAllListedSignaturesExistInJdk() {
|
||||||
val module = JvmResolveUtil.analyze(environment).moduleDescriptor as ModuleDescriptorImpl
|
val module = JvmResolveUtil.analyze(environment).moduleDescriptor as ModuleDescriptorImpl
|
||||||
|
|
||||||
val blackList =
|
val hiddenSignatures =
|
||||||
JvmBuiltInsSignatures.BLACK_LIST_METHOD_SIGNATURES +
|
JvmBuiltInsSignatures.HIDDEN_METHOD_SIGNATURES +
|
||||||
JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES +
|
JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES +
|
||||||
JvmBuiltInsSignatures.BLACK_LIST_CONSTRUCTOR_SIGNATURES +
|
JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES +
|
||||||
JvmBuiltInsSignatures.WHITE_LIST_METHOD_SIGNATURES +
|
JvmBuiltInsSignatures.VISIBLE_METHOD_SIGNATURES +
|
||||||
JvmBuiltInsSignatures.WHITE_LIST_CONSTRUCTOR_SIGNATURES
|
JvmBuiltInsSignatures.VISIBLE_CONSTRUCTOR_SIGNATURES
|
||||||
|
|
||||||
val groupedByInternalName = blackList.groupBy({ it.split(".")[0] }) { it.split(".")[1] }
|
val groupedByInternalName = hiddenSignatures.groupBy({ it.split(".")[0] }) { it.split(".")[1] }
|
||||||
|
|
||||||
groupedByInternalName.entries.forEach {
|
groupedByInternalName.entries.forEach { it ->
|
||||||
it ->
|
|
||||||
val (internalName, jvmDescriptors) = it
|
val (internalName, jvmDescriptors) = it
|
||||||
val classDescriptor =
|
val classDescriptor =
|
||||||
module.resolveClassByFqName(
|
module.resolveClassByFqName(
|
||||||
JvmClassName.byInternalName(internalName).fqNameForClassNameWithoutDollars, NoLookupLocation.FROM_TEST
|
JvmClassName.byInternalName(internalName).fqNameForClassNameWithoutDollars, NoLookupLocation.FROM_TEST
|
||||||
)!!
|
)!!
|
||||||
|
|
||||||
val scope = classDescriptor.unsubstitutedMemberScope
|
val scope = classDescriptor.unsubstitutedMemberScope
|
||||||
|
|
||||||
@@ -64,10 +63,10 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
|
|||||||
|
|
||||||
val stringName = jvmDescriptor.split("(")[0]
|
val stringName = jvmDescriptor.split("(")[0]
|
||||||
val functions =
|
val functions =
|
||||||
if (stringName == "<init>")
|
if (stringName == "<init>")
|
||||||
classDescriptor.constructors
|
classDescriptor.constructors
|
||||||
else
|
else
|
||||||
scope.getContributedFunctions(Name.identifier(stringName), NoLookupLocation.FROM_TEST)
|
scope.getContributedFunctions(Name.identifier(stringName), NoLookupLocation.FROM_TEST)
|
||||||
|
|
||||||
functions.singleOrNull {
|
functions.singleOrNull {
|
||||||
it.isEffectivelyPublicApi && it.computeJvmDescriptor() == jvmDescriptor
|
it.isEffectivelyPublicApi && it.computeJvmDescriptor() == jvmDescriptor
|
||||||
|
|||||||
+4
-4
@@ -20,7 +20,7 @@ object JvmBuiltInsSignatures {
|
|||||||
"toArray()[Ljava/lang/Object;", "toArray([Ljava/lang/Object;)[Ljava/lang/Object;"
|
"toArray()[Ljava/lang/Object;", "toArray([Ljava/lang/Object;)[Ljava/lang/Object;"
|
||||||
) + "java/lang/annotation/Annotation.annotationType()Ljava/lang/Class;"
|
) + "java/lang/annotation/Annotation.annotationType()Ljava/lang/Class;"
|
||||||
|
|
||||||
val BLACK_LIST_METHOD_SIGNATURES: Set<String> =
|
val HIDDEN_METHOD_SIGNATURES: Set<String> =
|
||||||
signatures {
|
signatures {
|
||||||
buildPrimitiveValueMethodsSet() +
|
buildPrimitiveValueMethodsSet() +
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ object JvmBuiltInsSignatures {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val WHITE_LIST_METHOD_SIGNATURES: Set<String> =
|
val VISIBLE_METHOD_SIGNATURES: Set<String> =
|
||||||
signatures {
|
signatures {
|
||||||
inJavaLang(
|
inJavaLang(
|
||||||
"CharSequence",
|
"CharSequence",
|
||||||
@@ -132,7 +132,7 @@ object JvmBuiltInsSignatures {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val BLACK_LIST_CONSTRUCTOR_SIGNATURES: Set<String> =
|
val HIDDEN_CONSTRUCTOR_SIGNATURES: Set<String> =
|
||||||
signatures {
|
signatures {
|
||||||
buildPrimitiveStringConstructorsSet() +
|
buildPrimitiveStringConstructorsSet() +
|
||||||
inJavaLang("Float", *constructors("D")) +
|
inJavaLang("Float", *constructors("D")) +
|
||||||
@@ -149,7 +149,7 @@ object JvmBuiltInsSignatures {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val WHITE_LIST_CONSTRUCTOR_SIGNATURES: Set<String> =
|
val VISIBLE_CONSTRUCTOR_SIGNATURES: Set<String> =
|
||||||
signatures {
|
signatures {
|
||||||
inJavaLang("Throwable", *constructors("Ljava/lang/String;Ljava/lang/Throwable;ZZ"))
|
inJavaLang("Throwable", *constructors("Ljava/lang/String;Ljava/lang/Throwable;ZZ"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,12 @@
|
|||||||
package org.jetbrains.kotlin.builtins.jvm
|
package org.jetbrains.kotlin.builtins.jvm
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.BLACK_LIST_CONSTRUCTOR_SIGNATURES
|
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.BLACK_LIST_METHOD_SIGNATURES
|
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.DROP_LIST_METHOD_SIGNATURES
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.DROP_LIST_METHOD_SIGNATURES
|
||||||
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES
|
||||||
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.HIDDEN_METHOD_SIGNATURES
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.WHITE_LIST_CONSTRUCTOR_SIGNATURES
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.VISIBLE_CONSTRUCTOR_SIGNATURES
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.WHITE_LIST_METHOD_SIGNATURES
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.VISIBLE_METHOD_SIGNATURES
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.isArrayOrPrimitiveArray
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.isArrayOrPrimitiveArray
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.isSerializableInJava
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.isSerializableInJava
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
@@ -136,8 +136,8 @@ open class JvmBuiltInsSettings(
|
|||||||
|
|
||||||
val memberStatus = additionalMember.getJdkMethodStatus()
|
val memberStatus = additionalMember.getJdkMethodStatus()
|
||||||
when (memberStatus) {
|
when (memberStatus) {
|
||||||
JDKMemberStatus.BLACK_LIST -> {
|
JDKMemberStatus.HIDDEN -> {
|
||||||
// Black list methods in final class can't be overridden or called with 'super'
|
// hidden methods in final class can't be overridden or called with 'super'
|
||||||
if (classDescriptor.isFinalClass) return@mapNotNull null
|
if (classDescriptor.isFinalClass) return@mapNotNull null
|
||||||
setHiddenForResolutionEverywhereBesideSupercalls()
|
setHiddenForResolutionEverywhereBesideSupercalls()
|
||||||
}
|
}
|
||||||
@@ -148,7 +148,7 @@ open class JvmBuiltInsSettings(
|
|||||||
|
|
||||||
JDKMemberStatus.DROP -> return@mapNotNull null
|
JDKMemberStatus.DROP -> return@mapNotNull null
|
||||||
|
|
||||||
JDKMemberStatus.WHITE_LIST -> Unit // Do nothing
|
JDKMemberStatus.VISIBLE -> Unit // Do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
}.build()!!
|
}.build()!!
|
||||||
@@ -229,7 +229,7 @@ open class JvmBuiltInsSettings(
|
|||||||
return DFS.dfs<ClassDescriptor, JDKMemberStatus>(
|
return DFS.dfs<ClassDescriptor, JDKMemberStatus>(
|
||||||
listOf(owner),
|
listOf(owner),
|
||||||
{
|
{
|
||||||
// Search through mapped supertypes to determine that Set.toArray is in blacklist, while we have only
|
// Search through mapped supertypes to determine that Set.toArray should be invisible, while we have only
|
||||||
// Collection.toArray there explicitly
|
// Collection.toArray there explicitly
|
||||||
// Note, that we can't find j.u.Collection.toArray within overriddenDescriptors of j.u.Set.toArray
|
// Note, that we can't find j.u.Collection.toArray within overriddenDescriptors of j.u.Set.toArray
|
||||||
it.typeConstructor.supertypes.mapNotNull {
|
it.typeConstructor.supertypes.mapNotNull {
|
||||||
@@ -240,8 +240,8 @@ open class JvmBuiltInsSettings(
|
|||||||
override fun beforeChildren(javaClassDescriptor: ClassDescriptor): Boolean {
|
override fun beforeChildren(javaClassDescriptor: ClassDescriptor): Boolean {
|
||||||
val signature = SignatureBuildingComponents.signature(javaClassDescriptor, jvmDescriptor)
|
val signature = SignatureBuildingComponents.signature(javaClassDescriptor, jvmDescriptor)
|
||||||
when (signature) {
|
when (signature) {
|
||||||
in BLACK_LIST_METHOD_SIGNATURES -> result = JDKMemberStatus.BLACK_LIST
|
in HIDDEN_METHOD_SIGNATURES -> result = JDKMemberStatus.HIDDEN
|
||||||
in WHITE_LIST_METHOD_SIGNATURES -> result = JDKMemberStatus.WHITE_LIST
|
in VISIBLE_METHOD_SIGNATURES -> result = JDKMemberStatus.VISIBLE
|
||||||
in DROP_LIST_METHOD_SIGNATURES -> result = JDKMemberStatus.DROP
|
in DROP_LIST_METHOD_SIGNATURES -> result = JDKMemberStatus.DROP
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,7 +253,7 @@ open class JvmBuiltInsSettings(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private enum class JDKMemberStatus {
|
private enum class JDKMemberStatus {
|
||||||
BLACK_LIST, WHITE_LIST, NOT_CONSIDERED, DROP
|
HIDDEN, VISIBLE, NOT_CONSIDERED, DROP
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ClassDescriptor.getJavaAnalogue(): LazyJavaClassDescriptor? {
|
private fun ClassDescriptor.getJavaAnalogue(): LazyJavaClassDescriptor? {
|
||||||
@@ -293,7 +293,7 @@ open class JvmBuiltInsSettings(
|
|||||||
SignatureBuildingComponents.signature(
|
SignatureBuildingComponents.signature(
|
||||||
javaAnalogueDescriptor,
|
javaAnalogueDescriptor,
|
||||||
javaConstructor.computeJvmDescriptor()
|
javaConstructor.computeJvmDescriptor()
|
||||||
) !in BLACK_LIST_CONSTRUCTOR_SIGNATURES
|
) !in HIDDEN_CONSTRUCTOR_SIGNATURES
|
||||||
}.map { javaConstructor ->
|
}.map { javaConstructor ->
|
||||||
javaConstructor.newCopyBuilder().apply {
|
javaConstructor.newCopyBuilder().apply {
|
||||||
setOwner(classDescriptor)
|
setOwner(classDescriptor)
|
||||||
@@ -302,7 +302,7 @@ open class JvmBuiltInsSettings(
|
|||||||
setSubstitution(substitutor.substitution)
|
setSubstitution(substitutor.substitution)
|
||||||
if (SignatureBuildingComponents.signature(
|
if (SignatureBuildingComponents.signature(
|
||||||
javaAnalogueDescriptor, javaConstructor.computeJvmDescriptor()
|
javaAnalogueDescriptor, javaConstructor.computeJvmDescriptor()
|
||||||
) !in WHITE_LIST_CONSTRUCTOR_SIGNATURES
|
) !in VISIBLE_CONSTRUCTOR_SIGNATURES
|
||||||
) {
|
) {
|
||||||
setAdditionalAnnotations(notConsideredDeprecation)
|
setAdditionalAnnotations(notConsideredDeprecation)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user