FIR LC: utilize effective visibility retrieval for (overridden) members

This commit is contained in:
Jinseong Jeon
2022-05-14 01:11:09 -07:00
committed by Ilya Kirillov
parent 992ef3db44
commit c79601e616
5 changed files with 24 additions and 28 deletions
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.lifetime.isValid
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_NON_ORIGIN_METHOD
@@ -21,7 +20,6 @@ import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUES
import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUE_OF
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.light.classes.symbol.classes.*
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.Name
@@ -42,24 +40,6 @@ internal open class FirLightClassForSymbol(
require(classOrObjectSymbol.classKind != KtClassKind.INTERFACE && classOrObjectSymbol.classKind != KtClassKind.ANNOTATION_CLASS)
}
internal fun tryGetEffectiveVisibility(symbol: KtCallableSymbol): Visibility? {
if (symbol !is KtPropertySymbol && symbol !is KtFunctionSymbol) return null
var visibility = (symbol as? KtSymbolWithVisibility)?.visibility
analyzeWithSymbolAsContext(symbol) {
for (overriddenSymbol in symbol.getAllOverriddenSymbols()) {
val newVisibility = (overriddenSymbol as? KtSymbolWithVisibility)?.visibility
if (newVisibility != null) {
visibility = newVisibility
}
}
}
return visibility
}
private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel))
@@ -17,8 +17,10 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.components.DefaultTypeClassIds
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.types.*
import org.jetbrains.kotlin.asJava.elements.psiType
@@ -87,6 +89,23 @@ internal fun KtSymbolWithModality.computeModalityForMethod(
}
}
internal fun PsiElement.tryGetEffectiveVisibility(symbol: KtCallableSymbol): Visibility? {
if (symbol !is KtPropertySymbol && symbol !is KtFunctionSymbol) return null
var visibility = (symbol as? KtSymbolWithVisibility)?.visibility
analyzeWithSymbolAsContext(symbol) {
for (overriddenSymbol in symbol.getAllOverriddenSymbols()) {
val newVisibility = (overriddenSymbol as? KtSymbolWithVisibility)?.visibility
if (newVisibility != null) {
visibility = newVisibility
}
}
}
return visibility
}
internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): String =
visibility.toPsiVisibility(isTopLevel, forClass = false)
@@ -45,7 +45,7 @@ internal class FirLightAccessorMethodForSymbol(
val defaultName = containingPropertySymbol.name.identifier.let {
if (containingClass.isAnnotationType) it else it.abiName()
}
containingPropertySymbol.computeJvmMethodName(defaultName, containingClass, accessorSite)
containingPropertySymbol.computeJvmMethodName(defaultName, accessorSite)
}
}
@@ -110,8 +110,7 @@ internal class FirLightAccessorMethodForSymbol(
)
val visibility = isOverrideMethod.ifTrue {
(containingClass as? FirLightClassForSymbol)
?.tryGetEffectiveVisibility(containingPropertySymbol)
tryGetEffectiveVisibility(containingPropertySymbol)
?.toPsiVisibilityForMember(isTopLevel)
} ?: propertyAccessorSymbol.toPsiVisibilityForMember(isTopLevel)
modifiers.add(visibility)
@@ -81,13 +81,12 @@ internal abstract class FirLightMethod(
protected fun <T> T.computeJvmMethodName(
defaultName: String,
containingClass: FirLightClassBase,
annotationUseSiteTarget: AnnotationUseSiteTarget? = null
): String where T : KtAnnotatedSymbol, T : KtSymbolWithVisibility, T : KtCallableSymbol {
getJvmNameFromAnnotation(annotationUseSiteTarget)?.let { return it }
val effectiveVisibilityIfNotInternal = (visibility != Visibilities.Internal).ifTrue {
(containingClass as? FirLightClassForSymbol)?.tryGetEffectiveVisibility(this)
tryGetEffectiveVisibility(this)
} ?: this.visibility
if (effectiveVisibilityIfNotInternal != Visibilities.Internal) return defaultName
@@ -34,7 +34,7 @@ internal class FirLightSimpleMethodForSymbol(
) {
private val _name: String by lazyPub {
functionSymbol.computeJvmMethodName(functionSymbol.name.asString(), containingClass)
functionSymbol.computeJvmMethodName(functionSymbol.name.asString())
}
override fun getName(): String = _name
@@ -95,8 +95,7 @@ internal class FirLightSimpleMethodForSymbol(
)
val visibility: String = functionSymbol.isOverride.ifTrue {
(containingClass as? FirLightClassForSymbol)
?.tryGetEffectiveVisibility(functionSymbol)
tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibilityForMember(isTopLevel)
} ?: functionSymbol.toPsiVisibilityForMember(isTopLevel = isTopLevel)