From e844c59e7e239be74ec920b5ea3f6a36359ef6e1 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 11 May 2020 23:22:45 -0700 Subject: [PATCH] FIR2IR: filter correct use-site target for value parameter annotations. --- .../fir/backend/generators/AnnotationGenerator.kt | 12 ++++++++++++ .../fir/backend/generators/ClassMemberGenerator.kt | 2 +- ...tyAccessorsFromClassHeaderWithAnnotations.fir.txt | 5 ----- .../propertySetterParameterWithAnnotations.fir.txt | 2 -- 4 files changed, 13 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 79b4e9260b8..8e2dc800a04 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 @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.backend.Fir2IrVisitor import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.util.isPropertyField @@ -22,6 +23,17 @@ internal class AnnotationGenerator(private val visitor: Fir2IrVisitor) { } } + fun generate(irValueParameter: IrValueParameter, firValueParameter: FirValueParameter, isInConstructor: Boolean) { + irValueParameter.annotations += + firValueParameter.annotations + .filter { + it.useSiteTarget == null || !isInConstructor || it.useSiteTarget == AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER + } + .mapNotNull { + it.accept(visitor, null) as? IrConstructorCall + } + } + fun generate(irProperty: IrProperty, property: FirProperty) { irProperty.annotations += property.annotations diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index 2a899a6563b..27db08a590e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -100,7 +100,7 @@ internal class ClassMemberGenerator( } for ((valueParameter, firValueParameter) in valueParameters.zip(firFunction.valueParameters)) { valueParameter.setDefaultValue(firValueParameter) - annotationGenerator.generate(valueParameter, firValueParameter) + annotationGenerator.generate(valueParameter, firValueParameter, irFunction is IrConstructor) } annotationGenerator.generate(irFunction, firFunction) } diff --git a/compiler/testData/ir/irText/declarations/annotations/propertyAccessorsFromClassHeaderWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/propertyAccessorsFromClassHeaderWithAnnotations.fir.txt index 5ec9bd5e019..dc4ad470de6 100644 --- a/compiler/testData/ir/irText/declarations/annotations/propertyAccessorsFromClassHeaderWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/propertyAccessorsFromClassHeaderWithAnnotations.fir.txt @@ -31,12 +31,7 @@ FILE fqName: fileName:/propertyAccessorsFromClassHeaderWithAnnotations.kt $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.C CONSTRUCTOR visibility:public <> (x:kotlin.Int, y:kotlin.Int) returnType:.C [primary] VALUE_PARAMETER name:x index:0 type:kotlin.Int - annotations: - A(x = 'C.x.get') VALUE_PARAMETER name:y index:1 type:kotlin.Int - annotations: - A(x = 'C.y.get') - A(x = 'C.y.set') BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any]' diff --git a/compiler/testData/ir/irText/declarations/annotations/propertySetterParameterWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/propertySetterParameterWithAnnotations.fir.txt index e3ed3e1a26c..7bf17de435c 100644 --- a/compiler/testData/ir/irText/declarations/annotations/propertySetterParameterWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/propertySetterParameterWithAnnotations.fir.txt @@ -36,8 +36,6 @@ FILE fqName: fileName:/propertySetterParameterWithAnnotations.kt $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.C CONSTRUCTOR visibility:public <> (p:kotlin.Int) returnType:.C [primary] VALUE_PARAMETER name:p index:0 type:kotlin.Int - annotations: - AnnParam BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any]'