From ce939903bb31ec50643ab606884d0b63fb2233e9 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 23 Mar 2020 18:29:05 +0300 Subject: [PATCH] FIR: Prepare status resolution to local/anonymous classes --- .../FirStatusResolveTransformer.kt | 55 ++++++++++++++----- .../resolve/transformers/ResolvePhaseUtils.kt | 2 +- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index 611ee036217..b9f214651ec 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -5,8 +5,12 @@ package org.jetbrains.kotlin.fir.resolve.transformers -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirEffectiveVisibility +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl @@ -14,20 +18,27 @@ import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.firEffectiveVisibility import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.compose -class FirStatusResolveTransformer : FirAbstractTreeTransformer(phase = FirResolvePhase.STATUS) { - private val classes = mutableListOf() - - private val containingClass: FirRegularClass? get() = classes.lastOrNull() - - override lateinit var session: FirSession - - override fun transformFile(file: FirFile, data: FirDeclarationStatus?): CompositeTransformResult { - session = file.session - return super.transformFile(file, data) +@Deprecated("Should be used just once from createTransformerByPhase", level = DeprecationLevel.WARNING) +class FirStatusResolveTransformerAdapter : FirTransformer() { + override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { + error("Should not be called for ${element::class}, only for files") } + override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + val transformer = FirStatusResolveTransformer(file.session) + return file.transform(transformer, null) + } +} + +class FirStatusResolveTransformer(override val session: FirSession) : + FirAbstractTreeTransformer(phase = FirResolvePhase.STATUS) { + private val classes = mutableListOf>() + + private val containingClass: FirClass<*>? get() = classes.lastOrNull() + override fun transformDeclarationStatus( declarationStatus: FirDeclarationStatus, data: FirDeclarationStatus? @@ -109,7 +120,7 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer?, isLocal: Boolean ): FirDeclarationStatus { if (status.visibility == Visibilities.UNKNOWN || status.modality == null) { @@ -126,7 +137,7 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer?): Visibility { if (this is FirConstructor) { if (containingClass != null && (containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.modality == Modality.SEALED) @@ -137,7 +148,7 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer?): Modality { return when (this) { is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL is FirCallableMemberDeclaration<*> -> { @@ -164,4 +175,18 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer> FirClass.effectiveVisibility: FirEffectiveVisibility + get() = when (this) { + is FirRegularClass -> status.effectiveVisibility + is FirAnonymousObject -> FirEffectiveVisibility.Local + else -> error("Unknown kind of class: ${this::class}") + } + +private val > FirClass.modality: Modality? + get() = when (this) { + is FirRegularClass -> status.modality + is FirAnonymousObject -> Modality.FINAL + else -> error("Unknown kind of class: ${this::class}") + } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt index aab5e31b118..1648e1c3443 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt @@ -20,7 +20,7 @@ fun FirResolvePhase.createTransformerByPhase(scopeSession: ScopeSession): FirTra SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession) SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer() TYPES -> FirTypeResolveTransformerAdapter(scopeSession) - STATUS -> FirStatusResolveTransformer() + STATUS -> FirStatusResolveTransformerAdapter() IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession) BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession) }