Refactor bridges generation for JVM

Make a separate subclass for DescriptorBasedFunctionHandle
to allow customize the behavior without complex abstract concepts
like `areDeclarationAndDefinitionSame`
This commit is contained in:
Denis Zharkov
2018-12-20 08:37:04 +03:00
parent 5cc242e878
commit 949214c10b
6 changed files with 85 additions and 70 deletions
@@ -28,7 +28,10 @@ import org.jetbrains.kotlin.js.translate.utils.*
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.prototypeOf
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.*
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.source.getPsi
import org.jetbrains.kotlin.utils.identity
@@ -241,10 +244,7 @@ class ClassModelGenerator(val context: TranslationContext) {
private fun generateOtherBridges(descriptor: ClassDescriptor, model: JsClassModel) {
for (memberDescriptor in descriptor.defaultType.memberScope.getContributedDescriptors()) {
if (memberDescriptor is FunctionDescriptor) {
val bridgesToGenerate = generateBridgesForFunctionDescriptor(memberDescriptor, identity()) {
//There is no DefaultImpls in js backend so if method non-abstract it should be recognized as non-abstract on bridges calculation
true
}
val bridgesToGenerate = generateBridgesForFunctionDescriptor(memberDescriptor, identity())
for (bridge in bridgesToGenerate) {
generateBridge(descriptor, model, bridge)
@@ -304,4 +304,4 @@ class ClassModelGenerator(val context: TranslationContext) {
block.statements += defineProperty.makeStmt()
}
}
}