Skip to content

Commit 6c8830d

Browse files
cypressiousliamoberg
authored andcommitted
[FIR] Stop resolving to context receivers
#KT-72994
1 parent 190b2fc commit 6c8830d

File tree

32 files changed

+86
-569
lines changed

32 files changed

+86
-569
lines changed

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirCompilerFacility.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,14 +1291,7 @@ internal class KaFirCompilerFacility(
12911291
val id = when (calleeReference) {
12921292
is FirThisReference -> when (val boundSymbol = calleeReference.boundSymbol) {
12931293
is FirClassSymbol -> CodeFragmentCapturedId(boundSymbol)
1294-
is FirReceiverParameterSymbol, is FirValueParameterSymbol -> {
1295-
when (val referencedSymbol = calleeReference.referencedMemberSymbol) {
1296-
// Specific (deprecated) case for a class context receiver
1297-
// TODO: remove with KT-72994
1298-
is FirClassSymbol -> CodeFragmentCapturedId(referencedSymbol)
1299-
else -> CodeFragmentCapturedId(boundSymbol)
1300-
}
1301-
}
1294+
is FirReceiverParameterSymbol -> CodeFragmentCapturedId(boundSymbol)
13021295
is FirTypeParameterSymbol, is FirTypeAliasSymbol -> errorWithFirSpecificEntries(
13031296
message = "Unexpected FirThisOwnerSymbol ${calleeReference::class.simpleName}", fir = boundSymbol.fir
13041297
)

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirCompletionCandidateChecker.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,6 @@ private class KaFirCompletionExtensionCandidateChecker(
135135

136136
return buildList {
137137
addAll(towerDataContext.implicitValueStorage.implicitReceivers)
138-
for (towerDataElement in towerDataContext.towerDataElements) {
139-
addAll(towerDataElement.contextReceiverGroup.orEmpty())
140-
}
141138
}
142139
}
143140

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirResolver.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,6 @@ internal class KaFirResolver(
11091109
is FirReceiverParameterSymbol -> firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(firSymbol)
11101110
?: return null
11111111

1112-
is FirValueParameterSymbol -> firSymbolBuilder.variableBuilder.buildParameterSymbol(firSymbol)
11131112
is FirTypeAliasSymbol, is FirTypeParameterSymbol -> errorWithFirSpecificEntries(
11141113
message = "Unexpected ${FirThisOwnerSymbol::class.simpleName}: ${firSymbol::class.simpleName}",
11151114
fir = firSymbol.fir

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirScopeProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ internal class KaFirScopeProvider(
306306

307307
val implicitValues = towerDataElementsIndexed.flatMap { (index, towerDataElement) ->
308308
buildList {
309-
val receivers = listOfNotNull(towerDataElement.implicitReceiver) + towerDataElement.contextReceiverGroup.orEmpty()
310-
for (receiver in receivers) {
309+
val receiver = towerDataElement.implicitReceiver
310+
if (receiver != null) {
311311
val receiverValue = KaBaseScopeImplicitReceiverValue(
312312
backingType = firSymbolBuilder.typeBuilder.buildKtType(receiver.type),
313313
ownerSymbol = firSymbolBuilder.buildSymbol(receiver.referencedMemberSymbol),

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ internal object FirReferenceResolveHelper {
123123
listOfNotNull(
124124
when (boundSymbol) {
125125
is FirReceiverParameterSymbol -> boundSymbol.containingDeclarationSymbol
126-
is FirValueParameterSymbol -> boundSymbol.containingDeclarationSymbol
127126
else -> boundSymbol as FirBasedSymbol<*>?
128127
}?.buildSymbol(symbolBuilder)
129128
)

analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -183,52 +183,21 @@ private class CodeFragmentCapturedValueVisitor(
183183
is FirClassSymbol<*> -> {
184184
registerClassSymbolIfNotObject(symbol)
185185
}
186-
// TODO(KT-72994) remove branch when context receivers are removed
187-
is FirValueParameterSymbol -> {
188-
val valueParameter = symbol.fir
189-
val referencedSymbol = element.referencedMemberSymbol
190-
if (referencedSymbol is FirClassSymbol) {
191-
// Specific (deprecated) case for a class context receiver
192-
registerClassSymbolIfNotObject(referencedSymbol)
193-
} else {
194-
val labelName = valueParameter.name
195-
if (labelName != SpecialNames.UNDERSCORE_FOR_UNUSED_VAR) {
196-
val isCrossingInlineBounds = isCrossingInlineBounds(element, symbol)
197-
val index = when (val containingDeclaration = symbol.containingDeclarationSymbol.fir) {
198-
is FirCallableDeclaration -> containingDeclaration.contextParameters.indexOf(
199-
valueParameter
200-
)
201-
is FirRegularClass -> containingDeclaration.contextParameters.indexOf(valueParameter)
202-
else -> errorWithFirSpecificEntries(
203-
message = "Unexpected containing declaration ${containingDeclaration::class.simpleName}",
204-
fir = containingDeclaration
205-
)
206-
}
207-
val capturedValue = CodeFragmentCapturedValue
208-
.ContextReceiver(index, labelName, isCrossingInlineBounds, depth)
209-
register(
210-
CodeFragmentCapturedSymbol(
211-
capturedValue,
212-
symbol,
213-
valueParameter.returnTypeRef
214-
)
215-
)
216-
}
186+
is FirReceiverParameterSymbol -> {
187+
if (symbol.captureValueInAnalyze) {
188+
val receiverParameter = symbol.fir
189+
val labelName = element.labelName
190+
?: (receiverParameter.containingDeclarationSymbol as? FirAnonymousFunctionSymbol)?.label?.name
191+
?: (receiverParameter.containingDeclarationSymbol as FirCallableSymbol).name.asString()
192+
193+
val typeRef = receiverParameter.typeRef
194+
val isCrossingInlineBounds = isCrossingInlineBounds(element, symbol)
195+
val capturedValue = CodeFragmentCapturedValue.ExtensionReceiver(labelName, isCrossingInlineBounds, depth)
196+
register(
197+
CodeFragmentCapturedSymbol(capturedValue, receiverParameter.symbol, typeRef)
198+
)
217199
}
218200
}
219-
is FirReceiverParameterSymbol if symbol.captureValueInAnalyze -> {
220-
val receiverParameter = symbol.fir
221-
val labelName = element.labelName
222-
?: (receiverParameter.containingDeclarationSymbol as? FirAnonymousFunctionSymbol)?.label?.name
223-
?: (receiverParameter.containingDeclarationSymbol as FirCallableSymbol).name.asString()
224-
225-
val typeRef = receiverParameter.typeRef
226-
val isCrossingInlineBounds = isCrossingInlineBounds(element, symbol)
227-
val capturedValue = CodeFragmentCapturedValue.ExtensionReceiver(labelName, isCrossingInlineBounds, depth)
228-
register(
229-
CodeFragmentCapturedSymbol(capturedValue, receiverParameter.symbol, typeRef)
230-
)
231-
}
232201
is FirTypeAliasSymbol, is FirTypeParameterSymbol -> errorWithFirSpecificEntries(
233202
message = "Unexpected FirThisOwnerSymbol ${symbol::class.simpleName}", fir = symbol.fir
234203
)

analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ import org.jetbrains.kotlin.psi.KtDeclaration
6060
import org.jetbrains.kotlin.psi.KtElement
6161
import org.jetbrains.kotlin.psi.KtFile
6262
import org.jetbrains.kotlin.psi.KtProperty
63-
import org.jetbrains.kotlin.psi.KtStatementExpression
64-
import org.jetbrains.kotlin.psi.KtVariableDeclaration
6563
import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment
6664
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
6765
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
@@ -823,7 +821,6 @@ private class LLFirBodyTargetResolver(target: LLFirResolveTarget) : LLFirAbstrac
823821
): FirTowerDataElement = FirTowerDataElement(
824822
scope?.withReplacedSessionOrNull(session, scopeSession) ?: scope,
825823
implicitReceiver?.withReplacedSessionOrNull(session, scopeSession),
826-
contextReceiverGroup?.map { it.withReplacedSessionOrNull(session, scopeSession) },
827824
contextParameterGroup,
828825
isLocal,
829826
staticScopeOwnerSymbol

analysis/low-level-api-fir/testFixtures/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractContextCollectorTest.kt

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,6 @@ internal object ElementContextRenderer {
116116
}
117117
}
118118

119-
towerDataElement.contextReceiverGroup?.takeIf { it.isNotEmpty() }?.let { contextReceiverValues ->
120-
appendBlock("Context receivers:") {
121-
for (contextReceiverValue in contextReceiverValues) {
122-
appendSymbol(contextReceiverValue.boundSymbol).appendLine()
123-
124-
appendBlock {
125-
append("Type: ").appendType(contextReceiverValue.type).appendLine()
126-
contextReceiverValue.labelName?.let { labelName ->
127-
append("Label: ").appendLine(labelName)
128-
}
129-
}
130-
}
131-
}
132-
}
133-
134119
towerDataElement.contextParameterGroup?.takeIf { it.isNotEmpty() }?.let { contextParameterValues ->
135120
appendBlock("Context parameters:") {
136121
for (contextParameterValue in contextParameterValues) {

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package org.jetbrains.kotlin.fir.backend
77

8-
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
98
import org.jetbrains.kotlin.descriptors.Visibilities
109
import org.jetbrains.kotlin.descriptors.Visibility
1110
import org.jetbrains.kotlin.fir.backend.generators.isExternalParent
@@ -19,18 +18,15 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
1918
import org.jetbrains.kotlin.fir.resolve.getContainingClassSymbol
2019
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
2120
import org.jetbrains.kotlin.fir.resolve.toClassSymbol
22-
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
23-
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
24-
import org.jetbrains.kotlin.fir.symbols.impl.FirReplSnippetSymbol
25-
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
26-
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
21+
import org.jetbrains.kotlin.fir.symbols.impl.*
2722
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
2823
import org.jetbrains.kotlin.fir.types.ConeClassLikeLookupTag
29-
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
3024
import org.jetbrains.kotlin.ir.declarations.*
31-
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
3225
import org.jetbrains.kotlin.ir.symbols.*
33-
import org.jetbrains.kotlin.ir.symbols.impl.*
26+
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
27+
import org.jetbrains.kotlin.ir.symbols.impl.IrEnumEntrySymbolImpl
28+
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeAliasSymbolImpl
29+
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
3430
import org.jetbrains.kotlin.name.Name
3531
import org.jetbrains.kotlin.name.SpecialNames
3632
import org.jetbrains.kotlin.utils.addToStdlib.runIf
@@ -284,30 +280,6 @@ class Fir2IrClassifierStorage(
284280
return getIrClass(lookupTag)?.symbol
285281
}
286282

287-
// TODO(KT-72994) remove when context receivers are removed
288-
fun getFieldsWithContextReceiversForClass(irClass: IrClass, klass: FirClass): List<IrField> {
289-
if (klass !is FirRegularClass || klass.contextParameters.isEmpty()) return emptyList()
290-
291-
return fieldsForContextReceivers.getOrPut(irClass) {
292-
klass.contextParameters.withIndex().map { (index, contextReceiver) ->
293-
IrFactoryImpl.createField(
294-
startOffset = UNDEFINED_OFFSET,
295-
endOffset = UNDEFINED_OFFSET,
296-
origin = IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
297-
name = Name.identifier("contextReceiverField$index"),
298-
visibility = DescriptorVisibilities.PRIVATE,
299-
symbol = IrFieldSymbolImpl(),
300-
type = contextReceiver.returnTypeRef.toIrType(),
301-
isFinal = true,
302-
isStatic = false,
303-
isExternal = false,
304-
).also {
305-
it.parent = irClass
306-
}
307-
}
308-
}
309-
}
310-
311283
fun getIrClassForNotFoundClass(classLikeLookupTag: ConeClassLikeLookupTag): IrClass {
312284
return notFoundClassCache.getOrPut(classLikeLookupTag) {
313285
classifiersGenerator.createIrClassForNotFoundClass(classLikeLookupTag)

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,6 @@ class Fir2IrConverter(
237237
}
238238
}
239239

240-
// `irClass` is a source class and definitely is not a lazy class
241-
@OptIn(UnsafeDuringIrConstructionAPI::class)
242-
irClass.declarations.addAll(classifierStorage.getFieldsWithContextReceiversForClass(irClass, klass))
243-
244240
val irConstructor = klass.primaryConstructorIfAny(session)?.let {
245241
declarationStorage.createAndCacheIrConstructor(it.fir, { irClass }, isLocal = klass.isLocal)
246242
}

0 commit comments

Comments
 (0)