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.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))
|
||||||
|
|||||||
+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.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)
|
||||||
|
|||||||
+2
-3
@@ -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)
|
||||||
|
|||||||
+1
-2
@@ -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
|
||||||
|
|||||||
+2
-3
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user