FIR: Get rid of FirStatusResolveTransformer.Companion
This commit is contained in:
+57
-59
@@ -116,65 +116,6 @@ class FirStatusResolveTransformer(override val session: FirSession) :
|
|||||||
override fun transformBlock(block: FirBlock, data: FirDeclarationStatus?): CompositeTransformResult<FirStatement> {
|
override fun transformBlock(block: FirBlock, data: FirDeclarationStatus?): CompositeTransformResult<FirStatement> {
|
||||||
return block.compose()
|
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 <F : FirClass<F>> FirClass<F>.effectiveVisibility: FirEffectiveVisibility
|
private val <F : FirClass<F>> FirClass<F>.effectiveVisibility: FirEffectiveVisibility
|
||||||
@@ -190,3 +131,60 @@ private val <F : FirClass<F>> FirClass<F>.modality: Modality?
|
|||||||
is FirAnonymousObject -> Modality.FINAL
|
is FirAnonymousObject -> Modality.FINAL
|
||||||
else -> error("Unknown kind of class: ${this::class}")
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
-1
@@ -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.inference.extractLambdaInfoFromFunctionalType
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.*
|
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.FirLocalScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope
|
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
|
|||||||
Reference in New Issue
Block a user