From 563f8c8541bec9c6bbeda6f9f2441db3b817f903 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Wed, 21 Jul 2021 16:53:45 +0200 Subject: [PATCH] [FIR IDE] Split names of withRef function to phase and type versions --- .../fir/symbols/KtFirOverrideInfoProvider.kt | 21 +++++-------------- .../fir/symbols/KtFirTypeAndAnnotations.kt | 2 +- .../annotations/KtFirAnnotationCall.kt | 2 +- .../symbols/annotations/firAnnotationUtils.kt | 4 ++-- .../api/fir/utils/FirRefWithValidityCheck.kt | 8 +++---- 5 files changed, 13 insertions(+), 24 deletions(-) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirOverrideInfoProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirOverrideInfoProvider.kt index 71d04f245c8..a5278c73f42 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirOverrideInfoProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirOverrideInfoProvider.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.isVisibleInClass import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.originalForIntersectionOverrideAttr import org.jetbrains.kotlin.fir.originalForSubstitutionOverride @@ -21,7 +20,6 @@ import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.components.KtOverrideInfoProvider import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken @@ -39,10 +37,10 @@ class KtFirOverrideInfoProvider( require(classSymbol is KtFirSymbol<*>) // Inspecting visibility requires resolving to status - return memberSymbol.firRef.withFirWithResolveAllowed outer@{ memberFir -> + return memberSymbol.firRef.withFirWithPossibleResolveInside(FirResolvePhase.STATUS) outer@{ memberFir -> if (memberFir !is FirCallableDeclaration) return@outer false - classSymbol.firRef.withFirWithResolveAllowed inner@{ parentClassFir -> + classSymbol.firRef.withFirWithPossibleResolveInside inner@{ parentClassFir -> if (parentClassFir !is FirClass) return@inner false memberFir.isVisibleInClass(parentClassFir) @@ -55,10 +53,10 @@ class KtFirOverrideInfoProvider( require(parentClassSymbol is KtFirSymbol<*>) // Inspecting implementation status requires resolving to status - return memberSymbol.firRef.withFirWithResolveAllowed outer@{ memberFir -> + return memberSymbol.firRef.withFirWithPossibleResolveInside(FirResolvePhase.STATUS) outer@{ memberFir -> if (memberFir !is FirCallableDeclaration) return@outer null - parentClassSymbol.firRef.withFirWithResolveAllowed inner@{ parentClassFir -> + parentClassSymbol.firRef.withFirWithPossibleResolveInside inner@{ parentClassFir -> if (parentClassFir !is FirClass) return@inner null memberFir.symbol.getImplementationStatus( @@ -102,13 +100,4 @@ class KtFirOverrideInfoProvider( return member } -} - -/** - * Convenience function. - * - * We use [FirRefWithValidityCheck.withFirWithPossibleResolveInside] instead of [FirRefWithValidityCheck.withFir] because we want to be able - * to call this function inside itself - and it requires write lock, since each layer might want to call resolve and to use write lock. - */ -private inline fun FirRefWithValidityCheck.withFirWithResolveAllowed(crossinline action: (D) -> R): R = - withFirWithPossibleResolveInside(phase = FirResolvePhase.RAW_FIR, action) \ No newline at end of file +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt index 763d20944da..9decd38c570 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt @@ -69,7 +69,7 @@ internal fun FirRefWithValidityCheck.superTypesAndAnnotationsLi if(fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) { fir.superTypeRefs.mapToTypeAndAnnotations(this, builder) } else null - } ?: withFirWithPossibleResolveInside(ResolveType.NoResolve) { fir -> + } ?: withFirByTypeWithPossibleResolveInside(ResolveType.NoResolve) { fir -> fir.resolveSupertypesInTheAir(builder.rootSession).mapToTypeAndAnnotations(this, builder) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/KtFirAnnotationCall.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/KtFirAnnotationCall.kt index ec5fc1e47dd..e77715a5fc1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/KtFirAnnotationCall.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/KtFirAnnotationCall.kt @@ -31,7 +31,7 @@ internal class KtFirAnnotationCall( } override val classId: ClassId? by cached { - containingDeclaration.withFirWithPossibleResolveInside(ResolveType.AnnotationType) { fir -> + containingDeclaration.withFirByTypeWithPossibleResolveInside(ResolveType.AnnotationType) { fir -> annotationCallRef.getClassId(fir.moduleData.session) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/firAnnotationUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/firAnnotationUtils.kt index c79f98f6c9f..d8a27283c17 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/firAnnotationUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/annotations/firAnnotationUtils.kt @@ -24,11 +24,11 @@ internal fun FirRefWithValidityCheck.toAnnotationsList( } internal fun FirRefWithValidityCheck.containsAnnotation(classId: ClassId): Boolean = - withFir(ResolveType.AnnotationType) { fir -> + withFirByType(ResolveType.AnnotationType) { fir -> fir.annotations.any { it.getClassId(fir.moduleData.session) == classId } } internal fun FirRefWithValidityCheck.getAnnotationClassIds(): Collection = - withFir(ResolveType.AnnotationType) { fir -> + withFirByType(ResolveType.AnnotationType) { fir -> fir.annotations.mapNotNull { it.getClassId(fir.moduleData.session) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt index b98c3991e23..b6c73da663a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt @@ -58,10 +58,10 @@ internal class FirRefWithValidityCheck(fir: D, resolveSt * Runs [action] with fir element with write action hold * Consider using this then [action] may call some resolve */ - inline fun withFirWithPossibleResolveInside( + inline fun withFirByTypeWithPossibleResolveInside( resolveType: ResolveType = ResolveType.NoResolve, crossinline action: (fir: D) -> R - ): R = withFir(resolveType, action) + ): R = withFirByType(resolveType, action) val resolveState get() = resolveStateWeakRef.get() ?: throw EntityWasGarbageCollectedException("FirModuleResolveState") @@ -71,7 +71,7 @@ internal class FirRefWithValidityCheck(fir: D, resolveSt withFir(phase) { fir -> createValue(fir) } } - inline fun withFir(type: ResolveType, crossinline action: (fir: D) -> R): R { + inline fun withFirByType(type: ResolveType, crossinline action: (fir: D) -> R): R { token.assertIsValidAndAccessible() val fir = firWeakRef.get() ?: throw EntityWasGarbageCollectedException("FirElement") @@ -82,7 +82,7 @@ internal class FirRefWithValidityCheck(fir: D, resolveSt inline fun withFirAndCache(type: ResolveType, crossinline createValue: (fir: D) -> R) = ValidityAwareCachedValue(token) { - withFir(type) { fir -> createValue(fir) } + withFirByType(type) { fir -> createValue(fir) } } }