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(
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)
}
}
}
}
@@ -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)
}
@@ -94,6 +94,7 @@ class Fir2IrLazyPropertyAccessor(
typeConverter, conversionTypeContext
),
parent = this@Fir2IrLazyPropertyAccessor,
firValueParameter = valueParameter,
name = valueParameter?.name,
isCrossinline = valueParameter?.isCrossinline == 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
$this: VALUE_PARAMETER name:<this> type:<root>.Test
VALUE_PARAMETER name:x index:0 type:@[EnhancedNullability] kotlin.String
annotations:
NotNull(value = <null>)
BLOCK_BODY
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
@@ -21,6 +23,8 @@ FILE fqName:<root> fileName:/delegatedImplementationOfJavaInterface.kt
public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in <root>.J
$this: VALUE_PARAMETER name:<this> type:<root>.Test
VALUE_PARAMETER name:x index:0 type:kotlin.String?
annotations:
Nullable(value = <null>)
BLOCK_BODY
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
@@ -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)
}
override fun takeNullable(x: String?) {
override fun takeNullable(@Nullable x: String?) {
<this>.#j.takeNullable(x = x)
}
@@ -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)
}