[FIR] Add effective visibility to resolved status

This commit includes:
- introduce FirResolvedDeclarationStatus.effectiveVisibility
- replace FirEffectiveVisibility with EffectiveVisibility
- move calculation of effective visibility from FirEffectiveVisibilityResolver
  (which is deleted) to FirStatusResolver and FirDeserializer
This commit is contained in:
Dmitriy Novozhilov
2021-04-02 14:57:30 +03:00
committed by TeamCityServer
parent a600d18396
commit 3ef87d0265
33 changed files with 327 additions and 679 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSourceElement
@@ -37,6 +38,7 @@ interface FirResolvedDeclarationStatus : FirDeclarationStatus {
override val isFromSealedClass: Boolean
override val isFromEnumClass: Boolean
override val isFun: Boolean
val effectiveVisibility: EffectiveVisibility
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedDeclarationStatus(this, data)
}
@@ -1,52 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.descriptors.Visibility
interface FirEffectiveVisibility {
val name: String
val publicApi: Boolean
val privateApi: Boolean
enum class Permissiveness {
LESS,
SAME,
MORE,
UNKNOWN
}
fun relation(other: FirEffectiveVisibility): Permissiveness
fun toVisibility(): Visibility
fun lowerBound(other: FirEffectiveVisibility): FirEffectiveVisibility
object Default : FirEffectiveVisibility {
override val name: String
get() = "???"
override val publicApi: Boolean
get() = false
override val privateApi: Boolean
get() = false
override fun relation(other: FirEffectiveVisibility): Permissiveness {
throw AssertionError("Should not be called")
}
override fun toVisibility(): Visibility {
throw AssertionError("Should not be called")
}
override fun lowerBound(other: FirEffectiveVisibility): FirEffectiveVisibility {
throw AssertionError("Should not be called")
}
}
}
@@ -1,19 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.resolve.ScopeSession
@NoMutableState
abstract class FirEffectiveVisibilityResolver : FirSessionComponent {
abstract fun resolveFor(
declaration: FirMemberDeclaration,
containingDeclarations: List<FirDeclaration>?,
scopeSession: ScopeSession
): FirEffectiveVisibility
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
@@ -249,12 +249,12 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
popIndent()
}
private fun Visibility.asString(effectiveVisibility: FirEffectiveVisibility? = null): String {
private fun Visibility.asString(effectiveVisibility: EffectiveVisibility? = null): String {
val itself = when (this) {
Visibilities.Unknown -> return "public?"
else -> toString()
}
if (effectiveVisibility == null || effectiveVisibility == FirEffectiveVisibility.Default) return itself
if (effectiveVisibility == null) return itself
val effectiveAsVisibility = effectiveVisibility.toVisibility()
if (effectiveAsVisibility == this) return itself
if (effectiveAsVisibility == Visibilities.Private && this == Visibilities.PrivateToThis) return itself
@@ -5,15 +5,14 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirRegularClassImpl
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
@@ -59,7 +58,11 @@ inline val FirMemberDeclaration.modality get() = status.modality
inline val FirMemberDeclaration.isAbstract get() = status.modality == Modality.ABSTRACT
inline val FirMemberDeclaration.isOpen get() = status.modality == Modality.OPEN
inline val FirMemberDeclaration.visibility get() = status.visibility
inline val FirMemberDeclaration.visibility: Visibility get() = status.visibility
inline val FirMemberDeclaration.effectiveVisibility: EffectiveVisibility
get() = (status as? FirResolvedDeclarationStatus)?.effectiveVisibility
?: error("Effective visibility for ${render(FirRenderer.RenderMode.NoBodies)} must be resolved")
inline val FirMemberDeclaration.allowsToHaveFakeOverride: Boolean
get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.InvisibleFake
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl.Modifier.*
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@@ -167,7 +167,11 @@ open class FirDeclarationStatusImpl(
return this
}
fun resolved(visibility: Visibility, modality: Modality): FirResolvedDeclarationStatusImpl {
return FirResolvedDeclarationStatusImpl(visibility, modality, flags)
fun resolved(
visibility: Visibility,
modality: Modality,
effectiveVisibility: EffectiveVisibility
): FirResolvedDeclarationStatusImpl {
return FirResolvedDeclarationStatusImpl(visibility, modality, effectiveVisibility, flags)
}
}
@@ -5,20 +5,23 @@
package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
class FirResolvedDeclarationStatusImpl(
visibility: Visibility,
modality: Modality
modality: Modality,
override val effectiveVisibility: EffectiveVisibility
) : FirDeclarationStatusImpl(visibility, modality), FirResolvedDeclarationStatus {
internal constructor(
visibility: Visibility,
modality: Modality,
effectiveVisibility: EffectiveVisibility,
flags: Int
) : this(visibility, modality) {
) : this(visibility, modality, effectiveVisibility) {
this.flags = flags
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.tree.generator.FieldSets.calleeReference
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.classKind
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.controlFlowGraphReferenceField
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.declarations
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.effectiveVisibility
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.initializer
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.modality
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.name
@@ -342,6 +343,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
resolvedDeclarationStatus.configure {
+effectiveVisibility
shouldBeAnInterface()
}
@@ -8,9 +8,8 @@ package org.jetbrains.kotlin.fir.tree.generator
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.tree.generator.context.generatedType
import org.jetbrains.kotlin.fir.tree.generator.context.type
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
@@ -30,8 +29,7 @@ val inlineStatusType = type("fir.declarations", "InlineStatus")
val varianceType = type(Variance::class)
val nameType = type(Name::class)
val visibilityType = type(Visibility::class)
val effectiveVisibilityType = type("fir", "FirEffectiveVisibility")
val visibilitiesType = type(Visibilities::class)
val effectiveVisibilityType = type("descriptors", "EffectiveVisibility")
val modalityType = type(Modality::class)
val fqNameType = type(FqName::class)
val classIdType = type(ClassId::class)