From dc2226b42fea7a6ce2bae1b67887ee49cfba0052 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Wed, 23 Sep 2020 18:12:22 -0700 Subject: [PATCH] FIR2IR: put @JvmField on field, not property #KT-42118 fixed --- .../fir/backend/generators/AnnotationGenerator.kt | 7 +++++-- .../kotlin/fir/declarations/FirDeclarationUtil.kt | 10 +++++++--- .../box/jvmField/annotationCompanionWithJava.kt | 1 - .../testData/codegen/box/jvmField/checkNoAccessors.kt | 1 - .../codegen/box/jvmField/interfaceCompanionWithJava.kt | 1 - 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt index 1d469f6444d..bc7e5ba92b1 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirValueParameter +import org.jetbrains.kotlin.fir.declarations.isJvmFieldAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrConstructorCall @@ -48,7 +49,8 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F irProperty.annotations += property.annotations .filter { - it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY + !it.isJvmFieldAnnotation && + (it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY) } .toIrAnnotations() } @@ -60,7 +62,8 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F irField.annotations += property.annotations .filter { - it.useSiteTarget == AnnotationUseSiteTarget.FIELD || + it.isJvmFieldAnnotation || + it.useSiteTarget == AnnotationUseSiteTarget.FIELD || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD } .toIrAnnotations() 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 eeb1ef464f5..502227dd0d8 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 @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl import org.jetbrains.kotlin.fir.declarations.impl.FirRegularClassImpl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol @@ -129,9 +130,12 @@ val FirProperty.hasBackingField: Boolean isReferredViaField == true inline val FirProperty.hasJvmFieldAnnotation: Boolean - get() = annotations.any { - val classId = it.annotationTypeRef.coneTypeSafe()?.classId - classId?.packageFqName?.asString() == "kotlin.jvm" && classId.relativeClassName.asString() == "JvmField" + get() = annotations.any { it.isJvmFieldAnnotation } + +inline val FirAnnotationCall.isJvmFieldAnnotation: Boolean + get() { + val classId = annotationTypeRef.coneTypeSafe()?.classId + return classId?.packageFqName?.asString() == "kotlin.jvm" && classId.relativeClassName.asString() == "JvmField" } fun FirAnnotatedDeclaration.hasAnnotation(classId: ClassId): Boolean { diff --git a/compiler/testData/codegen/box/jvmField/annotationCompanionWithJava.kt b/compiler/testData/codegen/box/jvmField/annotationCompanionWithJava.kt index fe4ca578e97..1b8002ff7da 100644 --- a/compiler/testData/codegen/box/jvmField/annotationCompanionWithJava.kt +++ b/compiler/testData/codegen/box/jvmField/annotationCompanionWithJava.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +JvmFieldInInterface +NestedClassesInAnnotations -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/jvmField/checkNoAccessors.kt b/compiler/testData/codegen/box/jvmField/checkNoAccessors.kt index 605df02aece..24952386a40 100644 --- a/compiler/testData/codegen/box/jvmField/checkNoAccessors.kt +++ b/compiler/testData/codegen/box/jvmField/checkNoAccessors.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt b/compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt index 504fe567d0b..76f63e669c4 100644 --- a/compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt +++ b/compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +JvmFieldInInterface -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME