From ab2a2b3a8754dc0d612316c32b0008e8e39757e8 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 9 Jun 2020 16:15:55 -0700 Subject: [PATCH] FIR2IR: eager conversion of annotations in Library class and members --- .../kotlin/fir/backend/Fir2IrConverter.kt | 5 +++- .../fir/backend/Fir2IrDeclarationStorage.kt | 24 +++++++++++++++---- .../fir/declarations/FirDeclarationUtil.kt | 2 ++ .../box/annotations/defaultParameterValues.kt | 1 - .../codegen/box/classLiteral/java/java.kt | 1 - .../classLiteral/primitiveKClassEquality.kt | 1 - ...nForLocalClassInFunctionWithMangledName.kt | 1 - .../codegen/box/jvm8/treeMapBridge.kt | 1 - .../multiplatform/optionalExpectationJvm.kt | 1 - .../box/reflection/annotations/retentions.kt | 1 - .../simpleConstructorAnnotation.kt | 1 - .../box/reflection/classLiterals/arrays.kt | 1 - .../box/reflection/classes/javaVoid.kt | 1 - .../codegen/box/reflection/classes/jvmName.kt | 1 - .../classes/primitiveKClassEquality.kt | 1 - .../box/reflection/classes/qualifiedName.kt | 1 - .../isInstance/isInstanceCastAndSafeCast.kt | 1 - .../kClassInAnnotation/arrayInJava.kt | 1 - .../kClassInAnnotation/basicInJava.kt | 1 - .../kClassInAnnotation/varargInJava.kt | 1 - .../mappedClassIsEqualToClassLiteral.kt | 1 - .../reflection/noReflectAtRuntime/javaVoid.kt | 1 - .../reifiedTypeJavaClass.kt | 1 - .../box/reflection/supertypes/primitives.kt | 1 - .../types/classifiersOfBuiltInTypes.kt | 1 - .../types/platformTypeClassifier.kt | 1 - .../codegen/box/regressions/kt9345.kt | 1 - .../box/typeMapping/genericTypeWithNothing.kt | 1 - 28 files changed, 25 insertions(+), 31 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index fc93dbe0848..f9c47aadb69 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.psi @@ -182,7 +183,8 @@ class Fir2IrConverter( val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, builtIns, mangler) val conversionScope = Fir2IrConversionScope() val classifierStorage = Fir2IrClassifierStorage(components) - val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor, classifierStorage, conversionScope, fakeOverrideMode) + val declarationStorage = + Fir2IrDeclarationStorage(components, moduleDescriptor, classifierStorage, conversionScope, fakeOverrideMode) val typeConverter = Fir2IrTypeConverter(components) components.declarationStorage = declarationStorage components.classifierStorage = classifierStorage @@ -212,6 +214,7 @@ class Fir2IrConverter( } val fir2irVisitor = Fir2IrVisitor(converter, components, conversionScope, fakeOverrideMode) + declarationStorage.annotationGenerator = AnnotationGenerator(fir2irVisitor) for (firFile in firFiles) { val irFile = firFile.accept(fir2irVisitor, null) as IrFile val fileEntry = sourceManager.getOrCreateFileEntry(firFile.psi as KtFile) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index e957124010c..10ab39eac91 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -9,6 +9,8 @@ import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.builtins.KotlinBuiltIns.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.fir.FirAnnotationContainer +import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter @@ -22,10 +24,7 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope -import org.jetbrains.kotlin.fir.symbols.Fir2IrConstructorSymbol -import org.jetbrains.kotlin.fir.symbols.Fir2IrPropertySymbol -import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol -import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -53,6 +52,9 @@ class Fir2IrDeclarationStorage( conversionScope: Fir2IrConversionScope, fakeOverrideMode: FakeOverrideMode ) : Fir2IrComponents by components { + + internal var annotationGenerator: AnnotationGenerator? = null + private val fakeOverrideGenerator = FakeOverrideGenerator( session, components.scopeSession, classifierStorage, this, conversionScope, fakeOverrideMode ) @@ -262,6 +264,7 @@ class Fir2IrDeclarationStorage( irDeclaration.parent = irClass } } + irClass.convertAnnotationsFromLibrary(regularClass) } internal fun findIrParent(packageFqName: FqName, parentClassId: ClassId?, firBasedSymbol: FirBasedSymbol<*>): IrDeclarationParent? { @@ -477,6 +480,7 @@ class Fir2IrDeclarationStorage( isOperator = simpleFunction?.isOperator == true ).apply { metadata = FirMetadataSource.Function(function) + convertAnnotationsFromLibrary(function) enterScope(this) bindAndDeclareParameters( function, irParent, @@ -600,8 +604,11 @@ class Fir2IrDeclarationStorage( isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE, isOperator = false ).apply { + correspondingPropertySymbol = correspondingProperty.symbol if (propertyAccessor != null) { metadata = FirMetadataSource.Function(propertyAccessor) + // Note that deserialized annotations are stored in the accessor, not the property. + convertAnnotationsFromLibrary(propertyAccessor) } with(classifierStorage) { setTypeParameters( @@ -625,7 +632,6 @@ class Fir2IrDeclarationStorage( if (irParent != null) { parent = irParent } - correspondingPropertySymbol = correspondingProperty.symbol if (!isFakeOverride && thisReceiverOwner != null) { populateOverriddenSymbols(thisReceiverOwner) } @@ -661,6 +667,7 @@ class Fir2IrDeclarationStorage( } }.apply { metadata = FirMetadataSource.Property(property) + convertAnnotationsFromLibrary(property) } } } @@ -709,6 +716,7 @@ class Fir2IrDeclarationStorage( isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE ).apply { metadata = FirMetadataSource.Variable(property) + convertAnnotationsFromLibrary(property) enterScope(this) if (irParent != null) { parent = irParent @@ -1023,6 +1031,12 @@ class Fir2IrDeclarationStorage( } } + private fun IrMutableAnnotationContainer.convertAnnotationsFromLibrary(firAnnotationContainer: FirAnnotationContainer) { + if ((firAnnotationContainer as? FirDeclaration)?.isFromLibrary == true) { + annotationGenerator?.generate(this, firAnnotationContainer) + } + } + companion object { internal val ENUM_SYNTHETIC_NAMES = mapOf( Name.identifier("values") to IrSyntheticBodyKind.ENUM_VALUES, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index 22e6f83ea5e..ab4e26df117 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -33,6 +33,8 @@ fun FirTypeParameterBuilder.addDefaultBoundIfNecessary(isFlexible: Boolean = fal } } +inline val FirDeclaration.isFromLibrary: Boolean + get() = origin == FirDeclarationOrigin.Library inline val FirRegularClass.isInner get() = status.isInner inline val FirRegularClass.isCompanion get() = status.isCompanion inline val FirRegularClass.isData get() = status.isData diff --git a/compiler/testData/codegen/box/annotations/defaultParameterValues.kt b/compiler/testData/codegen/box/annotations/defaultParameterValues.kt index 1c9b5b22fcb..1fc6240a68e 100644 --- a/compiler/testData/codegen/box/annotations/defaultParameterValues.kt +++ b/compiler/testData/codegen/box/annotations/defaultParameterValues.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/classLiteral/java/java.kt b/compiler/testData/codegen/box/classLiteral/java/java.kt index 530cdbe6db3..bc4a5b66a7c 100644 --- a/compiler/testData/codegen/box/classLiteral/java/java.kt +++ b/compiler/testData/codegen/box/classLiteral/java/java.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/classLiteral/primitiveKClassEquality.kt b/compiler/testData/codegen/box/classLiteral/primitiveKClassEquality.kt index f24e9506069..37a6d391a82 100644 --- a/compiler/testData/codegen/box/classLiteral/primitiveKClassEquality.kt +++ b/compiler/testData/codegen/box/classLiteral/primitiveKClassEquality.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt index 93fb63786b1..c89652587d4 100644 --- a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt +++ b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT import kotlin.test.* diff --git a/compiler/testData/codegen/box/jvm8/treeMapBridge.kt b/compiler/testData/codegen/box/jvm8/treeMapBridge.kt index 86a9a8dd7dd..852cfb7774c 100644 --- a/compiler/testData/codegen/box/jvm8/treeMapBridge.kt +++ b/compiler/testData/codegen/box/jvm8/treeMapBridge.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // java.lang.NoSuchMethodError: java.util.TreeMap.remove diff --git a/compiler/testData/codegen/box/multiplatform/optionalExpectationJvm.kt b/compiler/testData/codegen/box/multiplatform/optionalExpectationJvm.kt index 5e8551327de..2af96ee5bfe 100644 --- a/compiler/testData/codegen/box/multiplatform/optionalExpectationJvm.kt +++ b/compiler/testData/codegen/box/multiplatform/optionalExpectationJvm.kt @@ -1,6 +1,5 @@ // !LANGUAGE: +MultiPlatformProjects // !USE_EXPERIMENTAL: kotlin.ExperimentalMultiplatform -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME // FILE: common.kt diff --git a/compiler/testData/codegen/box/reflection/annotations/retentions.kt b/compiler/testData/codegen/box/reflection/annotations/retentions.kt index 086ecc4214d..3d9597bd113 100644 --- a/compiler/testData/codegen/box/reflection/annotations/retentions.kt +++ b/compiler/testData/codegen/box/reflection/annotations/retentions.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/annotations/simpleConstructorAnnotation.kt b/compiler/testData/codegen/box/reflection/annotations/simpleConstructorAnnotation.kt index 07fc9ee987e..9b959d19126 100644 --- a/compiler/testData/codegen/box/reflection/annotations/simpleConstructorAnnotation.kt +++ b/compiler/testData/codegen/box/reflection/annotations/simpleConstructorAnnotation.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/classLiterals/arrays.kt b/compiler/testData/codegen/box/reflection/classLiterals/arrays.kt index 7971ff22127..909fd68aa7e 100644 --- a/compiler/testData/codegen/box/reflection/classLiterals/arrays.kt +++ b/compiler/testData/codegen/box/reflection/classLiterals/arrays.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/classes/javaVoid.kt b/compiler/testData/codegen/box/reflection/classes/javaVoid.kt index 5d0b9c6a824..7754f906973 100644 --- a/compiler/testData/codegen/box/reflection/classes/javaVoid.kt +++ b/compiler/testData/codegen/box/reflection/classes/javaVoid.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/classes/jvmName.kt b/compiler/testData/codegen/box/reflection/classes/jvmName.kt index 549de030b61..bbe57838d82 100644 --- a/compiler/testData/codegen/box/reflection/classes/jvmName.kt +++ b/compiler/testData/codegen/box/reflection/classes/jvmName.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/classes/primitiveKClassEquality.kt b/compiler/testData/codegen/box/reflection/classes/primitiveKClassEquality.kt index d610f5e2645..b7bc4d6b618 100644 --- a/compiler/testData/codegen/box/reflection/classes/primitiveKClassEquality.kt +++ b/compiler/testData/codegen/box/reflection/classes/primitiveKClassEquality.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/classes/qualifiedName.kt b/compiler/testData/codegen/box/reflection/classes/qualifiedName.kt index 43ccdec2c39..df202f619cc 100644 --- a/compiler/testData/codegen/box/reflection/classes/qualifiedName.kt +++ b/compiler/testData/codegen/box/reflection/classes/qualifiedName.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/isInstance/isInstanceCastAndSafeCast.kt b/compiler/testData/codegen/box/reflection/isInstance/isInstanceCastAndSafeCast.kt index 87da5ac9e9d..3a409a7c94b 100644 --- a/compiler/testData/codegen/box/reflection/isInstance/isInstanceCastAndSafeCast.kt +++ b/compiler/testData/codegen/box/reflection/isInstance/isInstanceCastAndSafeCast.kt @@ -1,5 +1,4 @@ // !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/kClassInAnnotation/arrayInJava.kt b/compiler/testData/codegen/box/reflection/kClassInAnnotation/arrayInJava.kt index 1da2ed7de88..c0b8945fc5a 100644 --- a/compiler/testData/codegen/box/reflection/kClassInAnnotation/arrayInJava.kt +++ b/compiler/testData/codegen/box/reflection/kClassInAnnotation/arrayInJava.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/kClassInAnnotation/basicInJava.kt b/compiler/testData/codegen/box/reflection/kClassInAnnotation/basicInJava.kt index b158665a10c..42ea45c6080 100644 --- a/compiler/testData/codegen/box/reflection/kClassInAnnotation/basicInJava.kt +++ b/compiler/testData/codegen/box/reflection/kClassInAnnotation/basicInJava.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/kClassInAnnotation/varargInJava.kt b/compiler/testData/codegen/box/reflection/kClassInAnnotation/varargInJava.kt index 9495ee4a0e3..2e5a2302223 100644 --- a/compiler/testData/codegen/box/reflection/kClassInAnnotation/varargInJava.kt +++ b/compiler/testData/codegen/box/reflection/kClassInAnnotation/varargInJava.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt b/compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt index 189b14181c8..5ce0bfcb1ee 100644 --- a/compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt +++ b/compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/noReflectAtRuntime/javaVoid.kt b/compiler/testData/codegen/box/reflection/noReflectAtRuntime/javaVoid.kt index c05fa4a3bef..74ca559916a 100644 --- a/compiler/testData/codegen/box/reflection/noReflectAtRuntime/javaVoid.kt +++ b/compiler/testData/codegen/box/reflection/noReflectAtRuntime/javaVoid.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/noReflectAtRuntime/reifiedTypeJavaClass.kt b/compiler/testData/codegen/box/reflection/noReflectAtRuntime/reifiedTypeJavaClass.kt index 771678bd974..e0d18d60455 100644 --- a/compiler/testData/codegen/box/reflection/noReflectAtRuntime/reifiedTypeJavaClass.kt +++ b/compiler/testData/codegen/box/reflection/noReflectAtRuntime/reifiedTypeJavaClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/supertypes/primitives.kt b/compiler/testData/codegen/box/reflection/supertypes/primitives.kt index d53acdecc79..c00b698991a 100644 --- a/compiler/testData/codegen/box/reflection/supertypes/primitives.kt +++ b/compiler/testData/codegen/box/reflection/supertypes/primitives.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/types/classifiersOfBuiltInTypes.kt b/compiler/testData/codegen/box/reflection/types/classifiersOfBuiltInTypes.kt index 2e474f9e6b0..cb7a4b70b99 100644 --- a/compiler/testData/codegen/box/reflection/types/classifiersOfBuiltInTypes.kt +++ b/compiler/testData/codegen/box/reflection/types/classifiersOfBuiltInTypes.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/types/platformTypeClassifier.kt b/compiler/testData/codegen/box/reflection/types/platformTypeClassifier.kt index f89d2722bd8..8487647d634 100644 --- a/compiler/testData/codegen/box/reflection/types/platformTypeClassifier.kt +++ b/compiler/testData/codegen/box/reflection/types/platformTypeClassifier.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/regressions/kt9345.kt b/compiler/testData/codegen/box/regressions/kt9345.kt index 6f04999cda1..6c6b6088d08 100644 --- a/compiler/testData/codegen/box/regressions/kt9345.kt +++ b/compiler/testData/codegen/box/regressions/kt9345.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/typeMapping/genericTypeWithNothing.kt b/compiler/testData/codegen/box/typeMapping/genericTypeWithNothing.kt index c8d814d31e5..8cd253b338c 100644 --- a/compiler/testData/codegen/box/typeMapping/genericTypeWithNothing.kt +++ b/compiler/testData/codegen/box/typeMapping/genericTypeWithNothing.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME