[FIR] Build resolved declaration status for all non-raw declarations

This commit is contained in:
Dmitriy Novozhilov
2021-04-22 13:47:03 +03:00
committed by TeamCityServer
parent d54808e33f
commit 12331cb10c
4 changed files with 40 additions and 10 deletions
@@ -234,6 +234,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
val getterFlags = if (proto.hasGetterFlags()) proto.getterFlags else defaultAccessorFlags val getterFlags = if (proto.hasGetterFlags()) proto.getterFlags else defaultAccessorFlags
val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(getterFlags)) val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(getterFlags))
val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(getterFlags)) val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(getterFlags))
val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol)
if (Flags.IS_NOT_DEFAULT.get(getterFlags)) { if (Flags.IS_NOT_DEFAULT.get(getterFlags)) {
buildPropertyAccessor { buildPropertyAccessor {
declarationSiteSession = c.session declarationSiteSession = c.session
@@ -244,7 +245,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
status = FirResolvedDeclarationStatusImpl( status = FirResolvedDeclarationStatusImpl(
visibility, visibility,
modality, modality,
visibility.toEffectiveVisibility(classSymbol) effectiveVisibility
).apply { ).apply {
isInline = Flags.IS_INLINE_ACCESSOR.get(getterFlags) isInline = Flags.IS_INLINE_ACCESSOR.get(getterFlags)
isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(getterFlags) isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(getterFlags)
@@ -255,7 +256,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
versionRequirementsTable = c.versionRequirementTable versionRequirementsTable = c.versionRequirementTable
} }
} else { } else {
FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility, effectiveVisibility)
}.apply { }.apply {
(annotations as MutableList<FirAnnotationCall>) += (annotations as MutableList<FirAnnotationCall>) +=
c.annotationDeserializer.loadPropertyGetterAnnotations( c.annotationDeserializer.loadPropertyGetterAnnotations(
@@ -270,6 +271,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
val setterFlags = if (proto.hasSetterFlags()) proto.setterFlags else defaultAccessorFlags val setterFlags = if (proto.hasSetterFlags()) proto.setterFlags else defaultAccessorFlags
val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(setterFlags)) val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(setterFlags))
val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(setterFlags)) val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(setterFlags))
val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol)
if (Flags.IS_NOT_DEFAULT.get(setterFlags)) { if (Flags.IS_NOT_DEFAULT.get(setterFlags)) {
buildPropertyAccessor { buildPropertyAccessor {
declarationSiteSession = c.session declarationSiteSession = c.session
@@ -280,7 +282,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
status = FirResolvedDeclarationStatusImpl( status = FirResolvedDeclarationStatusImpl(
visibility, visibility,
modality, modality,
visibility.toEffectiveVisibility(classSymbol) effectiveVisibility
).apply { ).apply {
isInline = Flags.IS_INLINE_ACCESSOR.get(setterFlags) isInline = Flags.IS_INLINE_ACCESSOR.get(setterFlags)
isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(setterFlags) isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(setterFlags)
@@ -297,7 +299,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
versionRequirementsTable = c.versionRequirementTable versionRequirementsTable = c.versionRequirementTable
} }
} else { } else {
FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility, effectiveVisibility)
}.apply { }.apply {
(annotations as MutableList<FirAnnotationCall>) += (annotations as MutableList<FirAnnotationCall>) +=
c.annotationDeserializer.loadPropertySetterAnnotations( c.annotationDeserializer.loadPropertySetterAnnotations(
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.containingClassAttr 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.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl 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.diagnostics.ConeIntermediateDiagnostic
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
@@ -167,7 +169,12 @@ class FirSamResolverImpl(
source = firRegularClass.source source = firRegularClass.source
name = classId.shortClassName name = classId.shortClassName
origin = FirDeclarationOrigin.SamConstructor 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 isExpect = firRegularClass.isExpect
isActual = firRegularClass.isActual isActual = firRegularClass.isActual
isOverride = false isOverride = false
@@ -8,22 +8,24 @@ package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin 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.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl 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.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.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
private val ENUM_VALUES = Name.identifier("values") private val ENUM_VALUES = Name.identifier("values")
private val ENUM_VALUE_OF = Name.identifier("valueOf") private val ENUM_VALUE_OF = Name.identifier("valueOf")
@@ -48,7 +50,7 @@ fun FirRegularClassBuilder.generateValuesFunction(
) )
} }
name = ENUM_VALUES name = ENUM_VALUES
this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL).apply { this.status = createStatus(this@generateValuesFunction.status).apply {
isStatic = true isStatic = true
isExpect = makeExpect isExpect = makeExpect
} }
@@ -77,7 +79,8 @@ fun FirRegularClassBuilder.generateValueOfFunction(
) )
} }
name = ENUM_VALUE_OF name = ENUM_VALUE_OF
status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL).apply {
status = createStatus(this@generateValueOfFunction.status).apply {
isStatic = true isStatic = true
isExpect = makeExpect isExpect = makeExpect
} }
@@ -99,3 +102,12 @@ fun FirRegularClassBuilder.generateValueOfFunction(
containingClassAttr = this@generateValueOfFunction.symbol.toLookupTag() 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)
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirImplementationDetail
@@ -34,6 +35,7 @@ abstract class FirDefaultPropertyAccessor(
valueParameters: MutableList<FirValueParameter>, valueParameters: MutableList<FirValueParameter>,
isGetter: Boolean, isGetter: Boolean,
visibility: Visibility, visibility: Visibility,
effectiveVisibility: EffectiveVisibility? = null,
symbol: FirPropertyAccessorSymbol symbol: FirPropertyAccessorSymbol
) : FirPropertyAccessorImpl( ) : FirPropertyAccessorImpl(
source, source,
@@ -44,7 +46,10 @@ abstract class FirDefaultPropertyAccessor(
propertyTypeRef, propertyTypeRef,
valueParameters, valueParameters,
body = null, body = null,
FirDeclarationStatusImpl(visibility, Modality.FINAL), status = if (effectiveVisibility == null)
FirDeclarationStatusImpl(visibility, Modality.FINAL)
else
FirResolvedDeclarationStatusImpl(visibility, Modality.FINAL, effectiveVisibility),
containerSource = null, containerSource = null,
dispatchReceiverType = null, dispatchReceiverType = null,
contractDescription = FirEmptyContractDescription, contractDescription = FirEmptyContractDescription,
@@ -85,6 +90,7 @@ class FirDefaultPropertyGetter(
origin: FirDeclarationOrigin, origin: FirDeclarationOrigin,
propertyTypeRef: FirTypeRef, propertyTypeRef: FirTypeRef,
visibility: Visibility, visibility: Visibility,
effectiveVisibility: EffectiveVisibility? = null,
symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol() symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol()
) : FirDefaultPropertyAccessor( ) : FirDefaultPropertyAccessor(
source, source,
@@ -94,6 +100,7 @@ class FirDefaultPropertyGetter(
valueParameters = mutableListOf(), valueParameters = mutableListOf(),
isGetter = true, isGetter = true,
visibility = visibility, visibility = visibility,
effectiveVisibility = effectiveVisibility,
symbol = symbol symbol = symbol
) )
@@ -103,6 +110,7 @@ class FirDefaultPropertySetter(
origin: FirDeclarationOrigin, origin: FirDeclarationOrigin,
propertyTypeRef: FirTypeRef, propertyTypeRef: FirTypeRef,
visibility: Visibility, visibility: Visibility,
effectiveVisibility: EffectiveVisibility? = null,
symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol() symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol()
) : FirDefaultPropertyAccessor( ) : FirDefaultPropertyAccessor(
source, source,
@@ -120,5 +128,6 @@ class FirDefaultPropertySetter(
), ),
isGetter = false, isGetter = false,
visibility, visibility,
effectiveVisibility,
symbol symbol
) )