[Commonizer] Fix: Skip KNI bridge functions

This commit is contained in:
Dmitriy Dolovov
2019-10-11 13:27:57 +07:00
parent 0a6c132241
commit f4780206d9
4 changed files with 37 additions and 19 deletions
@@ -31,9 +31,9 @@ internal fun mergeClasses(
classes.forEachIndexed { index, clazz -> classes.forEachIndexed { index, clazz ->
clazz?.constructors?.forEach { constructorsMap[ConstructorApproximationKey(it)][index] = it } clazz?.constructors?.forEach { constructorsMap[ConstructorApproximationKey(it)][index] = it }
clazz?.unsubstitutedMemberScope?.collectMembers( clazz?.unsubstitutedMemberScope?.collectMembers(
CallableMemberCollector<PropertyDescriptor> { propertiesMap[PropertyApproximationKey(it)][index] = it }, PropertyCollector { propertiesMap[PropertyApproximationKey(it)][index] = it },
CallableMemberCollector<SimpleFunctionDescriptor> { functionsMap[FunctionApproximationKey(it)][index] = it }, FunctionCollector { functionsMap[FunctionApproximationKey(it)][index] = it },
Collector<ClassDescriptor> { classesMap[it.name][index] = it } ClassCollector { classesMap[it.name][index] = it }
) )
} }
@@ -19,7 +19,7 @@ internal fun MemberScope.collectMembers(vararg collectors: (DeclarationDescripto
} }
@Suppress("FunctionName") @Suppress("FunctionName")
internal inline fun <reified T : DeclarationDescriptor> Collector( private inline fun <reified T : DeclarationDescriptor> Collector(
crossinline typedCollector: (T) -> Unit crossinline typedCollector: (T) -> Unit
): (DeclarationDescriptor) -> Boolean = { candidate -> ): (DeclarationDescriptor) -> Boolean = { candidate ->
if (candidate is T) { if (candidate is T) {
@@ -30,13 +30,31 @@ internal inline fun <reified T : DeclarationDescriptor> Collector(
} }
@Suppress("FunctionName") @Suppress("FunctionName")
internal inline fun <reified T : CallableMemberDescriptor> CallableMemberCollector( internal inline fun ClassCollector(
crossinline typedCollector: (T) -> Unit crossinline typedCollector: (ClassDescriptor) -> Unit
): (DeclarationDescriptor) -> Boolean = Collector<T> { candidate -> ): (DeclarationDescriptor) -> Boolean = Collector(typedCollector)
@Suppress("FunctionName")
internal inline fun TypeAliasCollector(
crossinline typedCollector: (TypeAliasDescriptor) -> Unit
): (DeclarationDescriptor) -> Boolean = Collector(typedCollector)
@Suppress("FunctionName")
internal inline fun PropertyCollector(
crossinline typedCollector: (PropertyDescriptor) -> Unit
): (DeclarationDescriptor) -> Boolean = Collector<PropertyDescriptor> { candidate ->
if (candidate.kind.isReal) // omit fake overrides if (candidate.kind.isReal) // omit fake overrides
typedCollector(candidate) typedCollector(candidate)
} }
@Suppress("FunctionName")
internal inline fun FunctionCollector(
crossinline typedCollector: (SimpleFunctionDescriptor) -> Unit
): (DeclarationDescriptor) -> Boolean = Collector<SimpleFunctionDescriptor> { candidate ->
if (candidate.kind.isReal && !candidate.name.asString().startsWith("kniBridge"))
typedCollector(candidate)
}
/** Used for approximation of [PropertyDescriptor]s before running concrete [Commonizer]s */ /** Used for approximation of [PropertyDescriptor]s before running concrete [Commonizer]s */
internal data class PropertyApproximationKey( internal data class PropertyApproximationKey(
val name: Name, val name: Name,
@@ -34,10 +34,10 @@ internal fun mergePackages(
packageMemberScopes.forEachIndexed { index, memberScope -> packageMemberScopes.forEachIndexed { index, memberScope ->
memberScope?.collectMembers( memberScope?.collectMembers(
CallableMemberCollector<PropertyDescriptor> { propertiesMap[PropertyApproximationKey(it)][index] = it }, PropertyCollector { propertiesMap[PropertyApproximationKey(it)][index] = it },
CallableMemberCollector<SimpleFunctionDescriptor> { functionsMap[FunctionApproximationKey(it)][index] = it }, FunctionCollector { functionsMap[FunctionApproximationKey(it)][index] = it },
Collector<ClassDescriptor> { classesMap[it.name][index] = it }, ClassCollector { classesMap[it.name][index] = it },
Collector<TypeAliasDescriptor> { typeAliasesMap[it.name][index] = it } TypeAliasCollector { typeAliasesMap[it.name][index] = it }
) )
} }
@@ -76,10 +76,10 @@ internal class ComparingDeclarationsVisitor(
val expectedTypeAliases = mutableMapOf<FqName, TypeAliasDescriptor>() val expectedTypeAliases = mutableMapOf<FqName, TypeAliasDescriptor>()
expected.collectMembers( expected.collectMembers(
CallableMemberCollector<PropertyDescriptor> { expectedProperties[PropertyApproximationKey(it)] = it }, PropertyCollector { expectedProperties[PropertyApproximationKey(it)] = it },
CallableMemberCollector<SimpleFunctionDescriptor> { expectedFunctions[FunctionApproximationKey(it)] = it }, FunctionCollector { expectedFunctions[FunctionApproximationKey(it)] = it },
Collector<ClassDescriptor> { expectedClasses[it.fqNameSafe] = it }, ClassCollector { expectedClasses[it.fqNameSafe] = it },
Collector<TypeAliasDescriptor> { expectedTypeAliases[it.fqNameSafe] = it } TypeAliasCollector { expectedTypeAliases[it.fqNameSafe] = it }
) )
val actualProperties = mutableMapOf<PropertyApproximationKey, PropertyDescriptor>() val actualProperties = mutableMapOf<PropertyApproximationKey, PropertyDescriptor>()
@@ -88,10 +88,10 @@ internal class ComparingDeclarationsVisitor(
val actualTypeAliases = mutableMapOf<FqName, TypeAliasDescriptor>() val actualTypeAliases = mutableMapOf<FqName, TypeAliasDescriptor>()
actual.collectMembers( actual.collectMembers(
CallableMemberCollector<PropertyDescriptor> { actualProperties[PropertyApproximationKey(it)] = it }, PropertyCollector { actualProperties[PropertyApproximationKey(it)] = it },
CallableMemberCollector<SimpleFunctionDescriptor> { actualFunctions[FunctionApproximationKey(it)] = it }, FunctionCollector { actualFunctions[FunctionApproximationKey(it)] = it },
Collector<ClassDescriptor> { actualClasses[it.fqNameSafe] = it }, ClassCollector { actualClasses[it.fqNameSafe] = it },
Collector<TypeAliasDescriptor> { actualTypeAliases[it.fqNameSafe] = it } TypeAliasCollector { actualTypeAliases[it.fqNameSafe] = it }
) )
context.assertSetsEqual(expectedProperties.keys, actualProperties.keys, "sets of properties") context.assertSetsEqual(expectedProperties.keys, actualProperties.keys, "sets of properties")