From e63ed03d197110ffcfd591df17ff89003ee677ff Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Wed, 19 Apr 2023 15:02:13 +0200 Subject: [PATCH] K2: Consolidate value parameter annotations handling in Fir2Ir Value parameters annotations are now handled consistently in factory functions creating this IrValueParameter instances. In before, it was handled in several different places, which leads to being sometimes lost, e.g. in LazyFirSimpleFunction. This caused original problem in interop checks. ^KT-58099 --- .../fir/backend/Fir2IrDeclarationStorage.kt | 22 ++++++++++--------- .../generators/ClassMemberGenerator.kt | 1 - .../fir/lazy/Fir2IrLazyPropertyAccessor.kt | 1 + ...edImplementationOfJavaInterface.fir.ir.txt | 4 ++++ ...edImplementationOfJavaInterface.fir.kt.txt | 4 ++-- .../konan/driver/DynamicCompilerDriver.kt | 3 +-- 6 files changed, 20 insertions(+), 15 deletions(-) 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 c69d6ad7205..d27bbe23188 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 @@ -298,9 +298,9 @@ class Fir2IrDeclarationStorage( } } - private fun T.declareDefaultSetterParameter(type: IrType): T { + private fun T.declareDefaultSetterParameter(type: IrType, firValueParameter: FirValueParameter?): T { valueParameters = listOf( - createDefaultSetterParameter(startOffset, endOffset, type, parent = this) + createDefaultSetterParameter(startOffset, endOffset, type, parent = this, firValueParameter) ) return this } @@ -310,6 +310,7 @@ class Fir2IrDeclarationStorage( endOffset: Int, type: IrType, parent: IrFunction, + firValueParameter: FirValueParameter?, name: Name? = null, isCrossinline: Boolean = false, isNoinline: Boolean = false, @@ -322,6 +323,9 @@ class Fir2IrDeclarationStorage( isHidden = false, isAssignable = false ).apply { this.parent = parent + if (firValueParameter != null) { + annotationGenerator.generate(this, firValueParameter) + } } } @@ -341,8 +345,9 @@ class Fir2IrDeclarationStorage( } val typeContext = if (forSetter) ConversionTypeContext.IN_SETTER else ConversionTypeContext.DEFAULT if (function is FirDefaultPropertySetter) { - val type = function.valueParameters.first().returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER) - declareDefaultSetterParameter(type) + val valueParameter = function.valueParameters.first() + val type = valueParameter.returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER) + declareDefaultSetterParameter(type, valueParameter) } else if (function != null) { val contextReceivers = function.contextReceiversForFunctionOrContainingProperty() @@ -743,7 +748,8 @@ class Fir2IrDeclarationStorage( enterScope(this) if (propertyAccessor == null && isSetter) { declareDefaultSetterParameter( - property.returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER) + property.returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER), + firValueParameter = null ) } bindAndDeclareParameters( @@ -1163,6 +1169,7 @@ class Fir2IrDeclarationStorage( ) ) } + annotationGenerator.generate(this, valueParameter) } } localStorage.putParameter(valueParameter, irParameter) @@ -1673,11 +1680,6 @@ class Fir2IrDeclarationStorage( || origin == IrDeclarationOrigin.FAKE_OVERRIDE ) { annotationGenerator.generate(this, firAnnotationContainer) - if (this is IrFunction && firAnnotationContainer is FirSimpleFunction) { - valueParameters.zip(firAnnotationContainer.valueParameters).forEach { (irParameter, firParameter) -> - annotationGenerator.generate(irParameter, firParameter) - } - } } } 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 3e46c7b3de8..c7dc007628f 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 @@ -112,7 +112,6 @@ internal class ClassMemberGenerator( val annotationMode = containingClass?.classKind == ClassKind.ANNOTATION_CLASS && irFunction is IrConstructor for ((valueParameter, firValueParameter) in irParameters.zip(firFunction.valueParameters)) { valueParameter.setDefaultValue(firValueParameter, annotationMode) - annotationGenerator.generate(valueParameter, firValueParameter) } annotationGenerator.generate(irFunction, firFunction) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt index 6b61caf9448..553587060ee 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt @@ -94,6 +94,7 @@ class Fir2IrLazyPropertyAccessor( typeConverter, conversionTypeContext ), parent = this@Fir2IrLazyPropertyAccessor, + firValueParameter = valueParameter, name = valueParameter?.name, isCrossinline = valueParameter?.isCrossinline == true, isNoinline = valueParameter?.isNoinline == true diff --git a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.ir.txt b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.ir.txt index 4da0c629691..ac411dcade6 100644 --- a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.ir.txt +++ b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.ir.txt @@ -11,6 +11,8 @@ FILE fqName: fileName:/delegatedImplementationOfJavaInterface.kt public abstract fun takeNotNull (x: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in .J $this: VALUE_PARAMETER name: type:.Test VALUE_PARAMETER name:x index:0 type:@[EnhancedNullability] kotlin.String + annotations: + NotNull(value = ) BLOCK_BODY CALL 'public abstract fun takeNotNull (x: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:j type:.J visibility:private [final]' type=.J origin=null @@ -21,6 +23,8 @@ FILE fqName: fileName:/delegatedImplementationOfJavaInterface.kt public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in .J $this: VALUE_PARAMETER name: type:.Test VALUE_PARAMETER name:x index:0 type:kotlin.String? + annotations: + Nullable(value = ) BLOCK_BODY CALL 'public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:j type:.J visibility:private [final]' type=.J origin=null diff --git a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt index 829068f54fb..35defedd410 100644 --- a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt +++ b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt @@ -5,11 +5,11 @@ class Test : J { } - override fun takeNotNull(x: @EnhancedNullability String) { + override fun takeNotNull(@NotNull x: @EnhancedNullability String) { .#j.takeNotNull(x = x) } - override fun takeNullable(x: String?) { + override fun takeNullable(@Nullable x: String?) { .#j.takeNullable(x = x) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt index fddf060b56a..981717f10c6 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt @@ -104,8 +104,7 @@ internal class DynamicCompilerDriver : CompilerDriver() { require(frontendOutput is FirOutput.Full) val fir2IrOutput = engine.runFir2Ir(frontendOutput) - // FIXME: KT-58099 - // engine.runK2SpecialBackendChecks(fir2IrOutput) + engine.runK2SpecialBackendChecks(fir2IrOutput) return engine.runFirSerializer(fir2IrOutput) }