From d53354057a57ef1d33c8e308672527bd6c5385f2 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 4 Jan 2021 13:25:03 -0800 Subject: [PATCH] FIR: build functional type for SAM with receiver properly --- .../resolve/inference/extensionCallableReferences.fir.txt | 2 +- .../resolve/references/referenceToExtension.fir.txt | 6 +++--- .../moreSpecificAmbiguousExtensions.fir.txt | 2 +- .../src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt | 1 + .../src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt | 8 +++++++- .../src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt | 3 ++- .../jetbrains/kotlin/fir/types/ConeInferenceContext.kt | 2 +- .../codegen/box/funInterface/funInterfaceWithReceiver.kt | 1 - 8 files changed, 16 insertions(+), 9 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.fir.txt b/compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.fir.txt index 3482c040eaa..822511f8efd 100644 --- a/compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.fir.txt @@ -27,5 +27,5 @@ FILE: extensionCallableReferences.kt } public final fun test_1(): R|kotlin/Unit| { lval extensionValRef: R|kotlin/reflect/KProperty1| = Q|B|::R|/extensionVal| - lval extensionFunRef: R|kotlin/reflect/KFunction1| = Q|B|::R|/extensionFun| + lval extensionFunRef: R|@ExtensionFunctionType kotlin/reflect/KFunction1| = Q|B|::R|/extensionFun| } diff --git a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt index 7245b85dce5..4f827884899 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt @@ -36,7 +36,7 @@ FILE: referenceToExtension.kt public final fun test_1(): R|kotlin/Unit| { lval memberValRef: R|kotlin/reflect/KProperty1, GenericTest.A>| = Q|GenericTest.B|::R|SubstitutionOverride|>| - lval memberFunRef: R|kotlin/reflect/KFunction1, GenericTest.A>| = Q|GenericTest.B|::R|SubstitutionOverride|>| + lval memberFunRef: R|@ExtensionFunctionType kotlin/reflect/KFunction1, GenericTest.A>| = Q|GenericTest.B|::R|SubstitutionOverride|>| } public final fun test_2(): R|kotlin/Unit| { @@ -82,12 +82,12 @@ FILE: referenceToExtension.kt public final fun test_1(): R|kotlin/Unit| { lval extensionValRef: R|kotlin/reflect/KProperty1| = Q|NoGenericTest.B|::R|/NoGenericTest.extensionVal| - lval extensionFunRef: R|kotlin/reflect/KFunction1| = Q|NoGenericTest.B|::R|/NoGenericTest.extensionFun| + lval extensionFunRef: R|@ExtensionFunctionType kotlin/reflect/KFunction1| = Q|NoGenericTest.B|::R|/NoGenericTest.extensionFun| } public final fun test_2(): R|kotlin/Unit| { lval memberValRef: R|kotlin/reflect/KProperty1| = Q|NoGenericTest.B|::R|/NoGenericTest.B.memberVal| - lval memberFunRef: R|kotlin/reflect/KFunction1| = Q|NoGenericTest.B|::R|/NoGenericTest.B.memberFun| + lval memberFunRef: R|@ExtensionFunctionType kotlin/reflect/KFunction1| = Q|NoGenericTest.B|::R|/NoGenericTest.B.memberFun| } } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt index 8bcf37726bb..8365898a4b8 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt @@ -8,7 +8,7 @@ FILE: moreSpecificAmbiguousExtensions.kt public final fun R|IB|.extFun(x: R|IA|): R|kotlin/Unit| { } public final fun test(): R|kotlin/Unit| { - lval extFun1: R|kotlin/reflect/KFunction2| = Q|IA|::R|/extFun| + lval extFun1: R|@ExtensionFunctionType kotlin/reflect/KFunction2| = Q|IA|::R|/extFun| lval extFun2: = Q|IB|::# } public final fun testWithExpectedType(): R|kotlin/Unit| { diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt index c8a0341d8d1..378fb5d1b76 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeAttributes.kt @@ -34,6 +34,7 @@ class ConeAttributes private constructor(attributes: List>) : A } val Empty: ConeAttributes = ConeAttributes(emptyList()) + val WithExtensionFunctionType: ConeAttributes = ConeAttributes(listOf(CompilerConeAttributes.ExtensionFunctionType)) internal val WithFlexibleNullability: ConeAttributes = ConeAttributes(listOf(CompilerConeAttributes.FlexibleNullability)) fun create(attributes: List>): ConeAttributes { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index fe2be9fac2b..eb7923544b8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -78,7 +78,13 @@ fun createFunctionalType( } val functionalTypeId = ClassId(kind.packageFqName, kind.numberedClassName(receiverAndParameterTypes.size - 1)) - return ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(functionalTypeId), receiverAndParameterTypes.toTypedArray(), isNullable = false) + val attributes = if (receiverType != null) ConeAttributes.WithExtensionFunctionType else ConeAttributes.Empty + return ConeClassLikeTypeImpl( + ConeClassLikeLookupTagImpl(functionalTypeId), + receiverAndParameterTypes.toTypedArray(), + isNullable = false, + attributes = attributes + ) } fun createKPropertyType( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index ed9ea28cca3..d53b24c2d44 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -346,7 +346,8 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB } return createFunctionalType( - parameterTypes, receiverType = null, + parameterTypes, + receiverType = receiverTypeRef?.coneType, rawReturnType = returnTypeRef.coneType, isSuspend = this.isSuspend ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt index 71ab78fc4c2..8b24fb9e583 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt @@ -61,7 +61,7 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo isExtensionFunction: Boolean ): SimpleTypeMarker { val attributes = if (isExtensionFunction) // TODO: assert correct type constructor - ConeAttributes.create(listOf(CompilerConeAttributes.ExtensionFunctionType)) + ConeAttributes.WithExtensionFunctionType else ConeAttributes.Empty @Suppress("UNCHECKED_CAST") return when (constructor) { diff --git a/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt b/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt index 80d36d9821f..5bcc2a5cb15 100644 --- a/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt +++ b/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt @@ -1,6 +1,5 @@ // DONT_TARGET_EXACT_BACKEND: WASM // WASM_MUTE_REASON: SAM_CONVERSIONS -// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND: JS_IR_ES6 fun interface FunWithReceiver {