JVM IR: Generate synthetic methods for type aliases with annotations
This commit is contained in:
committed by
max-kammerer
parent
acd1cc5a57
commit
52dc469657
+1
-1
@@ -157,7 +157,7 @@ inline fun buildFun(builder: IrFunctionBuilder.() -> Unit): IrFunctionImpl =
|
|||||||
buildFun()
|
buildFun()
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun IrDeclarationContainer.addFunction(builder: IrFunctionBuilder.() -> Unit): IrSimpleFunction =
|
inline fun IrDeclarationContainer.addFunction(builder: IrFunctionBuilder.() -> Unit): IrFunctionImpl =
|
||||||
buildFun(builder).also { function ->
|
buildFun(builder).also { function ->
|
||||||
declarations.add(function)
|
declarations.add(function)
|
||||||
function.parent = this@addFunction
|
function.parent = this@addFunction
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin {
|
|||||||
object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER")
|
object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER")
|
||||||
object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS :
|
object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS :
|
||||||
IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS", isSynthetic = true)
|
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_PROPERTY_REFERENCE : IrDeclarationOriginImpl("GENERATED_PROPERTY_REFERENCE", isSynthetic = true)
|
||||||
object GENERATED_SAM_IMPLEMENTATION : IrDeclarationOriginImpl("GENERATED_SAM_IMPLEMENTATION", isSynthetic = true)
|
object GENERATED_SAM_IMPLEMENTATION : IrDeclarationOriginImpl("GENERATED_SAM_IMPLEMENTATION", isSynthetic = true)
|
||||||
object ENUM_MAPPINGS_FOR_WHEN : IrDeclarationOriginImpl("ENUM_MAPPINGS_FOR_WHEN", isSynthetic = true)
|
object ENUM_MAPPINGS_FOR_WHEN : IrDeclarationOriginImpl("ENUM_MAPPINGS_FOR_WHEN", isSynthetic = true)
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ private val returnableBlocksPhase = makeIrFilePhase(
|
|||||||
|
|
||||||
@Suppress("Reformat")
|
@Suppress("Reformat")
|
||||||
private val jvmFilePhases =
|
private val jvmFilePhases =
|
||||||
|
typeAliasAnnotationMethodsPhase then
|
||||||
stripTypeAliasDeclarationsPhase then
|
stripTypeAliasDeclarationsPhase then
|
||||||
provisionalFunctionExpressionPhase then
|
provisionalFunctionExpressionPhase then
|
||||||
inventNamesForLocalClassesPhase then
|
inventNamesForLocalClassesPhase then
|
||||||
|
|||||||
+58
@@ -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<IrTypeAlias>()
|
||||||
|
.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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// FILE: A.kt
|
// FILE: A.kt
|
||||||
package a
|
package a
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
@Target(AnnotationTarget.TYPEALIAS)
|
@Target(AnnotationTarget.TYPEALIAS)
|
||||||
annotation class Anno
|
annotation class Anno
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
@Target(AnnotationTarget.TYPEALIAS)
|
@Target(AnnotationTarget.TYPEALIAS)
|
||||||
annotation class Anno
|
annotation class Anno
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user