Skip to content

Commit

Permalink
[FIR] Don't replace context parameters of anonymous functions in comp…
Browse files Browse the repository at this point in the history
…letion

Unlike lambdas, anonymous functions declare their context parameters
and so they don't need to be replaced.
Replacing them led to their names becoming `_` and also their source
becoming a fake source unnecessarily.

#KT-75009 Fixed
  • Loading branch information
cypressious authored and Space Team committed Feb 12, 2025
1 parent 2a38fc4 commit f4a1aa6
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ FILE: contextualAnonymousFunction.kt
R|<local>/a|
}

R|/runWithA|(context(<unused var>: R|kotlin/String|) fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
<Unresolved name: a>#
R|/runWithA|(context(a: R|kotlin/String|) fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
R|<local>/a|
}
)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// RUN_PIPELINE_TILL: FRONTEND
// RUN_PIPELINE_TILL: BACKEND
// LANGUAGE: +ContextParameters

annotation class Ann
Expand All @@ -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 () { <!UNRESOLVED_REFERENCE!>a<!> })
runWithA(context(a: String) fun () { a })
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit f4a1aa6

Please # to comment.