[IR] Refactored Kotlin Mangler API
- Implement abstract Ir-based, Descriptor-based mangler computers and export checkers and corresponding platform specializations - Add runtime verifier which check whether all types of mangler produces the same type of data Note: code migration is not finished yet
This commit is contained in:
+68
-7
@@ -5,13 +5,74 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.backend.jvm.serialization
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.serialization.KotlinManglerImpl
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.util.isInlined
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.KotlinExportChecker
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.KotlinMangleComputer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.classic.ClassicExportChecker
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.classic.ClassicKotlinManglerImpl
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.classic.ClassicMangleComputer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.DescriptorBasedKotlinManglerImpl
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.DescriptorExportCheckerVisitor
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.DescriptorMangleComputer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrBasedKotlinManglerImpl
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrExportCheckerVisitor
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrMangleComputer
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.idea.MainFunctionDetector
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField
|
||||
|
||||
// Copied from JsMangler for now
|
||||
object JvmMangler : KotlinManglerImpl() {
|
||||
abstract class AbstractJvmManglerIr : IrBasedKotlinManglerImpl() {
|
||||
|
||||
override val IrType.isInlined: Boolean
|
||||
get() = this.isInlined()
|
||||
companion object {
|
||||
private val exportChecker = JvmIrExportChecker()
|
||||
}
|
||||
|
||||
private class JvmIrExportChecker : IrExportCheckerVisitor() {
|
||||
override fun IrDeclaration.isPlatformSpecificExported() = false
|
||||
}
|
||||
|
||||
private class JvmIrManglerComputer(builder: StringBuilder) : IrMangleComputer(builder) {
|
||||
override fun copy(): IrMangleComputer = JvmIrManglerComputer(builder)
|
||||
}
|
||||
|
||||
override fun getExportChecker(): KotlinExportChecker<IrDeclaration> = exportChecker
|
||||
|
||||
override fun getMangleComputer(prefix: String): KotlinMangleComputer<IrDeclaration> {
|
||||
return JvmIrManglerComputer(StringBuilder(256))
|
||||
}
|
||||
}
|
||||
|
||||
object JvmManglerIr : AbstractJvmManglerIr()
|
||||
|
||||
abstract class AbstractJvmDescriptorMangler(private val mainDetector: MainFunctionDetector?) : DescriptorBasedKotlinManglerImpl() {
|
||||
|
||||
companion object {
|
||||
private val exportChecker = JvmDescriptorExportChecker()
|
||||
}
|
||||
|
||||
private class JvmDescriptorExportChecker : DescriptorExportCheckerVisitor() {
|
||||
override fun DeclarationDescriptor.isPlatformSpecificExported() = false
|
||||
}
|
||||
|
||||
private class JvmDescriptorManglerComputer(builder: StringBuilder, prefix: String, private val mainDetector: MainFunctionDetector?) :
|
||||
DescriptorMangleComputer(builder, prefix) {
|
||||
override fun copy(): DescriptorMangleComputer = JvmDescriptorManglerComputer(builder, specialPrefix, mainDetector)
|
||||
|
||||
private fun isMainFunction(descriptor: FunctionDescriptor): Boolean = mainDetector?.isMain(descriptor) ?: false
|
||||
|
||||
override fun FunctionDescriptor.platformSpecificSuffix(): String? {
|
||||
return if (isMainFunction(this)) {
|
||||
return source.containingFile.name
|
||||
} else null
|
||||
}
|
||||
}
|
||||
|
||||
override fun getExportChecker(): KotlinExportChecker<DeclarationDescriptor> = exportChecker
|
||||
|
||||
override fun getMangleComputer(prefix: String): KotlinMangleComputer<DeclarationDescriptor> {
|
||||
return JvmDescriptorManglerComputer(StringBuilder(256), prefix, mainDetector)
|
||||
}
|
||||
}
|
||||
|
||||
class JvmManglerDesc(mainDetector: MainFunctionDetector? = null) : AbstractJvmDescriptorMangler(mainDetector)
|
||||
Reference in New Issue
Block a user