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() {
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
val whiteListSignatures = signatures.whiteListSignaturesByName[name]
val visibleMethods = signatures.visibleMethodSignaturesByName[name]
?: return declaredMemberScope.processFunctionsByName(name, processor)
javaMappedClassUseSiteScope.processFunctionsByName(name) { symbol ->
val jvmSignature = symbol.fir.computeJvmDescriptor()
.replace("kotlin/Any", "java/lang/Object")
.replace("kotlin/String", "java/lang/String")
.replace("kotlin/Throwable", "java/lang/Throwable")
if (jvmSignature in whiteListSignatures) {
if (jvmSignature in visibleMethods) {
processor(symbol)
}
}
@@ -40,14 +40,14 @@ class JvmMappedScope(
) = ProcessorAction.NONE
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
val constructorBlackList = signatures.constructorBlackList
if (constructorBlackList.isNotEmpty()) {
val hiddenConstructors = signatures.hiddenConstructors
if (hiddenConstructors.isNotEmpty()) {
javaMappedClassUseSiteScope.processDeclaredConstructors { symbol ->
val jvmSignature = symbol.fir.computeJvmDescriptor()
.replace("kotlin/Any", "java/lang/Object")
.replace("kotlin/String", "java/lang/String")
.replace("kotlin/Throwable", "java/lang/Throwable")
if (jvmSignature !in constructorBlackList) {
if (jvmSignature !in hiddenConstructors) {
processor(symbol)
}
}
@@ -80,14 +80,14 @@ class JvmMappedScope(
}
companion object {
data class Signatures(val whiteListSignaturesByName: Map<Name, Set<String>>, val constructorBlackList: Set<String>) {
fun isEmpty() = whiteListSignaturesByName.isEmpty() && constructorBlackList.isEmpty()
data class Signatures(val visibleMethodSignaturesByName: Map<Name, Set<String>>, val hiddenConstructors: Set<String>) {
fun isEmpty() = visibleMethodSignaturesByName.isEmpty() && hiddenConstructors.isEmpty()
fun isNotEmpty() = !isEmpty()
}
// NOTE: No-arg constructors
@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
listOf(
"",
@@ -113,22 +113,22 @@ class JvmMappedScope(
fun prepareSignatures(klass: FirRegularClass): Signatures {
val signaturePrefix = klass.symbol.classId.toString()
val whiteListSignaturesByName = mutableMapOf<Name, MutableSet<String>>()
JvmBuiltInsSignatures.WHITE_LIST_METHOD_SIGNATURES.filter { signature ->
val visibleMethodsByName = mutableMapOf<Name, MutableSet<String>>()
JvmBuiltInsSignatures.VISIBLE_METHOD_SIGNATURES.filter { signature ->
signature.startsWith(signaturePrefix)
}.map { signature ->
// +1 to delete dot before function name
signature.substring(signaturePrefix.length + 1)
}.forEach {
whiteListSignaturesByName.getOrPut(Name.identifier(it.substringBefore("("))) { mutableSetOf() }.add(it)
visibleMethodsByName.getOrPut(Name.identifier(it.substringBefore("("))) { mutableSetOf() }.add(it)
}
val constructorBlackList =
(JvmBuiltInsSignatures.BLACK_LIST_CONSTRUCTOR_SIGNATURES + additionalConstructorBlackList)
val hiddenConstructors =
(JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES + additionalHiddenConstructors)
.filter { it.startsWith(signaturePrefix) }
.mapTo(mutableSetOf()) { it.substring(signaturePrefix.length + 1) }
return Signatures(whiteListSignaturesByName, constructorBlackList)
return Signatures(visibleMethodsByName, hiddenConstructors)
}
}
}
@@ -38,22 +38,21 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
fun testAllListedSignaturesExistInJdk() {
val module = JvmResolveUtil.analyze(environment).moduleDescriptor as ModuleDescriptorImpl
val blackList =
JvmBuiltInsSignatures.BLACK_LIST_METHOD_SIGNATURES +
JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES +
JvmBuiltInsSignatures.BLACK_LIST_CONSTRUCTOR_SIGNATURES +
JvmBuiltInsSignatures.WHITE_LIST_METHOD_SIGNATURES +
JvmBuiltInsSignatures.WHITE_LIST_CONSTRUCTOR_SIGNATURES
val hiddenSignatures =
JvmBuiltInsSignatures.HIDDEN_METHOD_SIGNATURES +
JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES +
JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES +
JvmBuiltInsSignatures.VISIBLE_METHOD_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 {
it ->
groupedByInternalName.entries.forEach { it ->
val (internalName, jvmDescriptors) = it
val classDescriptor =
module.resolveClassByFqName(
JvmClassName.byInternalName(internalName).fqNameForClassNameWithoutDollars, NoLookupLocation.FROM_TEST
)!!
module.resolveClassByFqName(
JvmClassName.byInternalName(internalName).fqNameForClassNameWithoutDollars, NoLookupLocation.FROM_TEST
)!!
val scope = classDescriptor.unsubstitutedMemberScope
@@ -64,10 +63,10 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
val stringName = jvmDescriptor.split("(")[0]
val functions =
if (stringName == "<init>")
classDescriptor.constructors
else
scope.getContributedFunctions(Name.identifier(stringName), NoLookupLocation.FROM_TEST)
if (stringName == "<init>")
classDescriptor.constructors
else
scope.getContributedFunctions(Name.identifier(stringName), NoLookupLocation.FROM_TEST)
functions.singleOrNull {
it.isEffectivelyPublicApi && it.computeJvmDescriptor() == jvmDescriptor