diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt index be368e13392..717224f02c4 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt @@ -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)) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/firLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/firLightUtils.kt index de2ffaf60ce..66ce0ef266c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/firLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/firLightUtils.kt @@ -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) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt index de67729c435..1716a09683f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt @@ -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) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethod.kt index 9e6c70c9733..66da425e9c7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethod.kt @@ -81,13 +81,12 @@ internal abstract class FirLightMethod( protected fun 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 diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt index d213c0c5381..5fac26950e7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt @@ -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)