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:
committed by
Space Team
parent
ad5593e68a
commit
e63ed03d19
+12
-10
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
+4
@@ -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
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user