[SLC] drop redundant resolve for visibility, fix several cases

^KTIJ-23783
This commit is contained in:
Dmitrii Gridin
2022-11-30 21:10:36 +01:00
committed by Space Team
parent 9970623e95
commit a8c111b304
5 changed files with 30 additions and 64 deletions
@@ -156,21 +156,15 @@ internal class SymbolLightAccessorMethod private constructor(
private fun computeModifiers(): Set<String> = analyzeForLightClasses(ktModule) {
val propertySymbol = propertySymbol()
val propertyAccessorSymbol = propertyAccessorSymbol()
val isOverrideMethod = propertyAccessorSymbol.isOverride || propertySymbol.isOverride
val isInterfaceMethod = containingClass.isInterface
val modifiers = mutableSetOf<String>()
propertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = isOverrideMethod || isInterfaceMethod,
suppressFinal = containingClass.isInterface || propertySymbol.isOverride,
result = modifiers,
)
val visibility = isOverrideMethod.ifTrue {
tryGetEffectiveVisibility(propertySymbol)?.toPsiVisibilityForMember()
} ?: propertyAccessorSymbol.toPsiVisibilityForMember()
modifiers.add(visibility)
modifiers.add(propertyAccessorSymbol.toPsiVisibilityForMember())
if (!suppressStatic &&
(propertySymbol.hasJvmStaticAnnotation() || propertyAccessorSymbol.hasJvmStaticAnnotation(accessorSite))
@@ -27,8 +27,6 @@ import org.jetbrains.kotlin.light.classes.symbol.SymbolLightMemberBase
import org.jetbrains.kotlin.light.classes.symbol.annotations.getJvmNameFromAnnotation
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasPublishedApiAnnotation
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.light.classes.symbol.tryGetEffectiveVisibility
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
internal abstract class SymbolLightMethodBase(
lightMemberOrigin: LightMemberOrigin?,
@@ -93,12 +91,7 @@ internal abstract class SymbolLightMethodBase(
annotationUseSiteTarget: AnnotationUseSiteTarget?,
): String where T : KtAnnotatedSymbol, T : KtSymbolWithVisibility, T : KtCallableSymbol {
getJvmNameFromAnnotation(annotationUseSiteTarget)?.let { return it }
val effectiveVisibilityIfNotInternal = (visibility != Visibilities.Internal).ifTrue {
tryGetEffectiveVisibility(this)
} ?: this.visibility
if (effectiveVisibilityIfNotInternal != Visibilities.Internal) return defaultName
if (visibility != Visibilities.Internal) return defaultName
if (containingClass is KtLightClassForFacade) return defaultName
if (hasPublishedApiAnnotation(annotationUseSiteTarget)) return defaultName
@@ -100,12 +100,7 @@ internal class SymbolLightSimpleMethod(
result = modifiers
)
val visibility: String = functionSymbol.isOverride.ifTrue {
tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibilityForMember()
} ?: functionSymbol.toPsiVisibilityForMember()
modifiers.add(visibility)
modifiers.add(functionSymbol.toPsiVisibilityForMember())
if (!suppressStatic && functionSymbol.hasJvmStaticAnnotation()) {
modifiers.add(PsiModifier.STATIC)
@@ -12,7 +12,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.*
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.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
@@ -89,64 +92,45 @@ internal fun KtSymbolWithModality.computeModalityForMethod(
if (this is KtFunctionSymbol && isExternal) {
result.add(PsiModifier.NATIVE)
}
if (isTopLevel) {
result.add(PsiModifier.STATIC)
val needFinalModifier = when (this) {
is KtPropertySymbol -> isDelegatedProperty || isVal
else -> true
}
if (needFinalModifier) {
result.add(PsiModifier.FINAL)
}
}
}
context(KtAnalysisSession)
internal fun PsiElement.tryGetEffectiveVisibility(symbol: KtCallableSymbol): Visibility? {
if (symbol !is KtPropertySymbol && symbol !is KtFunctionSymbol) return null
internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(): String = visibility.toPsiVisibilityForMember()
var visibility = (symbol as? KtSymbolWithVisibility)?.visibility
internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isNested: Boolean): String = visibility.toPsiVisibilityForClass(isNested)
for (overriddenSymbol in symbol.getAllOverriddenSymbols()) {
val newVisibility = (overriddenSymbol as? KtSymbolWithVisibility)?.visibility
if (newVisibility != null) {
visibility = newVisibility
}
}
return visibility
internal fun Visibility.toPsiVisibilityForMember(): String = when (this) {
Visibilities.Private, Visibilities.PrivateToThis -> PsiModifier.PRIVATE
Visibilities.Protected -> PsiModifier.PROTECTED
else -> PsiModifier.PUBLIC
}
internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(): String =
visibility.toPsiVisibilityForMember()
private fun Visibility.toPsiVisibilityForClass(isNested: Boolean): String = when (isNested) {
false -> when (this) {
Visibilities.Public,
Visibilities.Protected,
Visibilities.Local,
Visibilities.Internal -> PsiModifier.PUBLIC
internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isNested: Boolean): String =
visibility.toPsiVisibilityForClass(isNested)
internal fun Visibility.toPsiVisibilityForMember(): String =
when (this) {
Visibilities.Private, Visibilities.PrivateToThis -> PsiModifier.PRIVATE
Visibilities.Protected -> PsiModifier.PROTECTED
else -> PsiModifier.PUBLIC
else -> PsiModifier.PACKAGE_LOCAL
}
private fun Visibility.toPsiVisibilityForClass(isNested: Boolean): String {
return when (isNested) {
false -> when (this) {
Visibilities.Public,
Visibilities.Protected,
Visibilities.Local,
Visibilities.Internal -> PsiModifier.PUBLIC
else -> PsiModifier.PACKAGE_LOCAL
}
true -> when (this) {
Visibilities.Public, Visibilities.Internal, Visibilities.Local -> PsiModifier.PUBLIC
Visibilities.Protected -> PsiModifier.PROTECTED
Visibilities.Private -> PsiModifier.PRIVATE
else -> PsiModifier.PACKAGE_LOCAL
}
true -> when (this) {
Visibilities.Public, Visibilities.Internal, Visibilities.Local -> PsiModifier.PUBLIC
Visibilities.Protected -> PsiModifier.PROTECTED
Visibilities.Private -> PsiModifier.PRIVATE
else -> PsiModifier.PACKAGE_LOCAL
}
}
@@ -38,14 +38,14 @@ public final class Derived /* Derived*/ extends Base implements IntfWithProp {
private final int x = 3 /* initializer type: int */;
@java.lang.Override()
protected error.NonExistentClass v();// v()
public error.NonExistentClass v();// v()
@java.lang.Override()
public int abs();// abs()
public Derived(int);// .ctor(int)
public int getX$light_idea_test_case();// getX$light_idea_test_case()
public int getX();// getX()
}