diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 38ef698a847..1cc0a0a19d8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -128,7 +128,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { descriptor, extension, parentCodegen instanceof ImplementationBodyCodegen ? ((ImplementationBodyCodegen) parentCodegen).serializer - : DescriptorSerializer.createTopLevel(extension), + : DescriptorSerializer.createTopLevel(extension, null), state.getProject() ); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 355c028cc6a..6c8581d8f35 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -127,7 +127,7 @@ public class PackagePartCodegen extends MemberCodegen { List members = CodegenUtil.getMemberDescriptorsToGenerate(codegen.element, codegen.bindingContext); JvmSerializerExtension extension = new JvmSerializerExtension(codegen.v.getSerializationBindings(), codegen.state); - DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(extension); + DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(extension, null); ProtoBuf.Package.Builder builder = serializer.packagePartProto(codegen.element.getPackageFqName(), members); extension.serializeJvmPackage(builder, packagePartType); diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt index 1ce733853e9..391303e8523 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt @@ -138,7 +138,7 @@ open class MetadataSerializer( private val extension = createSerializerExtension() fun run() { - val serializer = DescriptorSerializer.createTopLevel(extension) + val serializer = DescriptorSerializer.createTopLevel(extension, project) serializeClasses(classes, serializer, project) serializeMembers(members, serializer) serializeStringTable() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/metadata/DescriptorMetadataSerializer.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/metadata/DescriptorMetadataSerializer.kt index a94b2747fa2..fb0f6ce8659 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/metadata/DescriptorMetadataSerializer.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/metadata/DescriptorMetadataSerializer.kt @@ -40,7 +40,7 @@ class DescriptorMetadataSerializer( is DescriptorMetadataSource.Script -> DescriptorSerializer.create( metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer, context.state.project ) - is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension) + is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension, context.state.project) is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension) else -> null } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt index bd6f387186d..d9e10f1e13b 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt @@ -56,7 +56,7 @@ abstract class KlibMetadataSerializer( ) return SerializerContext( extension, - DescriptorSerializer.createTopLevel(extension) + DescriptorSerializer.createTopLevel(extension, project) ) } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 6bb22bfd09d..299d30339dc 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -35,8 +35,10 @@ import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.descriptorVisibility import org.jetbrains.kotlin.serialization.deserialization.memberKind import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.extensions.TypeAttributeTranslators import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes +import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations import java.util.* class DescriptorSerializer private constructor( @@ -46,7 +48,8 @@ class DescriptorSerializer private constructor( val typeTable: MutableTypeTable, private val versionRequirementTable: MutableVersionRequirementTable?, private val serializeTypeTableToFunction: Boolean, - val plugins: List = emptyList() + val plugins: List = emptyList(), + val typeAttributeTranslators: TypeAttributeTranslators? = null ) { private val contractSerializer = ContractSerializer() @@ -60,7 +63,7 @@ class DescriptorSerializer private constructor( private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer = DescriptorSerializer( descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable, - serializeTypeTableToFunction = false + serializeTypeTableToFunction = false, typeAttributeTranslators = typeAttributeTranslators ) val stringTable: DescriptorAwareStringTable @@ -698,7 +701,11 @@ class DescriptorSerializer private constructor( } } - extension.serializeType(type, builder) + val typeWithUpdatedAnnotations = typeAttributeTranslators?.let { + type.replaceAnnotations(it.toAnnotations(type.attributes)) + } ?: type + + extension.serializeType(typeWithUpdatedAnnotations, builder) return builder } @@ -859,9 +866,10 @@ class DescriptorSerializer private constructor( companion object { @JvmStatic - fun createTopLevel(extension: SerializerExtension): DescriptorSerializer = + fun createTopLevel(extension: SerializerExtension, project: Project? = null): DescriptorSerializer = DescriptorSerializer( - null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), serializeTypeTableToFunction = false + null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), serializeTypeTableToFunction = false, + typeAttributeTranslators = project?.let { TypeAttributeTranslatorExtension.createTranslators(it) } ) @JvmStatic @@ -883,6 +891,7 @@ class DescriptorSerializer private constructor( else createTopLevel(extension) val plugins = project?.let { DescriptorSerializerPlugin.getInstances(it) }.orEmpty() + val typeAttributeTranslators = project?.let { TypeAttributeTranslators(project) } // Calculate type parameter ids for the outer class beforehand, as it would've had happened if we were always // serializing outer classes before nested classes. @@ -895,7 +904,8 @@ class DescriptorSerializer private constructor( if (container is ClassDescriptor && !isVersionRequirementTableWrittenCorrectly(extension.metadataVersion)) parent.versionRequirementTable else MutableVersionRequirementTable(), serializeTypeTableToFunction = false, - plugins + plugins, + typeAttributeTranslators ) for (typeParameter in descriptor.declaredTypeParameters) { serializer.typeParameters.intern(typeParameter) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt index a2bf2f37063..5290fe86547 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt @@ -104,7 +104,7 @@ class CapturedType( } override fun replaceAnnotations(newAnnotations: Annotations): CapturedType = - CapturedType(typeProjection, constructor, isMarkedNullable, newAnnotations.toAttributes()) + CapturedType(typeProjection, constructor, isMarkedNullable, newAnnotations.toDefaultAttributes()) override fun replaceAttributes(newAttributes: TypeAttributes): SimpleType = CapturedType(typeProjection, constructor, isMarkedNullable, newAttributes) diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/KotlinType.kt b/core/descriptors/src/org/jetbrains/kotlin/types/KotlinType.kt index 2649ac08c7d..839eb3c60c8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/KotlinType.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/KotlinType.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.types.model.FlexibleTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.SimpleTypeMarker import org.jetbrains.kotlin.types.model.TypeArgumentListMarker -import org.jetbrains.kotlin.types.typeUtil.builtIns /** * [KotlinType] has only two direct subclasses: [WrappedType] and [UnwrappedType]. @@ -54,7 +53,7 @@ sealed class KotlinType : Annotated, KotlinTypeMarker { abstract val memberScope: MemberScope abstract val attributes: TypeAttributes override val annotations: Annotations - get() = attributes.toAnnotations() + get() = attributes.toDefaultAnnotations() abstract fun unwrap(): UnwrappedType diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeFactory.kt b/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeFactory.kt index b63be59d348..0a2bbcbba4e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeFactory.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeFactory.kt @@ -165,7 +165,7 @@ object KotlinTypeFactory { if (annotations.isEmpty()) it else - SimpleTypeWithAttributes(it, annotations.toAttributes()) + SimpleTypeWithAttributes(it, annotations.toDefaultAttributes()) } @JvmStatic @@ -209,7 +209,7 @@ object KotlinTypeFactory { if (annotations.isEmpty()) it else - SimpleTypeWithAttributes(it, annotations.toAttributes()) + SimpleTypeWithAttributes(it, annotations.toDefaultAttributes()) } @JvmStatic diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeAttributes.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeAttributes.kt index 36fcc2d8b6b..3a91b8788bb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeAttributes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeAttributes.kt @@ -113,12 +113,12 @@ class TypeAttributes private constructor(attributes: List>) : A get() = Companion } -fun TypeAttributes.toAnnotations(): Annotations = +fun TypeAttributes.toDefaultAnnotations(): Annotations = DefaultTypeAttributesTranslator.toAnnotations(this) -fun Annotations.toAttributes(): TypeAttributes = DefaultTypeAttributesTranslator.toAttributes(this) +fun Annotations.toDefaultAttributes(): TypeAttributes = DefaultTypeAttributesTranslator.toAttributes(this) fun TypeAttributes.replaceAnnotations(newAnnotations: Annotations): TypeAttributes { val withoutCustom = (custom?.let { this.remove(it) } ?: this) - return withoutCustom.add(newAnnotations.toAttributes()) + return withoutCustom.add(newAnnotations.toDefaultAttributes()) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewCapturedType.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewCapturedType.kt index afaeab00aa4..afc737a0936 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewCapturedType.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewCapturedType.kt @@ -213,7 +213,7 @@ class NewCapturedType( get() = ErrorUtils.createErrorScope("No member resolution should be done on captured type!", true) override fun replaceAnnotations(newAnnotations: Annotations) = - NewCapturedType(captureStatus, constructor, lowerType, newAnnotations.toAttributes(), isMarkedNullable) + NewCapturedType(captureStatus, constructor, lowerType, newAnnotations.toDefaultAttributes(), isMarkedNullable) override fun replaceAttributes(newAttributes: TypeAttributes): SimpleType = NewCapturedType(captureStatus, constructor, lowerType, newAttributes, isMarkedNullable)