diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index 25eb9704016..a838220f52e 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -265,6 +265,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { c.annotationDeserializer.loadPropertyGetterAnnotations( c.containerSource, proto, local.nameResolver, local.typeTable, getterFlags ) + containingClassForStaticMemberAttr = c.dispatchReceiver?.lookupTag } } @@ -321,6 +322,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { c.annotationDeserializer.loadPropertySetterAnnotations( c.containerSource, proto, local.nameResolver, local.typeTable, setterFlags ) + containingClassForStaticMemberAttr = c.dispatchReceiver?.lookupTag } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index dee165ddc0b..d39e7bde2fd 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -519,7 +519,8 @@ class DeclarationsConverter( baseModuleData, callableIdForName(it.firValueParameter.name), classWrapper.hasExpect(), - currentDispatchReceiverType() + currentDispatchReceiverType(), + context ) } addDeclarations(properties) @@ -1106,7 +1107,8 @@ class DeclarationsConverter( classWrapper?.classBuilder?.ownerRegularOrAnonymousObjectSymbol, classWrapper?.classBuilder?.ownerRegularClassTypeParametersCount, isExtension = false, - receiver = receiver + receiver = receiver, + context = context ) } else { this.isLocal = false @@ -1173,6 +1175,7 @@ class DeclarationsConverter( baseModuleData, classWrapper?.classBuilder?.ownerRegularOrAnonymousObjectSymbol, classWrapper?.classBuilder?.ownerRegularClassTypeParametersCount, + context, isExtension = receiverType != null, receiver = receiver ) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index b436702b8d9..949a45bf5f8 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.fir.lightTree.fir import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.builder.Context +import org.jetbrains.kotlin.fir.builder.initContainingClassAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildProperty import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl @@ -35,11 +37,12 @@ class ValueParameter( return isVal || isVar } - fun toFirProperty( + fun toFirProperty( moduleData: FirModuleData, callableId: CallableId, isExpect: Boolean, - currentDispatchReceiver: ConeClassLikeType? + currentDispatchReceiver: ConeClassLikeType?, + context: Context ): FirProperty { val name = this.firValueParameter.name var type = this.firValueParameter.returnTypeRef @@ -83,7 +86,7 @@ class ValueParameter( type.copyWithNewSourceKind(FirFakeSourceElementKind.DefaultAccessor), modifiers.getVisibility(), symbol, - ) + ).also { it.initContainingClassAttr(context) } setter = if (this.isVar) FirDefaultPropertySetter( defaultAccessorSource, moduleData, @@ -91,7 +94,7 @@ class ValueParameter( type.copyWithNewSourceKind(FirFakeSourceElementKind.DefaultAccessor), modifiers.getVisibility(), symbol, - ) else null + ).also { it.initContainingClassAttr(context) } else null }.apply { if (firValueParameter.isVararg) { this.isFromVararg = true diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 1dc724ba851..6e8f598e026 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes import org.jetbrains.kotlin.types.ConstantValueKind +import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.OperatorNameConventions @@ -172,8 +173,12 @@ open class RawFirBuilder( open fun convertProperty( property: KtProperty, ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?, - ownerRegularClassTypeParametersCount: Int?, - ): FirProperty = property.toFirProperty(ownerRegularOrAnonymousObjectSymbol, ownerRegularClassTypeParametersCount) + ownerRegularClassTypeParametersCount: Int? + ): FirProperty = property.toFirProperty( + ownerRegularOrAnonymousObjectSymbol, + ownerRegularClassTypeParametersCount, + context + ) open fun convertValueParameter( valueParameter: KtParameter, @@ -571,7 +576,7 @@ open class RawFirBuilder( type.copyWithNewSourceKind(FirFakeSourceElementKind.DefaultAccessor), visibility, symbol, - ) + ).also { it.initContainingClassAttr() } setter = if (isMutable) FirDefaultPropertySetter( defaultAccessorSource, baseModuleData, @@ -579,7 +584,7 @@ open class RawFirBuilder( type.copyWithNewSourceKind(FirFakeSourceElementKind.DefaultAccessor), visibility, symbol, - ) else null + ).also { it.initContainingClassAttr() } else null extractAnnotationsTo(this) dispatchReceiverType = currentDispatchReceiverType() @@ -1439,9 +1444,10 @@ open class RawFirBuilder( } } - private fun KtProperty.toFirProperty( + private fun KtProperty.toFirProperty( ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?, ownerRegularClassTypeParametersCount: Int?, + context: Context ): FirProperty { val propertyType = typeReference.toFirOrImplicitType() val propertyName = nameAsSafeName @@ -1497,7 +1503,8 @@ open class RawFirBuilder( ownerRegularOrAnonymousObjectSymbol = null, ownerRegularClassTypeParametersCount = null, isExtension = false, - receiver = extractDelegateExpression() + receiver = extractDelegateExpression(), + context = context ) } } else { @@ -1556,6 +1563,7 @@ open class RawFirBuilder( baseModuleData, ownerRegularOrAnonymousObjectSymbol, ownerRegularClassTypeParametersCount, + context, isExtension = receiverTypeReference != null, receiver = extractDelegateExpression() ) @@ -1580,7 +1588,11 @@ open class RawFirBuilder( } override fun visitProperty(property: KtProperty, data: Unit): FirElement { - return property.toFirProperty(ownerRegularOrAnonymousObjectSymbol = null, ownerRegularClassTypeParametersCount = null) + return property.toFirProperty( + ownerRegularOrAnonymousObjectSymbol = null, + ownerRegularClassTypeParametersCount = null, + context = context + ) } override fun visitTypeReference(typeReference: KtTypeReference, data: Unit): FirElement { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 46aef2d1082..d39af63ecc3 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -129,7 +129,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte else -> CallableId(context.packageFqName, context.className, name) } - fun currentDispatchReceiverType(): ConeClassLikeType? = context.dispatchReceiverTypesStack.lastOrNull() + fun currentDispatchReceiverType(): ConeClassLikeType? = currentDispatchReceiverType(context) fun callableIdForClassConstructor() = if (context.className == FqName.ROOT) CallableId(context.packageFqName, Name.special("")) @@ -1183,8 +1183,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } protected fun FirCallableDeclaration.initContainingClassAttr() { - val currentDispatchReceiverType = currentDispatchReceiverType() ?: return - containingClassForStaticMemberAttr = currentDispatchReceiverType.lookupTag + initContainingClassAttr(context) } private fun FirVariable.toQualifiedAccess(): FirQualifiedAccessExpression = buildPropertyAccessExpression { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index d239ec5d98f..1d432184078 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.builder.buildLegacyRawContractDescription +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.builder.* @@ -29,6 +30,7 @@ import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference import org.jetbrains.kotlin.fir.symbols.constructStarProjectedType import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeStarProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef @@ -333,11 +335,12 @@ val FirClassBuilder.ownerRegularOrAnonymousObjectSymbol val FirClassBuilder.ownerRegularClassTypeParametersCount get() = if (this is FirRegularClassBuilder) typeParameters.size else null -fun FirPropertyBuilder.generateAccessorsByDelegate( +fun FirPropertyBuilder.generateAccessorsByDelegate( delegateBuilder: FirWrappedDelegateExpressionBuilder?, moduleData: FirModuleData, ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?, ownerRegularClassTypeParametersCount: Int?, + context: Context, isExtension: Boolean, receiver: FirExpression? ) { @@ -466,6 +469,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate( propertySymbol = this@generateAccessorsByDelegate.symbol }.also { returnTarget.bind(it) + it.initContainingClassAttr(context) } } if (isVar && (setter == null || setter is FirDefaultPropertyAccessor)) { @@ -518,6 +522,8 @@ fun FirPropertyBuilder.generateAccessorsByDelegate( this.annotations.addAll(annotations) } propertySymbol = this@generateAccessorsByDelegate.symbol + }.also { + it.initContainingClassAttr(context) } } } @@ -574,6 +580,14 @@ fun FirQualifiedAccess.wrapWithSafeCall(receiver: FirExpression, source: FirSour } } +fun FirCallableDeclaration.initContainingClassAttr(context: Context) { + containingClassForStaticMemberAttr = currentDispatchReceiverType(context)?.lookupTag ?: return +} + +fun currentDispatchReceiverType(context: Context): ConeClassLikeType? { + return context.dispatchReceiverTypesStack.lastOrNull() +} + val CharSequence.isUnderscore: Boolean get() = all { it == '_' }