Use correct naming for additional built-in member lists

This commit is contained in:
Denis Zharkov
2020-10-05 14:20:23 +03:00
parent 98088f739d
commit 90044f9672
4 changed files with 46 additions and 47 deletions
@@ -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)
} }
} }
} }
@@ -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
@@ -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)
} }