[FIR] Set type arguments for callable reference in property delegation
#KT-58555 Fixed
This commit is contained in:
committed by
Space Team
parent
bdfc2c33c5
commit
4dd1f9f4d6
+11
@@ -44,11 +44,13 @@ import org.jetbrains.kotlin.fir.types.ConeStarProjection
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
@@ -389,6 +391,15 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
FirImplicitKProperty1TypeRef(null, ConeStarProjection, ConeStarProjection)
|
||||
}
|
||||
}
|
||||
this@generateAccessorsByDelegate.typeParameters.mapTo(typeArguments) {
|
||||
buildTypeProjectionWithVariance {
|
||||
source = fakeSource
|
||||
variance = Variance.INVARIANT
|
||||
typeRef = buildResolvedTypeRef {
|
||||
type = ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delegateBuilder.delegateProvider = buildFunctionCall {
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
// !LANGUAGE: -ForbidUsingExtensionPropertyTypeParameterInDelegate
|
||||
//For KT-6020
|
||||
// KT-58555
|
||||
// IGNORE_BACKEND_K2: NATIVE
|
||||
|
||||
import kotlin.reflect.KProperty1
|
||||
import kotlin.reflect.KMutableProperty1
|
||||
|
||||
-3
@@ -1,11 +1,8 @@
|
||||
// !LANGUAGE: -ForbidUsingExtensionPropertyTypeParameterInDelegate
|
||||
// IGNORE_BACKEND: WASM
|
||||
// WASM_MUTE_REASON: IGNORED_IN_NATIVE
|
||||
// SKIP_MANGLE_VERIFICATION
|
||||
//For KT-6020
|
||||
// KT-24643: language version in K2 is >= 1.8
|
||||
// KT-58555
|
||||
// IGNORE_BACKEND_K2: NATIVE
|
||||
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
// !LANGUAGE: -ForbidUsingExtensionPropertyTypeParameterInDelegate
|
||||
//For KT-6020
|
||||
// KT-24643: language version in K2 is >= 1.8
|
||||
// KT-58555
|
||||
// IGNORE_BACKEND_K2: NATIVE
|
||||
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
+2
-2
@@ -65,7 +65,7 @@ FILE fqName:<root> fileName:/genericDelegatedProperty.kt
|
||||
$this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:genericDelegatedProperty$delegate type:<root>.Delegate visibility:private [final,static]' type=<root>.Delegate origin=null
|
||||
thisRef: GET_VAR '<this>: <root>.C<T of <root>.<get-genericDelegatedProperty>> declared in <root>.<get-genericDelegatedProperty>' type=<root>.C<T of <root>.<get-genericDelegatedProperty>> origin=null
|
||||
kProp: PROPERTY_REFERENCE 'public final genericDelegatedProperty: kotlin.Int [delegated,var]' field=null getter='public final fun <get-genericDelegatedProperty> <T> (): kotlin.Int declared in <root>' setter='public final fun <set-genericDelegatedProperty> <T> (<set-?>: kotlin.Int): kotlin.Unit declared in <root>' type=kotlin.reflect.KMutableProperty1<<root>.C<T of <root>.<get-genericDelegatedProperty>>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
<1>: <none>
|
||||
<1>: T of <root>.<get-genericDelegatedProperty>
|
||||
FUN DELEGATED_PROPERTY_ACCESSOR name:<set-genericDelegatedProperty> visibility:public modality:FINAL <T> ($receiver:<root>.C<T of <root>.<set-genericDelegatedProperty>>, <set-?>:kotlin.Int) returnType:kotlin.Unit
|
||||
correspondingProperty: PROPERTY name:genericDelegatedProperty visibility:public modality:FINAL [delegated,var]
|
||||
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] reified:false
|
||||
@@ -76,5 +76,5 @@ FILE fqName:<root> fileName:/genericDelegatedProperty.kt
|
||||
$this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:genericDelegatedProperty$delegate type:<root>.Delegate visibility:private [final,static]' type=<root>.Delegate origin=null
|
||||
thisRef: GET_VAR '<this>: <root>.C<T of <root>.<set-genericDelegatedProperty>> declared in <root>.<set-genericDelegatedProperty>' type=<root>.C<T of <root>.<set-genericDelegatedProperty>> origin=null
|
||||
kProp: PROPERTY_REFERENCE 'public final genericDelegatedProperty: kotlin.Int [delegated,var]' field=null getter='public final fun <get-genericDelegatedProperty> <T> (): kotlin.Int declared in <root>' setter='public final fun <set-genericDelegatedProperty> <T> (<set-?>: kotlin.Int): kotlin.Unit declared in <root>' type=kotlin.reflect.KMutableProperty1<<root>.C<T of <root>.<set-genericDelegatedProperty>>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
<1>: <none>
|
||||
<1>: T of <root>.<set-genericDelegatedProperty>
|
||||
newValue: GET_VAR '<set-?>: kotlin.Int declared in <root>.<set-genericDelegatedProperty>' type=kotlin.Int origin=null
|
||||
|
||||
+2
-2
@@ -26,8 +26,8 @@ object Delegate {
|
||||
var <T : Any?> C<T>.genericDelegatedProperty: Int /* by */
|
||||
field = Delegate
|
||||
get(): Int {
|
||||
return #genericDelegatedProperty$delegate.getValue(thisRef = <this>, kProp = ::genericDelegatedProperty/*</* null */>()*/)
|
||||
return #genericDelegatedProperty$delegate.getValue(thisRef = <this>, kProp = ::genericDelegatedProperty/*<T>()*/)
|
||||
}
|
||||
set(<set-?>: Int) {
|
||||
#genericDelegatedProperty$delegate.setValue(thisRef = <this>, kProp = ::genericDelegatedProperty/*</* null */>()*/, newValue = <set-?>)
|
||||
#genericDelegatedProperty$delegate.setValue(thisRef = <this>, kProp = ::genericDelegatedProperty/*<T>()*/, newValue = <set-?>)
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ FILE fqName:<root> fileName:/genericPropertyRef.kt
|
||||
$this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:additionalText$delegate type:<root>.DVal visibility:private [final,static]' type=<root>.DVal origin=null
|
||||
t: GET_VAR '<this>: <root>.Value<T of <root>.<get-additionalText>> declared in <root>.<get-additionalText>' type=<root>.Value<T of <root>.<get-additionalText>> origin=null
|
||||
p: PROPERTY_REFERENCE 'public final additionalText: kotlin.Int [delegated,val]' field=null getter='public final fun <get-additionalText> <T> (): kotlin.Int declared in <root>' setter=null type=kotlin.reflect.KProperty1<<root>.Value<T of <root>.<get-additionalText>>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
<1>: <none>
|
||||
<1>: T of <root>.<get-additionalText>
|
||||
PROPERTY name:additionalValue visibility:public modality:FINAL [delegated,val]
|
||||
FIELD PROPERTY_DELEGATE name:additionalValue$delegate type:<root>.DVal visibility:private [final,static]
|
||||
EXPRESSION_BODY
|
||||
@@ -95,7 +95,7 @@ FILE fqName:<root> fileName:/genericPropertyRef.kt
|
||||
$this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:additionalValue$delegate type:<root>.DVal visibility:private [final,static]' type=<root>.DVal origin=null
|
||||
t: GET_VAR '<this>: <root>.Value<T of <root>.<get-additionalValue>> declared in <root>.<get-additionalValue>' type=<root>.Value<T of <root>.<get-additionalValue>> origin=null
|
||||
p: PROPERTY_REFERENCE 'public final additionalValue: kotlin.Int [delegated,val]' field=null getter='public final fun <get-additionalValue> <T> (): kotlin.Int declared in <root>' setter=null type=kotlin.reflect.KProperty1<<root>.Value<T of <root>.<get-additionalValue>>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
<1>: <none>
|
||||
<1>: T of <root>.<get-additionalValue>
|
||||
CLASS CLASS name:DVal modality:FINAL visibility:public superTypes:[kotlin.Any]
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.DVal
|
||||
CONSTRUCTOR visibility:public <> (kmember:kotlin.Any) returnType:<root>.DVal [primary]
|
||||
|
||||
@@ -20,13 +20,13 @@ class Value<T : Any?> {
|
||||
val <T : Any?> Value<T>.additionalText: Int /* by */
|
||||
field = DVal(kmember = Value::text)
|
||||
get(): Int {
|
||||
return #additionalText$delegate.getValue(t = <this>, p = ::additionalText/*</* null */>()*/)
|
||||
return #additionalText$delegate.getValue(t = <this>, p = ::additionalText/*<T>()*/)
|
||||
}
|
||||
|
||||
val <T : Any?> Value<T>.additionalValue: Int /* by */
|
||||
field = DVal(kmember = Value::value)
|
||||
get(): Int {
|
||||
return #additionalValue$delegate.getValue(t = <this>, p = ::additionalValue/*</* null */>()*/)
|
||||
return #additionalValue$delegate.getValue(t = <this>, p = ::additionalValue/*<T>()*/)
|
||||
}
|
||||
|
||||
class DVal {
|
||||
|
||||
@@ -369,4 +369,4 @@ FILE fqName:<root> fileName:/genericDelegatedDeepProperty.kt
|
||||
$this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:additionalText$delegate type:<root>.additionalText$delegate.<no name provided><T of <root>.<get-additionalText>> visibility:private [final,static]' type=<root>.additionalText$delegate.<no name provided><T of <root>.<get-additionalText>> origin=null
|
||||
t: GET_VAR '<this>: <root>.Value<T of <root>.<get-additionalText>, <root>.CR<T of <root>.<get-additionalText>>> declared in <root>.<get-additionalText>' type=<root>.Value<T of <root>.<get-additionalText>, <root>.CR<T of <root>.<get-additionalText>>> origin=null
|
||||
p: PROPERTY_REFERENCE 'public final additionalText: <root>.P<T of <root>.<get-additionalText>, T of <root>.<get-additionalText>> [delegated,val]' field=null getter='public final fun <get-additionalText> <T> (): <root>.P<T of <root>.<get-additionalText>, T of <root>.<get-additionalText>> declared in <root>' setter=null type=kotlin.reflect.KProperty1<<root>.Value<T of <root>.<get-additionalText>, <root>.CR<T of <root>.<get-additionalText>>>, <root>.P<T of <root>.<get-additionalText>, T of <root>.<get-additionalText>>> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
<1>: <none>
|
||||
<1>: T of <root>.<get-additionalText>
|
||||
|
||||
@@ -141,5 +141,5 @@ val <T : Any?> Value<T, CR<T>>.additionalText: P<T, T> /* by */
|
||||
<no name provided>()
|
||||
}
|
||||
get(): P<T, T> {
|
||||
return #additionalText$delegate.getValue(t = <this>, p = ::additionalText/*</* null */>()*/)
|
||||
return #additionalText$delegate.getValue(t = <this>, p = ::additionalText/*<T>()*/)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user