From 173e194dac1742244bdf1c73aae9926ad342652f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 5 May 2021 19:20:03 +0200 Subject: [PATCH] Remove dependency on JVM specifics in serialization.common Move handling of EnhancedNullability to JVM subclasses in serialization.jvm. Looks like this was possible because of accidental dependency of frontend on compiler.common.jvm introduced in 564d382b9d. Also fix a minor typo in the file name typeEnhancementUtils.kt. --- .../ir/serialization.common/build.gradle.kts | 3 --- .../descriptor/DescriptorMangleComputer.kt | 13 +++++-------- .../mangle/ir/IrMangleComputer.kt | 8 +++----- .../backend/jvm/serialization/JvmMangler.kt | 19 +++++++++++++++++++ ...cementUtils.kt => typeEnhancementUtils.kt} | 0 5 files changed, 27 insertions(+), 16 deletions(-) rename core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/{typeEnchancementUtils.kt => typeEnhancementUtils.kt} (100%) diff --git a/compiler/ir/serialization.common/build.gradle.kts b/compiler/ir/serialization.common/build.gradle.kts index e13082d338f..4cf0f6f29db 100644 --- a/compiler/ir/serialization.common/build.gradle.kts +++ b/compiler/ir/serialization.common/build.gradle.kts @@ -12,9 +12,6 @@ dependencies { implementation(project(":compiler:psi")) compileOnly(project(":kotlin-reflect-api")) - // TODO: move usages of JvmAnnotationNames and hasEnhancedNullability to ir.serialization.jvm and remove this dependency. - implementation(project(":core:compiler.common.jvm")) - compileOnly(intellijCoreDep()) { includeJars("intellij-core") } } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt index dfb5323d2f1..9f564b9d8e6 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorMangleComputer.kt @@ -12,9 +12,7 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.collectForMangle import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptor import org.jetbrains.kotlin.ir.descriptors.IrPropertyDelegateDescriptor -import org.jetbrains.kotlin.load.java.typeEnhancement.hasEnhancedNullability import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty @@ -40,7 +38,7 @@ abstract class DescriptorMangleComputer(protected val builder: StringBuilder, pr } } - private fun StringBuilder.appendSignature(s: String) { + protected fun StringBuilder.appendSignature(s: String) { if (mode.signature) { append(s) } @@ -195,10 +193,7 @@ abstract class DescriptorMangleComputer(protected val builder: StringBuilder, pr if (type.isMarkedNullable) tBuilder.appendSignature(MangleConstant.Q_MARK) - // Disambiguate between 'double' and '@NotNull java.lang.Double' types in mixed Java/Kotlin class hierarchies - if (SimpleClassicTypeSystemContext.hasEnhancedNullability(type)) { - tBuilder.appendSignature(MangleConstant.ENHANCED_NULLABILITY_MARK) - } + mangleTypePlatformSpecific(type, tBuilder) } is DynamicType -> tBuilder.appendSignature(MangleConstant.DYNAMIC_MARK) is FlexibleType -> { @@ -215,6 +210,8 @@ abstract class DescriptorMangleComputer(protected val builder: StringBuilder, pr } } + protected open fun mangleTypePlatformSpecific(type: UnwrappedType, tBuilder: StringBuilder) {} + private fun StringBuilder.mangleTypeParameterReference(typeParameter: TypeParameterDescriptor) { val parent = typeParameter.containingDeclaration val ci = typeParameterContainer.indexOf(parent) @@ -315,4 +312,4 @@ abstract class DescriptorMangleComputer(protected val builder: StringBuilder, pr override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor, data: Nothing?) = reportUnexpectedDescriptor(descriptor) -} \ No newline at end of file +} diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt index 9e4feb3485c..1eb159b46d5 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt @@ -14,13 +14,11 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.isVararg import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid -import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty @@ -192,9 +190,7 @@ abstract class IrMangleComputer(protected val builder: StringBuilder, private va if (type.hasQuestionMark) tBuilder.appendSignature(MangleConstant.Q_MARK) - if (type.hasAnnotation(JvmAnnotationNames.ENHANCED_NULLABILITY_ANNOTATION)) { - tBuilder.append(MangleConstant.ENHANCED_NULLABILITY_MARK) - } + mangleTypePlatformSpecific(type, tBuilder) } is IrDynamicType -> tBuilder.appendSignature(MangleConstant.DYNAMIC_MARK) is IrErrorType -> tBuilder.appendSignature(MangleConstant.ERROR_MARK) @@ -202,6 +198,8 @@ abstract class IrMangleComputer(protected val builder: StringBuilder, private va } } + protected open fun mangleTypePlatformSpecific(type: IrType, tBuilder: StringBuilder) {} + override fun visitElement(element: IrElement) = error("unexpected element ${element.render()}") diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt index 4a9d0e83ade..90d409bf5e1 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmMangler.kt @@ -22,9 +22,15 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.isFromJava +import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField +import org.jetbrains.kotlin.load.java.typeEnhancement.hasEnhancedNullability +import org.jetbrains.kotlin.types.UnwrappedType +import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext object JvmIrMangler : IrBasedKotlinManglerImpl() { private class JvmIrExportChecker(compatibleMode: Boolean) : IrExportCheckerVisitor(compatibleMode) { @@ -37,6 +43,12 @@ object JvmIrMangler : IrBasedKotlinManglerImpl() { override fun addReturnTypeSpecialCase(irFunction: IrFunction): Boolean = irFunction.isFromJava() + + override fun mangleTypePlatformSpecific(type: IrType, tBuilder: StringBuilder) { + if (type.hasAnnotation(JvmAnnotationNames.ENHANCED_NULLABILITY_ANNOTATION)) { + tBuilder.append(MangleConstant.ENHANCED_NULLABILITY_MARK) + } + } } override fun getExportChecker(compatibleMode: Boolean): KotlinExportChecker = JvmIrExportChecker(compatibleMode) @@ -78,6 +90,13 @@ class JvmDescriptorMangler(private val mainDetector: MainFunctionDetector?) : De // because there should be `PackageFragmentDescriptor` in between // but on JVM there is `SyntheticJavaPropertyDescriptor` whose parent is a module. So let just skip it. } + + override fun mangleTypePlatformSpecific(type: UnwrappedType, tBuilder: StringBuilder) { + // Disambiguate between 'double' and '@NotNull java.lang.Double' types in mixed Java/Kotlin class hierarchies + if (SimpleClassicTypeSystemContext.hasEnhancedNullability(type)) { + tBuilder.appendSignature(MangleConstant.ENHANCED_NULLABILITY_MARK) + } + } } override fun getExportChecker(compatibleMode: Boolean): KotlinExportChecker = ExportChecker diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnchancementUtils.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnhancementUtils.kt similarity index 100% rename from core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnchancementUtils.kt rename to core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnhancementUtils.kt