[SLC] drop KtAnalysisSession from SymbolLightFieldForEnumEntry

^KT-54051
This commit is contained in:
Dmitrii Gridin
2022-09-30 23:02:26 +02:00
committed by Space Team
parent ec569b3fa3
commit d57f3c6d18
2 changed files with 40 additions and 27 deletions
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.resolve.DataClassResolver
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
@@ -287,7 +288,11 @@ internal open class SymbolLightClass(classOrObject: KtClassOrObject, ktModule: K
if (isEnum) {
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtEnumEntrySymbol>()
.mapTo(result) { SymbolLightFieldForEnumEntry(it, this@SymbolLightClass, null) }
.mapNotNullTo(result) {
val enumEntry = it.psiSafe<KtEnumEntry>()
val name = enumEntry?.name ?: return@mapNotNullTo null
SymbolLightFieldForEnumEntry(enumEntry, name, this@SymbolLightClass, null)
}
}
}
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.light.classes.symbol.fields
import com.intellij.psi.*
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.lifetime.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.cannotModify
@@ -18,53 +17,59 @@ import org.jetbrains.kotlin.light.classes.symbol.SymbolLightIdentifier
import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClass
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForEnumEntry
import org.jetbrains.kotlin.light.classes.symbol.classes.analyzeForLightClasses
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.light.classes.symbol.nonExistentType
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
context(KtAnalysisSession)
internal class SymbolLightFieldForEnumEntry(
private val enumEntrySymbol: KtEnumEntrySymbol,
private val enumEntry: KtEnumEntry,
private val enumEntryName: String,
containingClass: SymbolLightClass,
override val lightMemberOrigin: LightMemberOrigin?
) : SymbolLightField(containingClass, lightMemberOrigin), PsiEnumConstant {
private fun <T> withEnumEntrySymbol(action: KtAnalysisSession.(KtEnumEntrySymbol) -> T): T = analyzeForLightClasses(enumEntry) {
action(enumEntry.getEnumEntrySymbol())
}
private val _modifierList by lazyPub {
SymbolLightMemberModifierList(
containingDeclaration = this@SymbolLightFieldForEnumEntry,
modifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC),
annotations = enumEntrySymbol.computeAnnotations(
this,
nullability = NullabilityType.Unknown, // there is no need to add nullability annotations on enum entries
annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD
)
annotations = withEnumEntrySymbol { enumEntrySymbol ->
enumEntrySymbol.computeAnnotations(
this@SymbolLightFieldForEnumEntry,
nullability = NullabilityType.Unknown, // there is no need to add nullability annotations on enum entries
annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD
)
}
)
}
override fun getModifierList(): PsiModifierList = _modifierList
override val kotlinOrigin: KtEnumEntry? = enumEntrySymbol.psi as? KtEnumEntry
override val kotlinOrigin: KtEnumEntry = enumEntry
override fun isDeprecated(): Boolean = false
//TODO Make with KtSymbols
private val hasBody: Boolean get() = kotlinOrigin?.let { it.body != null } ?: true
private val hasBody: Boolean get() = enumEntry.body != null
private val _initializingClass: PsiEnumConstantInitializer? by lazyPub {
hasBody.ifTrue {
SymbolLightClassForEnumEntry(
enumEntrySymbol = enumEntrySymbol,
enumConstant = this@SymbolLightFieldForEnumEntry,
enumClass = containingClass,
ktModule = enumEntrySymbol.getContainingModule(),
)
withEnumEntrySymbol { enumEntrySymbol ->
SymbolLightClassForEnumEntry(
enumEntrySymbol = enumEntrySymbol,
enumConstant = this@SymbolLightFieldForEnumEntry,
enumClass = containingClass,
ktModule = enumEntrySymbol.getContainingModule(),
)
}
}
}
override fun getInitializingClass(): PsiEnumConstantInitializer? = _initializingClass
override fun getOrCreateInitializingClass(): PsiEnumConstantInitializer =
_initializingClass ?: cannotModify()
override fun getOrCreateInitializingClass(): PsiEnumConstantInitializer = _initializingClass ?: cannotModify()
override fun getArgumentList(): PsiExpressionList? = null
override fun resolveMethod(): PsiMethod? = null
@@ -75,25 +80,28 @@ internal class SymbolLightFieldForEnumEntry(
override fun hasInitializer() = true
override fun computeConstantValue() = this
override fun getName(): String = enumEntrySymbol.name.asString()
override fun getName(): String = enumEntryName
private val _type: PsiType by lazyPub {
enumEntrySymbol.returnType.asPsiType(this@SymbolLightFieldForEnumEntry) ?: nonExistentType()
withEnumEntrySymbol { enumEntrySymbol ->
enumEntrySymbol.returnType.asPsiType(this@SymbolLightFieldForEnumEntry) ?: nonExistentType()
}
}
override fun getType(): PsiType = _type
override fun getInitializer(): PsiExpression? = null
override fun hashCode(): Int = enumEntrySymbol.hashCode()
private val _identifier: PsiIdentifier by lazyPub {
SymbolLightIdentifier(this, enumEntrySymbol)
withEnumEntrySymbol { enumEntrySymbol ->
SymbolLightIdentifier(this@SymbolLightFieldForEnumEntry, enumEntrySymbol)
}
}
override fun getNameIdentifier(): PsiIdentifier = _identifier
override fun isValid(): Boolean = super.isValid() && enumEntrySymbol.isValid()
override fun isValid(): Boolean = enumEntry.isValid
override fun hashCode(): Int = enumEntry.hashCode()
override fun equals(other: Any?): Boolean = other is SymbolLightFieldForEnumEntry && enumEntrySymbol == other.enumEntrySymbol
override fun equals(other: Any?): Boolean = other is SymbolLightFieldForEnumEntry && enumEntry == other.enumEntry
}