From d4ae9924175235630262f1ee29e38d09e1c372fe Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 30 Mar 2020 11:49:04 +0300 Subject: [PATCH] [FIR] Apply type arguments for callable references --- .../generators/CallAndReferenceGenerator.kt | 24 +++++++++---------- ...rCallCompletionResultsWriterTransformer.kt | 3 +++ .../function/argumentTypes.kt | 1 - ...ericCallableReferencesWithNullableTypes.kt | 1 - .../functionFromStdlibMultiFileFacade.kt | 1 - .../callableReferences/typeArguments.fir.txt | 3 +++ .../expressions/genericPropertyRef.fir.txt | 3 +++ .../genericDelegatedDeepProperty.fir.txt | 1 + .../genericPropertyReferenceType.fir.txt | 2 ++ 9 files changed, 23 insertions(+), 16 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 3408529e0ee..ecba82e7912 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -52,26 +52,19 @@ internal class CallAndReferenceGenerator( when (symbol) { is IrPropertySymbol -> { IrPropertyReferenceImpl( - startOffset, endOffset, type, symbol, 0, + startOffset, endOffset, type, symbol, + typeArgumentsCount = symbol.owner.getter?.typeParameters?.size ?: 0, symbol.owner.backingField?.symbol, symbol.owner.getter?.symbol, symbol.owner.setter?.symbol - ).apply { - if (callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) { - applyReceivers(callableReferenceAccess) - } - } + ) } is IrFunctionSymbol -> { IrFunctionReferenceImpl( startOffset, endOffset, type, symbol, - typeArgumentsCount = 0, + typeArgumentsCount = symbol.owner.typeParameters.size, reflectionTarget = symbol - ).apply { - if (callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) { - applyReceivers(callableReferenceAccess) - } - } + ) } else -> { IrErrorCallExpressionImpl( @@ -79,6 +72,11 @@ internal class CallAndReferenceGenerator( ) } } + }.apply { + applyTypeArguments(callableReferenceAccess) + if (callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) { + applyReceivers(callableReferenceAccess) + } } } @@ -300,7 +298,7 @@ internal class CallAndReferenceGenerator( private fun IrExpression.applyTypeArguments(access: FirQualifiedAccess): IrExpression { return when (this) { - is IrCallWithIndexedArgumentsBase -> { + is IrMemberAccessExpressionBase -> { val argumentsCount = access.typeArguments.size if (argumentsCount <= typeArgumentsCount) { apply { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 5bd67a1ebd8..9926c2c5fbd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -106,6 +106,8 @@ class FirCallCompletionResultsWriterTransformer( ): CompositeTransformResult { val calleeReference = callableReferenceAccess.calleeReference as? FirNamedReferenceWithCandidate ?: return callableReferenceAccess.compose() + val subCandidate = calleeReference.candidate + val typeArguments = computeTypeArguments(callableReferenceAccess, subCandidate) val typeRef = callableReferenceAccess.typeRef as FirResolvedTypeRef @@ -114,6 +116,7 @@ class FirCallCompletionResultsWriterTransformer( val resultType = typeRef.withReplacedConeType(finalType) callableReferenceAccess.replaceTypeRef(resultType) + callableReferenceAccess.replaceTypeArguments(typeArguments) return callableReferenceAccess.transformCalleeReference( StoreCalleeReference, diff --git a/compiler/testData/codegen/box/callableReference/function/argumentTypes.kt b/compiler/testData/codegen/box/callableReference/function/argumentTypes.kt index 1a1413ac420..6046e7f015a 100644 --- a/compiler/testData/codegen/box/callableReference/function/argumentTypes.kt +++ b/compiler/testData/codegen/box/callableReference/function/argumentTypes.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR inline fun id(x: TT): TT = x inline fun String.extId(x: TT): String = this diff --git a/compiler/testData/codegen/box/callableReference/function/genericCallableReferencesWithNullableTypes.kt b/compiler/testData/codegen/box/callableReference/function/genericCallableReferencesWithNullableTypes.kt index 829c5b6061f..59896ac53f8 100644 --- a/compiler/testData/codegen/box/callableReference/function/genericCallableReferencesWithNullableTypes.kt +++ b/compiler/testData/codegen/box/callableReference/function/genericCallableReferencesWithNullableTypes.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/methodsFromAny/functionFromStdlibMultiFileFacade.kt b/compiler/testData/codegen/box/reflection/methodsFromAny/functionFromStdlibMultiFileFacade.kt index 00cadd3d4ec..b18ff968e4d 100644 --- a/compiler/testData/codegen/box/reflection/methodsFromAny/functionFromStdlibMultiFileFacade.kt +++ b/compiler/testData/codegen/box/reflection/methodsFromAny/functionFromStdlibMultiFileFacade.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND: JS_IR // KT-12630 KotlinReflectionInternalError on referencing some functions from stdlib diff --git a/compiler/testData/ir/irText/expressions/callableReferences/typeArguments.fir.txt b/compiler/testData/ir/irText/expressions/callableReferences/typeArguments.fir.txt index aa3972aa2d7..6b9d21a1ef0 100644 --- a/compiler/testData/ir/irText/expressions/callableReferences/typeArguments.fir.txt +++ b/compiler/testData/ir/irText/expressions/callableReferences/typeArguments.fir.txt @@ -35,6 +35,7 @@ FILE fqName: fileName:/typeArguments.kt FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.Function1 visibility:private [final,static] EXPRESSION_BODY FUNCTION_REFERENCE 'public final fun topLevel1 (x: T of .topLevel1): kotlin.Unit [inline] declared in ' type=kotlin.reflect.KFunction1 origin=null reflectionTarget= + : kotlin.Int FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Function1 correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL [val] BLOCK_BODY @@ -44,6 +45,7 @@ FILE fqName: fileName:/typeArguments.kt FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.Function1, kotlin.Unit> visibility:private [final,static] EXPRESSION_BODY FUNCTION_REFERENCE 'public final fun topLevel2 (x: kotlin.collections.List.topLevel2>): kotlin.Unit [inline] declared in ' type=kotlin.reflect.KFunction1, kotlin.Unit> origin=null reflectionTarget= + : kotlin.String FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Function1, kotlin.Unit> correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val] BLOCK_BODY @@ -53,6 +55,7 @@ FILE fqName: fileName:/typeArguments.kt FIELD PROPERTY_BACKING_FIELD name:test3 type:kotlin.Function1 visibility:private [final,static] EXPRESSION_BODY FUNCTION_REFERENCE 'public final fun objectMember (x: T of .Host.objectMember): kotlin.Unit [inline] declared in .Host' type=kotlin.reflect.KFunction1 origin=null reflectionTarget= + : kotlin.Int $this: GET_OBJECT 'CLASS OBJECT name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]' type=.Host FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Function1 correspondingProperty: PROPERTY name:test3 visibility:public modality:FINAL [val] diff --git a/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt b/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt index 8bd43bec116..a3950860bd8 100644 --- a/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt +++ b/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt @@ -79,6 +79,7 @@ FILE fqName: fileName:/genericPropertyRef.kt $this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:additionalText$delegate type:.DVal visibility:private [final,static]' type=.DVal origin=GET_PROPERTY t: ERROR_CALL 'Unresolved reference: this@R|/additionalText|' type=.Value.> p: PROPERTY_REFERENCE 'public final additionalText: kotlin.Int [delegated,val]' field='FIELD PROPERTY_DELEGATE name:additionalText$delegate type:.DVal visibility:private [final,static]' getter='public final fun (): kotlin.Int declared in ' setter=null type=kotlin.reflect.KProperty<*> origin=null + <1>: PROPERTY name:additionalValue visibility:public modality:FINAL [delegated,val] FIELD PROPERTY_DELEGATE name:additionalValue$delegate type:.DVal visibility:private [final,static] EXPRESSION_BODY @@ -94,6 +95,7 @@ FILE fqName: fileName:/genericPropertyRef.kt $this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:additionalValue$delegate type:.DVal visibility:private [final,static]' type=.DVal origin=GET_PROPERTY t: ERROR_CALL 'Unresolved reference: this@R|/additionalValue|' type=.Value.> p: PROPERTY_REFERENCE 'public final additionalValue: kotlin.Int [delegated,val]' field='FIELD PROPERTY_DELEGATE name:additionalValue$delegate type:.DVal visibility:private [final,static]' getter='public final fun (): kotlin.Int declared in ' setter=null type=kotlin.reflect.KProperty<*> origin=null + <1>: CLASS CLASS name:DVal modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.DVal CONSTRUCTOR visibility:public <> (kmember:kotlin.Any) returnType:.DVal [primary] @@ -184,6 +186,7 @@ FILE fqName: fileName:/genericPropertyRef.kt FIELD PROPERTY_BACKING_FIELD name:barRef type:kotlin.reflect.KMutableProperty1 visibility:private [final,static] EXPRESSION_BODY PROPERTY_REFERENCE 'public final bar: T of . [var]' field=null getter='public final fun (): T of . declared in ' setter='public final fun (value: T of .): kotlin.Unit declared in ' type=kotlin.reflect.KMutableProperty1 origin=null + <1>: kotlin.String? FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KMutableProperty1 correspondingProperty: PROPERTY name:barRef visibility:public modality:FINAL [val] BLOCK_BODY diff --git a/compiler/testData/ir/irText/types/genericDelegatedDeepProperty.fir.txt b/compiler/testData/ir/irText/types/genericDelegatedDeepProperty.fir.txt index 587ed20c45a..fa324ea5057 100644 --- a/compiler/testData/ir/irText/types/genericDelegatedDeepProperty.fir.txt +++ b/compiler/testData/ir/irText/types/genericDelegatedDeepProperty.fir.txt @@ -320,3 +320,4 @@ FILE fqName: fileName:/genericDelegatedDeepProperty.kt $this: GET_FIELD 'FIELD PROPERTY_DELEGATE name:additionalText$delegate type:.additionalText$delegate. visibility:private [final,static]' type=.additionalText$delegate. origin=GET_PROPERTY t: ERROR_CALL 'Unresolved reference: this@R|/additionalText|' type=.Value., .CR.>> p: PROPERTY_REFERENCE 'public final additionalText: .P., T of .> [delegated,val]' field='FIELD PROPERTY_DELEGATE name:additionalText$delegate type:.additionalText$delegate. visibility:private [final,static]' getter='public final fun (): .P., T of .> declared in ' setter=null type=kotlin.reflect.KProperty<*> origin=null + <1>: diff --git a/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt b/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt index b8c53dc877e..8e4864169dd 100644 --- a/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt +++ b/compiler/testData/ir/irText/types/genericPropertyReferenceType.fir.txt @@ -64,6 +64,7 @@ FILE fqName: fileName:/genericPropertyReferenceType.kt BLOCK_BODY CALL 'public final fun use (p: kotlin.reflect.KMutableProperty): kotlin.Unit declared in ' type=kotlin.Unit origin=null p: PROPERTY_REFERENCE 'public final y: T of . [var]' field=null getter='public final fun (): T of . declared in ' setter='public final fun (v: T of .): kotlin.Unit declared in ' type=kotlin.reflect.KMutableProperty0 origin=null + <1>: kotlin.String $receiver: CONSTRUCTOR_CALL 'public constructor (x: T of .C) [primary] declared in .C' type=.C origin=null : kotlin.String x: CONST String type=kotlin.String value="abc" @@ -74,5 +75,6 @@ FILE fqName: fileName:/genericPropertyReferenceType.kt GET_VAR 'a: kotlin.Any declared in .test2' type=kotlin.Any origin=null CALL 'public final fun use (p: kotlin.reflect.KMutableProperty): kotlin.Unit declared in ' type=kotlin.Unit origin=null p: PROPERTY_REFERENCE 'public final y: T of . [var]' field=null getter='public final fun (): T of . declared in ' setter='public final fun (v: T of .): kotlin.Unit declared in ' type=kotlin.reflect.KMutableProperty0 origin=null + <1>: kotlin.String $receiver: TYPE_OP type=.C origin=IMPLICIT_CAST typeOperand=.C GET_VAR 'a: kotlin.Any declared in .test2' type=kotlin.Any origin=null