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.lifetime.isValid
import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind 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.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_NON_ORIGIN_METHOD 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.ENUM_VALUE_OF
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.light.classes.symbol.classes.* import org.jetbrains.kotlin.light.classes.symbol.classes.*
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -42,24 +40,6 @@ internal open class FirLightClassForSymbol(
require(classOrObjectSymbol.classKind != KtClassKind.INTERFACE && classOrObjectSymbol.classKind != KtClassKind.ANNOTATION_CLASS) 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 { private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel)) 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.annotations.*
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.components.DefaultTypeClassIds 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.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol 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.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.types.* import org.jetbrains.kotlin.analysis.api.types.*
import org.jetbrains.kotlin.asJava.elements.psiType 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 = internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): String =
visibility.toPsiVisibility(isTopLevel, forClass = false) visibility.toPsiVisibility(isTopLevel, forClass = false)
@@ -45,7 +45,7 @@ internal class FirLightAccessorMethodForSymbol(
val defaultName = containingPropertySymbol.name.identifier.let { val defaultName = containingPropertySymbol.name.identifier.let {
if (containingClass.isAnnotationType) it else it.abiName() 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 { val visibility = isOverrideMethod.ifTrue {
(containingClass as? FirLightClassForSymbol) tryGetEffectiveVisibility(containingPropertySymbol)
?.tryGetEffectiveVisibility(containingPropertySymbol)
?.toPsiVisibilityForMember(isTopLevel) ?.toPsiVisibilityForMember(isTopLevel)
} ?: propertyAccessorSymbol.toPsiVisibilityForMember(isTopLevel) } ?: propertyAccessorSymbol.toPsiVisibilityForMember(isTopLevel)
modifiers.add(visibility) modifiers.add(visibility)
@@ -81,13 +81,12 @@ internal abstract class FirLightMethod(
protected fun <T> T.computeJvmMethodName( protected fun <T> T.computeJvmMethodName(
defaultName: String, defaultName: String,
containingClass: FirLightClassBase,
annotationUseSiteTarget: AnnotationUseSiteTarget? = null annotationUseSiteTarget: AnnotationUseSiteTarget? = null
): String where T : KtAnnotatedSymbol, T : KtSymbolWithVisibility, T : KtCallableSymbol { ): String where T : KtAnnotatedSymbol, T : KtSymbolWithVisibility, T : KtCallableSymbol {
getJvmNameFromAnnotation(annotationUseSiteTarget)?.let { return it } getJvmNameFromAnnotation(annotationUseSiteTarget)?.let { return it }
val effectiveVisibilityIfNotInternal = (visibility != Visibilities.Internal).ifTrue { val effectiveVisibilityIfNotInternal = (visibility != Visibilities.Internal).ifTrue {
(containingClass as? FirLightClassForSymbol)?.tryGetEffectiveVisibility(this) tryGetEffectiveVisibility(this)
} ?: this.visibility } ?: this.visibility
if (effectiveVisibilityIfNotInternal != Visibilities.Internal) return defaultName if (effectiveVisibilityIfNotInternal != Visibilities.Internal) return defaultName
@@ -34,7 +34,7 @@ internal class FirLightSimpleMethodForSymbol(
) { ) {
private val _name: String by lazyPub { private val _name: String by lazyPub {
functionSymbol.computeJvmMethodName(functionSymbol.name.asString(), containingClass) functionSymbol.computeJvmMethodName(functionSymbol.name.asString())
} }
override fun getName(): String = _name override fun getName(): String = _name
@@ -95,8 +95,7 @@ internal class FirLightSimpleMethodForSymbol(
) )
val visibility: String = functionSymbol.isOverride.ifTrue { val visibility: String = functionSymbol.isOverride.ifTrue {
(containingClass as? FirLightClassForSymbol) tryGetEffectiveVisibility(functionSymbol)
?.tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibilityForMember(isTopLevel) ?.toPsiVisibilityForMember(isTopLevel)
} ?: functionSymbol.toPsiVisibilityForMember(isTopLevel = isTopLevel) } ?: functionSymbol.toPsiVisibilityForMember(isTopLevel = isTopLevel)