diff --git a/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.fir.txt b/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.fir.txt index 9f5d5476d13e7..86500f970a3ea 100644 --- a/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.fir.txt @@ -32,8 +32,8 @@ FILE: contextualAnonymousFunction.kt R|/a| } - R|/runWithA|(context(: R|kotlin/String|) fun (): R|kotlin/Unit| { - # + R|/runWithA|(context(a: R|kotlin/String|) fun (): R|kotlin/Unit| { + R|/a| } ) } diff --git a/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.kt b/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.kt index a82e8c706946c..daa080861b075 100644 --- a/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.kt +++ b/compiler/fir/analysis-tests/testData/resolve/contextParameters/declarationAndUsages/contextualAnonymousFunction.kt @@ -1,4 +1,4 @@ -// RUN_PIPELINE_TILL: FRONTEND +// RUN_PIPELINE_TILL: BACKEND // LANGUAGE: +ContextParameters annotation class Ann @@ -13,5 +13,5 @@ val t2 = @Ann context(a: A) fun () { a } fun foo() { val t = context(a: A) fun () { a } val t2 = @Ann context(a: A) fun () { a } - runWithA(context(a: String) fun () { a }) + runWithA(context(a: String) fun () { a }) } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index f45f07fca9923..097b0392cd0dd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -382,27 +382,43 @@ class FirCallCompleter( } if (contextParameters.isNotEmpty()) { - lambda.replaceContextParameters( - contextParameters.map { contextParameterType -> - buildValueParameter { - resolvePhase = FirResolvePhase.BODY_RESOLVE - source = lambdaAtom.anonymousFunction.source?.fakeElement(KtFakeSourceElementKind.LambdaContextParameter) - containingDeclarationSymbol = lambda.symbol - moduleData = session.moduleData - origin = FirDeclarationOrigin.Source - name = SpecialNames.UNDERSCORE_FOR_UNUSED_VAR - symbol = FirValueParameterSymbol(name) - returnTypeRef = contextParameterType - .approximateLambdaInputType(symbol, withPCLASession) - .toFirResolvedTypeRef(lambdaAtom.anonymousFunction.source?.fakeElement(KtFakeSourceElementKind.LambdaContextParameter)) - valueParameterKind = if (session.languageVersionSettings.supportsFeature(LanguageFeature.ContextParameters)) { - FirValueParameterKind.ContextParameter - } else { - FirValueParameterKind.LegacyContextReceiver + if (lambda.isLambda) { + lambda.replaceContextParameters( + contextParameters.map { contextParameterType -> + buildValueParameter { + resolvePhase = FirResolvePhase.BODY_RESOLVE + source = lambdaAtom.anonymousFunction.source?.fakeElement(KtFakeSourceElementKind.LambdaContextParameter) + containingDeclarationSymbol = lambda.symbol + moduleData = session.moduleData + origin = FirDeclarationOrigin.Source + name = SpecialNames.UNDERSCORE_FOR_UNUSED_VAR + symbol = FirValueParameterSymbol(name) + returnTypeRef = contextParameterType + .approximateLambdaInputType(symbol, withPCLASession) + .toFirResolvedTypeRef(lambdaAtom.anonymousFunction.source?.fakeElement(KtFakeSourceElementKind.LambdaContextParameter)) + valueParameterKind = + if (session.languageVersionSettings.supportsFeature(LanguageFeature.ContextParameters)) { + FirValueParameterKind.ContextParameter + } else { + FirValueParameterKind.LegacyContextReceiver + } } } + ) + } else { + check(lambda.contextParameters.size == contextParameters.size) + lambda.contextParameters.forEachIndexed { index, parameter -> + val contextParameterType = contextParameters[index] + parameter.replaceReturnTypeRef( + contextParameterType + .approximateLambdaInputType(parameter.symbol, withPCLASession) + .toFirResolvedTypeRef( + parameter.returnTypeRef.source + ?: parameter.source?.fakeElement(KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter) + ) + ) } - ) + } } val lookupTracker = session.lookupTracker