FIR LC: utilize effective visibility retrieval for (overridden) members
This commit is contained in:
committed by
Ilya Kirillov
parent
992ef3db44
commit
c79601e616
-20
@@ -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))
|
||||
|
||||
+19
@@ -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)
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
+1
-2
@@ -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
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user