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 625ab1b1b39..24effec5527 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 @@ -234,6 +234,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { val getterFlags = if (proto.hasGetterFlags()) proto.getterFlags else defaultAccessorFlags val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(getterFlags)) val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(getterFlags)) + val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol) if (Flags.IS_NOT_DEFAULT.get(getterFlags)) { buildPropertyAccessor { declarationSiteSession = c.session @@ -244,7 +245,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { status = FirResolvedDeclarationStatusImpl( visibility, modality, - visibility.toEffectiveVisibility(classSymbol) + effectiveVisibility ).apply { isInline = Flags.IS_INLINE_ACCESSOR.get(getterFlags) isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(getterFlags) @@ -255,7 +256,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { versionRequirementsTable = c.versionRequirementTable } } else { - FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) + FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility, effectiveVisibility) }.apply { (annotations as MutableList) += c.annotationDeserializer.loadPropertyGetterAnnotations( @@ -270,6 +271,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { val setterFlags = if (proto.hasSetterFlags()) proto.setterFlags else defaultAccessorFlags val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(setterFlags)) val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(setterFlags)) + val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol) if (Flags.IS_NOT_DEFAULT.get(setterFlags)) { buildPropertyAccessor { declarationSiteSession = c.session @@ -280,7 +282,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { status = FirResolvedDeclarationStatusImpl( visibility, modality, - visibility.toEffectiveVisibility(classSymbol) + effectiveVisibility ).apply { isInline = Flags.IS_INLINE_ACCESSOR.get(setterFlags) isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(setterFlags) @@ -297,7 +299,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { versionRequirementsTable = c.versionRequirementTable } } else { - FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) + FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility, effectiveVisibility) }.apply { (annotations as MutableList) += c.annotationDeserializer.loadPropertySetterAnnotations( 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 fd496f1ec42..14002a2bce2 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.containingClassAttr @@ -14,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap @@ -167,7 +169,12 @@ class FirSamResolverImpl( source = firRegularClass.source name = classId.shortClassName origin = FirDeclarationOrigin.SamConstructor - status = FirDeclarationStatusImpl(firRegularClass.visibility, Modality.FINAL).apply { + val visibility = firRegularClass.visibility + status = FirResolvedDeclarationStatusImpl( + visibility, + Modality.FINAL, + EffectiveVisibility.Local + ).apply { isExpect = firRegularClass.isExpect isActual = firRegularClass.isActual isOverride = false diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt index 75140699f3c..e4d5f497761 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt @@ -8,22 +8,24 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.expressions.builder.buildEmptyExpressionBlock -import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef +import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds private val ENUM_VALUES = Name.identifier("values") private val ENUM_VALUE_OF = Name.identifier("valueOf") @@ -48,7 +50,7 @@ fun FirRegularClassBuilder.generateValuesFunction( ) } name = ENUM_VALUES - this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL).apply { + this.status = createStatus(this@generateValuesFunction.status).apply { isStatic = true isExpect = makeExpect } @@ -77,7 +79,8 @@ fun FirRegularClassBuilder.generateValueOfFunction( ) } name = ENUM_VALUE_OF - status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL).apply { + + status = createStatus(this@generateValueOfFunction.status).apply { isStatic = true isExpect = makeExpect } @@ -99,3 +102,12 @@ fun FirRegularClassBuilder.generateValueOfFunction( containingClassAttr = this@generateValueOfFunction.symbol.toLookupTag() } } + +private fun createStatus(parentStatus: FirDeclarationStatus): FirDeclarationStatusImpl { + val parentEffectiveVisibility = (parentStatus as? FirResolvedDeclarationStatusImpl)?.effectiveVisibility + return if (parentEffectiveVisibility != null) { + FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, parentEffectiveVisibility) + } else { + FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL) + } +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt index 36d87183490..d0ce62b4210 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.declarations.impl +import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirImplementationDetail @@ -34,6 +35,7 @@ abstract class FirDefaultPropertyAccessor( valueParameters: MutableList, isGetter: Boolean, visibility: Visibility, + effectiveVisibility: EffectiveVisibility? = null, symbol: FirPropertyAccessorSymbol ) : FirPropertyAccessorImpl( source, @@ -44,7 +46,10 @@ abstract class FirDefaultPropertyAccessor( propertyTypeRef, valueParameters, body = null, - FirDeclarationStatusImpl(visibility, Modality.FINAL), + status = if (effectiveVisibility == null) + FirDeclarationStatusImpl(visibility, Modality.FINAL) + else + FirResolvedDeclarationStatusImpl(visibility, Modality.FINAL, effectiveVisibility), containerSource = null, dispatchReceiverType = null, contractDescription = FirEmptyContractDescription, @@ -85,6 +90,7 @@ class FirDefaultPropertyGetter( origin: FirDeclarationOrigin, propertyTypeRef: FirTypeRef, visibility: Visibility, + effectiveVisibility: EffectiveVisibility? = null, symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol() ) : FirDefaultPropertyAccessor( source, @@ -94,6 +100,7 @@ class FirDefaultPropertyGetter( valueParameters = mutableListOf(), isGetter = true, visibility = visibility, + effectiveVisibility = effectiveVisibility, symbol = symbol ) @@ -103,6 +110,7 @@ class FirDefaultPropertySetter( origin: FirDeclarationOrigin, propertyTypeRef: FirTypeRef, visibility: Visibility, + effectiveVisibility: EffectiveVisibility? = null, symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol() ) : FirDefaultPropertyAccessor( source, @@ -120,5 +128,6 @@ class FirDefaultPropertySetter( ), isGetter = false, visibility, + effectiveVisibility, symbol )