Skip to content

Commit f82abd9

Browse files
demiurg906Space Team
authored and
Space Team
committed
[AA] Lazily compute the effective visibility in FIR stub-based deserializer
See previous commits for explanation ^KT-74040
1 parent 618eaff commit f82abd9

File tree

3 files changed

+33
-31
lines changed

3 files changed

+33
-31
lines changed

analysis/analysis-api/testData/symbols/symbolByFqName/libraryNestedClass.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ KaNamedClassSymbol:
2828
getContainingModule: KaLibraryModule "Library library"
2929
annotationApplicableTargets: null
3030
deprecationStatus: null
31-
isPublicApi: true
31+
isPublicApi: false

analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass
2525
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
2626
import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator
2727
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
28+
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusWithLazyEffectiveVisibility
2829
import org.jetbrains.kotlin.fir.declarations.utils.addDeclaration
2930
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
3031
import org.jetbrains.kotlin.fir.declarations.utils.sourceElement
3132
import org.jetbrains.kotlin.fir.deserialization.addCloneForArrayIfNeeded
3233
import org.jetbrains.kotlin.fir.deserialization.deserializationExtension
34+
import org.jetbrains.kotlin.fir.deserialization.toLazyEffectiveVisibility
3335
import org.jetbrains.kotlin.fir.resolve.transformers.setLazyPublishedVisibility
3436
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
3537
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
@@ -120,10 +122,10 @@ internal fun deserializeClassToSymbol(
120122
}
121123
val modality = classOrObject.modality
122124
val visibility = classOrObject.visibility
123-
val status = FirResolvedDeclarationStatusImpl(
125+
val status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
124126
visibility,
125127
modality,
126-
visibility.toEffectiveVisibility(parentContext?.outerClassSymbol, forClass = true)
128+
visibility.toLazyEffectiveVisibility(parentContext?.outerClassSymbol, session, forClass = true)
127129
).apply {
128130
isExpect = classOrObject.hasModifier(KtTokens.EXPECT_KEYWORD)
129131
isActual = false

analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt

+28-28
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,26 @@
55

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

8-
import org.jetbrains.kotlin.KtFakeSourceElement
9-
import org.jetbrains.kotlin.KtFakeSourceElementKind
10-
import org.jetbrains.kotlin.KtRealPsiSourceElement
8+
import org.jetbrains.kotlin.*
119
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
1210
import org.jetbrains.kotlin.descriptors.Modality
1311
import org.jetbrains.kotlin.descriptors.Visibilities
12+
import org.jetbrains.kotlin.descriptors.Visibility
1413
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
15-
import org.jetbrains.kotlin.fakeElement
1614
import org.jetbrains.kotlin.fir.FirModuleData
1715
import org.jetbrains.kotlin.fir.FirSession
1816
import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr
1917
import org.jetbrains.kotlin.fir.copyWithNewSourceKind
2018
import org.jetbrains.kotlin.fir.declarations.*
2119
import org.jetbrains.kotlin.fir.declarations.builder.*
22-
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
23-
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
24-
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
25-
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
20+
import org.jetbrains.kotlin.fir.declarations.impl.*
2621
import org.jetbrains.kotlin.fir.declarations.utils.sourceElement
22+
import org.jetbrains.kotlin.fir.deserialization.toLazyEffectiveVisibility
2723
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
2824
import org.jetbrains.kotlin.fir.resolve.defaultType
2925
import org.jetbrains.kotlin.fir.resolve.transformers.setLazyPublishedVisibility
3026
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
3127
import org.jetbrains.kotlin.fir.symbols.impl.*
32-
import org.jetbrains.kotlin.fir.toEffectiveVisibility
3328
import org.jetbrains.kotlin.fir.types.*
3429
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
3530
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
@@ -41,7 +36,6 @@ import org.jetbrains.kotlin.name.*
4136
import org.jetbrains.kotlin.psi.*
4237
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
4338
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
44-
import org.jetbrains.kotlin.toKtPsiSourceElement
4539
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
4640
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
4741

@@ -196,10 +190,10 @@ internal class StubBasedFirMemberDeserializer(
196190
origin = initialOrigin
197191
this.name = name
198192
val visibility = typeAlias.visibility
199-
status = FirResolvedDeclarationStatusImpl(
193+
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
200194
visibility,
201195
Modality.FINAL,
202-
visibility.toEffectiveVisibility(owner = null)
196+
visibility.toLazyEffectiveVisibility(owner = null)
203197
).apply {
204198
isExpect = typeAlias.hasModifier(KtTokens.EXPECT_KEYWORD)
205199
isActual = false
@@ -227,15 +221,18 @@ internal class StubBasedFirMemberDeserializer(
227221
): FirPropertyAccessor {
228222
val visibility = getter.visibility
229223
val accessorModality = getter.modality
230-
val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol)
231224
return buildPropertyAccessor {
232225
source = KtRealPsiSourceElement(getter)
233226
moduleData = c.moduleData
234227
origin = initialOrigin
235228
this.returnTypeRef = returnTypeRef
236229
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
237230
isGetter = true
238-
status = FirResolvedDeclarationStatusImpl(visibility, accessorModality, effectiveVisibility).apply {
231+
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
232+
visibility,
233+
accessorModality,
234+
visibility.toLazyEffectiveVisibility(classSymbol)
235+
).apply {
239236
isInline = getter.hasModifier(KtTokens.INLINE_KEYWORD)
240237
isExternal = getter.hasModifier(KtTokens.EXTERNAL_KEYWORD)
241238
}
@@ -260,15 +257,18 @@ internal class StubBasedFirMemberDeserializer(
260257
): FirPropertyAccessor {
261258
val visibility = setter.visibility
262259
val accessorModality = setter.modality
263-
val effectiveVisibility = visibility.toEffectiveVisibility(classSymbol)
264260
return buildPropertyAccessor {
265261
source = KtRealPsiSourceElement(setter)
266262
moduleData = c.moduleData
267263
origin = initialOrigin
268264
this.returnTypeRef = FirImplicitUnitTypeRef(source)
269265
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
270266
isGetter = false
271-
status = FirResolvedDeclarationStatusImpl(visibility, accessorModality, effectiveVisibility).apply {
267+
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
268+
visibility,
269+
accessorModality,
270+
visibility.toLazyEffectiveVisibility(classSymbol)
271+
).apply {
272272
isInline = setter.hasModifier(KtTokens.INLINE_KEYWORD)
273273
isExternal = setter.hasModifier(KtTokens.EXTERNAL_KEYWORD)
274274
}
@@ -333,10 +333,10 @@ internal class StubBasedFirMemberDeserializer(
333333
dispatchReceiverType = c.dispatchReceiver
334334
isLocal = false
335335
val visibility = property.visibility
336-
val resolvedStatus = FirResolvedDeclarationStatusImpl(
336+
val resolvedStatus = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
337337
visibility,
338338
propertyModality,
339-
visibility.toEffectiveVisibility(classSymbol)
339+
visibility.toLazyEffectiveVisibility(classSymbol)
340340
).apply {
341341
isExpect = property.hasExpectModifier()
342342
isActual = false
@@ -378,9 +378,7 @@ internal class StubBasedFirMemberDeserializer(
378378
origin = origin,
379379
propertyTypeRef = returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
380380
propertySymbol = symbol,
381-
visibility = resolvedStatus.visibility,
382-
effectiveVisibility = resolvedStatus.effectiveVisibility,
383-
modality = resolvedStatus.modality,
381+
status = resolvedStatus,
384382
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
385383
)
386384

@@ -393,9 +391,7 @@ internal class StubBasedFirMemberDeserializer(
393391
origin = origin,
394392
propertyTypeRef = returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
395393
propertySymbol = symbol,
396-
visibility = resolvedStatus.visibility,
397-
effectiveVisibility = resolvedStatus.effectiveVisibility,
398-
modality = resolvedStatus.modality,
394+
status = resolvedStatus,
399395
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
400396
)
401397
else -> null
@@ -460,10 +456,10 @@ internal class StubBasedFirMemberDeserializer(
460456

461457
name = callableName
462458
val visibility = function.visibility
463-
status = FirResolvedDeclarationStatusImpl(
459+
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
464460
visibility,
465461
function.modality,
466-
visibility.toEffectiveVisibility(classSymbol)
462+
visibility.toLazyEffectiveVisibility(classSymbol)
467463
).apply {
468464
isExpect = function.hasExpectModifier()
469465
isActual = false
@@ -534,10 +530,10 @@ internal class StubBasedFirMemberDeserializer(
534530
returnTypeRef = delegatedSelfType
535531
val visibility = constructor.visibility
536532
val isInner = classBuilder.status.isInner
537-
status = FirResolvedDeclarationStatusImpl(
533+
status = FirResolvedDeclarationStatusWithLazyEffectiveVisibility(
538534
visibility,
539535
Modality.FINAL,
540-
visibility.toEffectiveVisibility(classBuilder.symbol)
536+
visibility.toLazyEffectiveVisibility(classBuilder.symbol)
541537
).apply {
542538
isExpect = constructor.hasExpectModifier() || classOrObject.hasExpectModifier()
543539
isActual = false
@@ -643,4 +639,8 @@ internal class StubBasedFirMemberDeserializer(
643639
}
644640
return enumEntry
645641
}
642+
643+
private fun Visibility.toLazyEffectiveVisibility(owner: FirClassLikeSymbol<*>?): Lazy<EffectiveVisibility> {
644+
return this.toLazyEffectiveVisibility(owner, c.session, forClass = false)
645+
}
646646
}

0 commit comments

Comments
 (0)