Skip to content

Commit

Permalink
[AA] Lazily compute the effective visibility in FIR stub-based deseri…
Browse files Browse the repository at this point in the history
…alizer

See previous commits for explanation

^KT-74040
  • Loading branch information
demiurg906 authored and Space Team committed Jan 15, 2025
1 parent 618eaff commit f82abd9
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ KaNamedClassSymbol:
getContainingModule: KaLibraryModule "Library library"
annotationApplicableTargets: null
deprecationStatus: null
isPublicApi: true
isPublicApi: false
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusWithLazyEffectiveVisibility
import org.jetbrains.kotlin.fir.declarations.utils.addDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
import org.jetbrains.kotlin.fir.declarations.utils.sourceElement
import org.jetbrains.kotlin.fir.deserialization.addCloneForArrayIfNeeded
import org.jetbrains.kotlin.fir.deserialization.deserializationExtension
import org.jetbrains.kotlin.fir.deserialization.toLazyEffectiveVisibility
import org.jetbrains.kotlin.fir.resolve.transformers.setLazyPublishedVisibility
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
Expand Down Expand Up @@ -120,10 +122,10 @@ internal fun deserializeClassToSymbol(
}
val modality = classOrObject.modality
val visibility = classOrObject.visibility
val status = FirResolvedDeclarationStatusImpl(
val status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
modality,
visibility.toEffectiveVisibility(parentContext?.outerClassSymbol, forClass = true)
visibility.toLazyEffectiveVisibility(parentContext?.outerClassSymbol, session, forClass = true)
).apply {
isExpect = classOrObject.hasModifier(KtTokens.EXPECT_KEYWORD)
isActual = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,26 @@

package org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization

import org.jetbrains.kotlin.KtFakeSourceElement
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtRealPsiSourceElement
import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr
import org.jetbrains.kotlin.fir.copyWithNewSourceKind
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.utils.sourceElement
import org.jetbrains.kotlin.fir.deserialization.toLazyEffectiveVisibility
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.transformers.setLazyPublishedVisibility
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.toEffectiveVisibility
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
Expand All @@ -41,7 +36,6 @@ import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.toKtPsiSourceElement
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry

Expand Down Expand Up @@ -196,10 +190,10 @@ internal class StubBasedFirMemberDeserializer(
origin = initialOrigin
this.name = name
val visibility = typeAlias.visibility
status = FirResolvedDeclarationStatusImpl(
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
Modality.FINAL,
visibility.toEffectiveVisibility(owner = null)
visibility.toLazyEffectiveVisibility(owner = null)
).apply {
isExpect = typeAlias.hasModifier(KtTokens.EXPECT_KEYWORD)
isActual = false
Expand Down Expand Up @@ -227,15 +221,18 @@ internal class StubBasedFirMemberDeserializer(
): FirPropertyAccessor {
val visibility = getter.visibility
val accessorModality = getter.modality
val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol)
return buildPropertyAccessor {
source = KtRealPsiSourceElement(getter)
moduleData = c.moduleData
origin = initialOrigin
this.returnTypeRef = returnTypeRef
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
isGetter = true
status = FirResolvedDeclarationStatusImpl(visibility, accessorModality, effectiveVisibility).apply {
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
accessorModality,
visibility.toLazyEffectiveVisibility(classSymbol)
).apply {
isInline = getter.hasModifier(KtTokens.INLINE_KEYWORD)
isExternal = getter.hasModifier(KtTokens.EXTERNAL_KEYWORD)
}
Expand All @@ -260,15 +257,18 @@ internal class StubBasedFirMemberDeserializer(
): FirPropertyAccessor {
val visibility = setter.visibility
val accessorModality = setter.modality
val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol)
return buildPropertyAccessor {
source = KtRealPsiSourceElement(setter)
moduleData = c.moduleData
origin = initialOrigin
this.returnTypeRef = FirImplicitUnitTypeRef(source)
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
isGetter = false
status = FirResolvedDeclarationStatusImpl(visibility, accessorModality, effectiveVisibility).apply {
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
accessorModality,
visibility.toLazyEffectiveVisibility(classSymbol)
).apply {
isInline = setter.hasModifier(KtTokens.INLINE_KEYWORD)
isExternal = setter.hasModifier(KtTokens.EXTERNAL_KEYWORD)
}
Expand Down Expand Up @@ -333,10 +333,10 @@ internal class StubBasedFirMemberDeserializer(
dispatchReceiverType = c.dispatchReceiver
isLocal = false
val visibility = property.visibility
val resolvedStatus = FirResolvedDeclarationStatusImpl(
val resolvedStatus = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
propertyModality,
visibility.toEffectiveVisibility(classSymbol)
visibility.toLazyEffectiveVisibility(classSymbol)
).apply {
isExpect = property.hasExpectModifier()
isActual = false
Expand Down Expand Up @@ -378,9 +378,7 @@ internal class StubBasedFirMemberDeserializer(
origin = origin,
propertyTypeRef = returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
propertySymbol = symbol,
visibility = resolvedStatus.visibility,
effectiveVisibility = resolvedStatus.effectiveVisibility,
modality = resolvedStatus.modality,
status = resolvedStatus,
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
)

Expand All @@ -393,9 +391,7 @@ internal class StubBasedFirMemberDeserializer(
origin = origin,
propertyTypeRef = returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
propertySymbol = symbol,
visibility = resolvedStatus.visibility,
effectiveVisibility = resolvedStatus.effectiveVisibility,
modality = resolvedStatus.modality,
status = resolvedStatus,
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
)
else -> null
Expand Down Expand Up @@ -460,10 +456,10 @@ internal class StubBasedFirMemberDeserializer(

name = callableName
val visibility = function.visibility
status = FirResolvedDeclarationStatusImpl(
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
function.modality,
visibility.toEffectiveVisibility(classSymbol)
visibility.toLazyEffectiveVisibility(classSymbol)
).apply {
isExpect = function.hasExpectModifier()
isActual = false
Expand Down Expand Up @@ -534,10 +530,10 @@ internal class StubBasedFirMemberDeserializer(
returnTypeRef = delegatedSelfType
val visibility = constructor.visibility
val isInner = classBuilder.status.isInner
status = FirResolvedDeclarationStatusImpl(
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
visibility,
Modality.FINAL,
visibility.toEffectiveVisibility(classBuilder.symbol)
visibility.toLazyEffectiveVisibility(classBuilder.symbol)
).apply {
isExpect = constructor.hasExpectModifier() || classOrObject.hasExpectModifier()
isActual = false
Expand Down Expand Up @@ -643,4 +639,8 @@ internal class StubBasedFirMemberDeserializer(
}
return enumEntry
}

private fun Visibility.toLazyEffectiveVisibility(owner: FirClassLikeSymbol<*>?): Lazy<EffectiveVisibility> {
return this.toLazyEffectiveVisibility(owner, c.session, forClass = false)
}
}

0 comments on commit f82abd9

Please sign in to comment.