diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index 955d06f6cca..d36ea6dde48 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -157,7 +157,7 @@ inline fun buildFun(builder: IrFunctionBuilder.() -> Unit): IrFunctionImpl = buildFun() } -inline fun IrDeclarationContainer.addFunction(builder: IrFunctionBuilder.() -> Unit): IrSimpleFunction = +inline fun IrDeclarationContainer.addFunction(builder: IrFunctionBuilder.() -> Unit): IrFunctionImpl = buildFun(builder).also { function -> declarations.add(function) function.parent = this@addFunction diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt index df62bb4b32e..0ee2ef31138 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt @@ -35,6 +35,8 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin { object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER") object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS : IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS", isSynthetic = true) + object SYNTHETIC_METHOD_FOR_TYPEALIAS_ANNOTATIONS : + IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_TYPEALIAS_ANNOTATIONS", isSynthetic = true) object GENERATED_PROPERTY_REFERENCE : IrDeclarationOriginImpl("GENERATED_PROPERTY_REFERENCE", isSynthetic = true) object GENERATED_SAM_IMPLEMENTATION : IrDeclarationOriginImpl("GENERATED_SAM_IMPLEMENTATION", isSynthetic = true) object ENUM_MAPPINGS_FOR_WHEN : IrDeclarationOriginImpl("ENUM_MAPPINGS_FOR_WHEN", isSynthetic = true) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 75b24db2d37..75f3cbea682 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -148,6 +148,7 @@ private val returnableBlocksPhase = makeIrFilePhase( @Suppress("Reformat") private val jvmFilePhases = + typeAliasAnnotationMethodsPhase then stripTypeAliasDeclarationsPhase then provisionalFunctionExpressionPhase then inventNamesForLocalClassesPhase then diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeAliasAnnotationMethodsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeAliasAnnotationMethodsLowering.kt new file mode 100644 index 00000000000..5505e693202 --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeAliasAnnotationMethodsLowering.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.jvm.lower + +import org.jetbrains.kotlin.backend.common.ClassLoweringPass +import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase +import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.builders.declarations.addFunction +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer +import org.jetbrains.kotlin.ir.declarations.IrTypeAlias +import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl +import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.name.Name + + +internal val typeAliasAnnotationMethodsPhase = makeIrFilePhase( + ::TypeAliasAnnotationMethodsLowering, + name = "TypeAliasAnnotationMethodsLowering", + description = "Generate method stubs for type alias annotations" +) + +class TypeAliasAnnotationMethodsLowering(val context: CommonBackendContext) : + ClassLoweringPass { + + override fun lower(irClass: IrClass) { + irClass.visitTypeAliases() + } + + private val IrTypeAlias.syntheticAnnotationMethodName + get() = Name.identifier(JvmAbi.getSyntheticMethodNameForAnnotatedTypeAlias(name)) + + private fun IrDeclarationContainer.visitTypeAliases() { + val annotatedAliases = declarations + .filterIsInstance() + .filter { !it.descriptor.annotations.isEmpty() } + + for (alias in annotatedAliases) { + addFunction { + name = alias.syntheticAnnotationMethodName + visibility = alias.visibility + returnType = context.irBuiltIns.unitType + modality = Modality.OPEN + origin = JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_TYPEALIAS_ANNOTATIONS + }.apply { + body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) + annotations.addAll(alias.annotations) + metadata = alias.metadata + } + } + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt b/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt index 6de90774dbc..7faf8bf1451 100644 --- a/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt +++ b/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/compileKotlinAgainstKotlin/annotationsOnTypeAliases.kt b/compiler/testData/compileKotlinAgainstKotlin/annotationsOnTypeAliases.kt index 7d3363b3e63..f01a7de8fe3 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/annotationsOnTypeAliases.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/annotationsOnTypeAliases.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // FILE: A.kt package a diff --git a/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/privateTypealias.kt b/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/privateTypealias.kt index e2fda3f051e..7bb3b0f1d43 100644 --- a/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/privateTypealias.kt +++ b/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/privateTypealias.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR @Target(AnnotationTarget.TYPEALIAS) annotation class Anno diff --git a/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/publicTypealias.kt b/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/publicTypealias.kt index 71b36393893..ea8d960a48f 100644 --- a/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/publicTypealias.kt +++ b/compiler/testData/writeFlags/typealias/syntheticAnnotationsMethod/publicTypealias.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR @Target(AnnotationTarget.TYPEALIAS) annotation class Anno