From 7f1049736de905f6310328fbae3a0a862a5712ad Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 23 Mar 2020 18:30:05 +0300 Subject: [PATCH] FIR: Get rid of FirStatusResolveTransformer.Companion --- .../FirStatusResolveTransformer.kt | 116 +++++++++--------- .../FirDeclarationsResolveTransformer.kt | 1 - 2 files changed, 57 insertions(+), 60 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 b9f214651ec..7f675dad7d1 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 @@ -116,65 +116,6 @@ class FirStatusResolveTransformer(override val session: FirSession) : override fun transformBlock(block: FirBlock, data: FirDeclarationStatus?): CompositeTransformResult { return block.compose() } - - companion object { - fun FirDeclaration.resolveStatus( - status: FirDeclarationStatus, - containingClass: FirClass<*>?, - isLocal: Boolean - ): FirDeclarationStatus { - if (status.visibility == Visibilities.UNKNOWN || status.modality == null) { - val visibility = when (status.visibility) { - Visibilities.UNKNOWN -> if (isLocal) Visibilities.LOCAL else resolveVisibility(containingClass) - else -> status.visibility - } - val modality = status.modality ?: resolveModality(containingClass) - val containerEffectiveVisibility = containingClass?.effectiveVisibility ?: FirEffectiveVisibility.Public - val effectiveVisibility = - visibility.firEffectiveVisibility(session, this as? FirMemberDeclaration).lowerBound(containerEffectiveVisibility) - return (status as FirDeclarationStatusImpl).resolved(visibility, effectiveVisibility, modality) - } - return status - } - - private fun FirDeclaration.resolveVisibility(containingClass: FirClass<*>?): Visibility { - if (this is FirConstructor) { - if (containingClass != null && - (containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.modality == Modality.SEALED) - ) { - return Visibilities.PRIVATE - } - } - return Visibilities.PUBLIC // TODO (overrides) - } - - private fun FirDeclaration.resolveModality(containingClass: FirClass<*>?): Modality { - return when (this) { - is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL - is FirCallableMemberDeclaration<*> -> { - when { - containingClass == null -> Modality.FINAL - containingClass.classKind == ClassKind.INTERFACE -> { - when { - visibility == Visibilities.PRIVATE -> - Modality.FINAL - this is FirSimpleFunction && body == null -> - Modality.ABSTRACT - this is FirProperty && initializer == null && getter?.body == null && setter?.body == null -> - Modality.ABSTRACT - else -> - Modality.OPEN - } - } - else -> { - if (isOverride && containingClass.modality != Modality.FINAL) Modality.OPEN else Modality.FINAL - } - } - } - else -> Modality.FINAL - } - } - } } private val > FirClass.effectiveVisibility: FirEffectiveVisibility @@ -190,3 +131,60 @@ private val > FirClass.modality: Modality? is FirAnonymousObject -> Modality.FINAL else -> error("Unknown kind of class: ${this::class}") } + +fun FirDeclaration.resolveStatus( + status: FirDeclarationStatus, + containingClass: FirClass<*>?, + isLocal: Boolean +): FirDeclarationStatus { + if (status.visibility == Visibilities.UNKNOWN || status.modality == null) { + val visibility = when (status.visibility) { + Visibilities.UNKNOWN -> if (isLocal) Visibilities.LOCAL else resolveVisibility(containingClass) + else -> status.visibility + } + val modality = status.modality ?: resolveModality(containingClass) + val containerEffectiveVisibility = containingClass?.effectiveVisibility ?: FirEffectiveVisibility.Public + val effectiveVisibility = + visibility.firEffectiveVisibility(session, this as? FirMemberDeclaration).lowerBound(containerEffectiveVisibility) + return (status as FirDeclarationStatusImpl).resolved(visibility, effectiveVisibility, modality) + } + return status +} + +private fun FirDeclaration.resolveVisibility(containingClass: FirClass<*>?): Visibility { + if (this is FirConstructor) { + if (containingClass != null && + (containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.modality == Modality.SEALED) + ) { + return Visibilities.PRIVATE + } + } + return Visibilities.PUBLIC // TODO (overrides) +} + +private fun FirDeclaration.resolveModality(containingClass: FirClass<*>?): Modality { + return when (this) { + is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL + is FirCallableMemberDeclaration<*> -> { + when { + containingClass == null -> Modality.FINAL + containingClass.classKind == ClassKind.INTERFACE -> { + when { + visibility == Visibilities.PRIVATE -> + Modality.FINAL + this is FirSimpleFunction && body == null -> + Modality.ABSTRACT + this is FirProperty && initializer == null && getter?.body == null && setter?.body == null -> + Modality.ABSTRACT + else -> + Modality.OPEN + } + } + else -> { + if (isOverride && containingClass.modality != Modality.FINAL) Modality.OPEN else Modality.FINAL + } + } + } + else -> Modality.FINAL + } +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index f7f08c3c635..000573ea81a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.resolve.inference.FirDelegatedPropertyInferenceS import org.jetbrains.kotlin.fir.resolve.inference.extractLambdaInfoFromFunctionalType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.transformers.* -import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer.Companion.resolveStatus import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol