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
This commit is contained in:
Pavel Kunyavskiy
2023-04-19 15:02:13 +02:00
committed by Space Team
parent ad5593e68a
commit e63ed03d19
6 changed files with 20 additions and 15 deletions
@@ -298,9 +298,9 @@ class Fir2IrDeclarationStorage(
} }
} }
private fun <T : IrFunction> T.declareDefaultSetterParameter(type: IrType): T { private fun <T : IrFunction> T.declareDefaultSetterParameter(type: IrType, firValueParameter: FirValueParameter?): T {
valueParameters = listOf( valueParameters = listOf(
createDefaultSetterParameter(startOffset, endOffset, type, parent = this) createDefaultSetterParameter(startOffset, endOffset, type, parent = this, firValueParameter)
) )
return this return this
} }
@@ -310,6 +310,7 @@ class Fir2IrDeclarationStorage(
endOffset: Int, endOffset: Int,
type: IrType, type: IrType,
parent: IrFunction, parent: IrFunction,
firValueParameter: FirValueParameter?,
name: Name? = null, name: Name? = null,
isCrossinline: Boolean = false, isCrossinline: Boolean = false,
isNoinline: Boolean = false, isNoinline: Boolean = false,
@@ -322,6 +323,9 @@ class Fir2IrDeclarationStorage(
isHidden = false, isAssignable = false isHidden = false, isAssignable = false
).apply { ).apply {
this.parent = parent 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 val typeContext = if (forSetter) ConversionTypeContext.IN_SETTER else ConversionTypeContext.DEFAULT
if (function is FirDefaultPropertySetter) { if (function is FirDefaultPropertySetter) {
val type = function.valueParameters.first().returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER) val valueParameter = function.valueParameters.first()
declareDefaultSetterParameter(type) val type = valueParameter.returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER)
declareDefaultSetterParameter(type, valueParameter)
} else if (function != null) { } else if (function != null) {
val contextReceivers = function.contextReceiversForFunctionOrContainingProperty() val contextReceivers = function.contextReceiversForFunctionOrContainingProperty()
@@ -743,7 +748,8 @@ class Fir2IrDeclarationStorage(
enterScope(this) enterScope(this)
if (propertyAccessor == null && isSetter) { if (propertyAccessor == null && isSetter) {
declareDefaultSetterParameter( declareDefaultSetterParameter(
property.returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER) property.returnTypeRef.toIrType(ConversionTypeContext.IN_SETTER),
firValueParameter = null
) )
} }
bindAndDeclareParameters( bindAndDeclareParameters(
@@ -1163,6 +1169,7 @@ class Fir2IrDeclarationStorage(
) )
) )
} }
annotationGenerator.generate(this, valueParameter)
} }
} }
localStorage.putParameter(valueParameter, irParameter) localStorage.putParameter(valueParameter, irParameter)
@@ -1673,11 +1680,6 @@ class Fir2IrDeclarationStorage(
|| origin == IrDeclarationOrigin.FAKE_OVERRIDE || origin == IrDeclarationOrigin.FAKE_OVERRIDE
) { ) {
annotationGenerator.generate(this, firAnnotationContainer) annotationGenerator.generate(this, firAnnotationContainer)
if (this is IrFunction && firAnnotationContainer is FirSimpleFunction) {
valueParameters.zip(firAnnotationContainer.valueParameters).forEach { (irParameter, firParameter) ->
annotationGenerator.generate(irParameter, firParameter)
}
}
} }
} }
@@ -112,7 +112,6 @@ internal class ClassMemberGenerator(
val annotationMode = containingClass?.classKind == ClassKind.ANNOTATION_CLASS && irFunction is IrConstructor val annotationMode = containingClass?.classKind == ClassKind.ANNOTATION_CLASS && irFunction is IrConstructor
for ((valueParameter, firValueParameter) in irParameters.zip(firFunction.valueParameters)) { for ((valueParameter, firValueParameter) in irParameters.zip(firFunction.valueParameters)) {
valueParameter.setDefaultValue(firValueParameter, annotationMode) valueParameter.setDefaultValue(firValueParameter, annotationMode)
annotationGenerator.generate(valueParameter, firValueParameter)
} }
annotationGenerator.generate(irFunction, firFunction) annotationGenerator.generate(irFunction, firFunction)
} }
@@ -94,6 +94,7 @@ class Fir2IrLazyPropertyAccessor(
typeConverter, conversionTypeContext typeConverter, conversionTypeContext
), ),
parent = this@Fir2IrLazyPropertyAccessor, parent = this@Fir2IrLazyPropertyAccessor,
firValueParameter = valueParameter,
name = valueParameter?.name, name = valueParameter?.name,
isCrossinline = valueParameter?.isCrossinline == true, isCrossinline = valueParameter?.isCrossinline == true,
isNoinline = valueParameter?.isNoinline == true isNoinline = valueParameter?.isNoinline == true
@@ -11,6 +11,8 @@ FILE fqName:<root> fileName:/delegatedImplementationOfJavaInterface.kt
public abstract fun takeNotNull (x: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in <root>.J public abstract fun takeNotNull (x: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in <root>.J
$this: VALUE_PARAMETER name:<this> type:<root>.Test $this: VALUE_PARAMETER name:<this> type:<root>.Test
VALUE_PARAMETER name:x index:0 type:@[EnhancedNullability] kotlin.String VALUE_PARAMETER name:x index:0 type:@[EnhancedNullability] kotlin.String
annotations:
NotNull(value = <null>)
BLOCK_BODY BLOCK_BODY
CALL 'public abstract fun takeNotNull (x: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in <root>.J' type=kotlin.Unit origin=null CALL 'public abstract fun takeNotNull (x: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in <root>.J' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:j type:<root>.J visibility:private [final]' type=<root>.J origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:j type:<root>.J visibility:private [final]' type=<root>.J origin=null
@@ -21,6 +23,8 @@ FILE fqName:<root> fileName:/delegatedImplementationOfJavaInterface.kt
public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in <root>.J public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in <root>.J
$this: VALUE_PARAMETER name:<this> type:<root>.Test $this: VALUE_PARAMETER name:<this> type:<root>.Test
VALUE_PARAMETER name:x index:0 type:kotlin.String? VALUE_PARAMETER name:x index:0 type:kotlin.String?
annotations:
Nullable(value = <null>)
BLOCK_BODY BLOCK_BODY
CALL 'public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in <root>.J' type=kotlin.Unit origin=null CALL 'public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in <root>.J' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:j type:<root>.J visibility:private [final]' type=<root>.J origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:j type:<root>.J visibility:private [final]' type=<root>.J origin=null
@@ -5,11 +5,11 @@ class Test : J {
} }
override fun takeNotNull(x: @EnhancedNullability String) { override fun takeNotNull(@NotNull x: @EnhancedNullability String) {
<this>.#j.takeNotNull(x = x) <this>.#j.takeNotNull(x = x)
} }
override fun takeNullable(x: String?) { override fun takeNullable(@Nullable x: String?) {
<this>.#j.takeNullable(x = x) <this>.#j.takeNullable(x = x)
} }
@@ -104,8 +104,7 @@ internal class DynamicCompilerDriver : CompilerDriver() {
require(frontendOutput is FirOutput.Full) require(frontendOutput is FirOutput.Full)
val fir2IrOutput = engine.runFir2Ir(frontendOutput) val fir2IrOutput = engine.runFir2Ir(frontendOutput)
// FIXME: KT-58099 engine.runK2SpecialBackendChecks(fir2IrOutput)
// engine.runK2SpecialBackendChecks(fir2IrOutput)
return engine.runFirSerializer(fir2IrOutput) return engine.runFirSerializer(fir2IrOutput)
} }