[SLC] drop KtAnalysisSession from SymbolLightFieldForObject

^KT-54051
This commit is contained in:
Dmitrii Gridin
2022-09-30 23:09:06 +02:00
committed by Space Team
parent d57f3c6d18
commit b6baa1e3f6
3 changed files with 36 additions and 33 deletions
@@ -35,10 +35,7 @@ import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForClass
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
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.*
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.DataClassResolver
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
@@ -222,7 +219,7 @@ internal open class SymbolLightClass(classOrObject: KtClassOrObject, ktModule: K
addPropertyBackingFields(result, classOrObjectSymbol) addPropertyBackingFields(result, classOrObjectSymbol)
// Next, add INSTANCE field if non-local named object // Next, add INSTANCE field if non-local named object
addInstanceFieldIfNeeded(result, classOrObjectSymbol) addInstanceFieldIfNeeded(result)
// Last, add fields for enum entries // Last, add fields for enum entries
addFieldsForEnumEntries(result, classOrObjectSymbol) addFieldsForEnumEntries(result, classOrObjectSymbol)
@@ -269,12 +266,11 @@ internal open class SymbolLightClass(classOrObject: KtClassOrObject, ktModule: K
propertyGroups[false]?.forEach(::addPropertyBackingField) propertyGroups[false]?.forEach(::addPropertyBackingField)
} }
context(KtAnalysisSession) private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>, classOrObjectSymbol: KtNamedClassOrObjectSymbol) {
if (isNamedObject && !isLocal) { if (isNamedObject && !isLocal) {
result.add( result.add(
SymbolLightFieldForObject( SymbolLightFieldForObject(
objectSymbol = classOrObjectSymbol, objectDeclaration = classOrObject as KtObjectDeclaration,
containingClass = this@SymbolLightClass, containingClass = this@SymbolLightClass,
name = JvmAbi.INSTANCE_FIELD, name = JvmAbi.INSTANCE_FIELD,
lightMemberOrigin = null lightMemberOrigin = null
@@ -136,16 +136,14 @@ abstract class SymbolLightClassForClassOrObject(protected val classOrObject: KtC
} }
} }
protected fun addCompanionObjectFieldIfNeeded( protected fun addCompanionObjectFieldIfNeeded(result: MutableList<KtLightField>) {
result: MutableList<KtLightField>, classOrObject.companionObjects.forEach {
): Unit = withNamedClassOrObjectSymbol { classOrObjectSymbol ->
classOrObjectSymbol.companionObject?.run {
result.add( result.add(
SymbolLightFieldForObject( SymbolLightFieldForObject(
objectSymbol = this, objectDeclaration = it,
containingClass = this@SymbolLightClassForClassOrObject, containingClass = this@SymbolLightClassForClassOrObject,
name = name.asString(), name = it.name ?: return@forEach,
lightMemberOrigin = null lightMemberOrigin = null,
) )
) )
} }
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.light.classes.symbol.fields
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.NotNull
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.lifetime.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClass
@@ -16,60 +15,70 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.light.classes.symbol.SymbolLightIdentifier import org.jetbrains.kotlin.light.classes.symbol.SymbolLightIdentifier
import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation
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.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.light.classes.symbol.nonExistentType import org.jetbrains.kotlin.light.classes.symbol.nonExistentType
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtObjectDeclaration
context(KtAnalysisSession)
internal class SymbolLightFieldForObject( internal class SymbolLightFieldForObject(
private val objectSymbol: KtNamedClassOrObjectSymbol, private val objectDeclaration: KtObjectDeclaration,
containingClass: KtLightClass, containingClass: KtLightClass,
private val name: String, private val name: String,
lightMemberOrigin: LightMemberOrigin?, lightMemberOrigin: LightMemberOrigin?,
) : SymbolLightField(containingClass, lightMemberOrigin) { ) : SymbolLightField(containingClass, lightMemberOrigin) {
private fun <T> withObjectDeclarationSymbol(action: KtAnalysisSession.(KtNamedClassOrObjectSymbol) -> T): T =
analyzeForLightClasses(objectDeclaration) {
val namedClassOrObjectSymbol = objectDeclaration.getNamedClassOrObjectSymbol()
require(namedClassOrObjectSymbol != null)
action(namedClassOrObjectSymbol)
}
override val kotlinOrigin: KtDeclaration? = objectSymbol.psi as? KtDeclaration override val kotlinOrigin: KtObjectDeclaration = objectDeclaration
override fun getName(): String = name override fun getName(): String = name
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val modifiers = setOf(objectSymbol.toPsiVisibilityForMember(), PsiModifier.STATIC, PsiModifier.FINAL) val modifiers = withObjectDeclarationSymbol { objectSymbol ->
setOf(objectSymbol.toPsiVisibilityForMember(), PsiModifier.STATIC, PsiModifier.FINAL)
}
val notNullAnnotation = SymbolLightSimpleAnnotation(NotNull::class.java.name, this) val notNullAnnotation = SymbolLightSimpleAnnotation(NotNull::class.java.name, this)
SymbolLightMemberModifierList(this, modifiers, listOf(notNullAnnotation)) SymbolLightMemberModifierList(this, modifiers, listOf(notNullAnnotation))
} }
private val _isDeprecated: Boolean by lazyPub { private val _isDeprecated: Boolean by lazyPub {
objectSymbol.hasDeprecatedAnnotation() withObjectDeclarationSymbol { objectSymbol ->
objectSymbol.hasDeprecatedAnnotation()
}
} }
override fun isDeprecated(): Boolean = _isDeprecated override fun isDeprecated(): Boolean = _isDeprecated
override fun getModifierList(): PsiModifierList? = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _type: PsiType by lazyPub { private val _type: PsiType by lazyPub {
objectSymbol.buildSelfClassType().asPsiType(this@SymbolLightFieldForObject) withObjectDeclarationSymbol { objectSymbol ->
?: nonExistentType() objectSymbol.buildSelfClassType().asPsiType(this@SymbolLightFieldForObject)
} ?: nonExistentType()
} }
private val _identifier: PsiIdentifier by lazyPub { private val _identifier: PsiIdentifier by lazyPub {
SymbolLightIdentifier(this, objectSymbol) withObjectDeclarationSymbol { objectSymbol ->
SymbolLightIdentifier(this@SymbolLightFieldForObject, objectSymbol)
}
} }
override fun getNameIdentifier(): PsiIdentifier = _identifier override fun getNameIdentifier(): PsiIdentifier = _identifier
override fun getType(): PsiType = _type override fun getType(): PsiType = _type
override fun getInitializer(): PsiExpression? = null //TODO override fun getInitializer(): PsiExpression? = null //TODO
override fun equals(other: Any?): Boolean = override fun equals(other: Any?): Boolean =
this === other || this === other || other is SymbolLightFieldForObject && objectDeclaration == other.objectDeclaration
(other is SymbolLightFieldForObject &&
kotlinOrigin == other.kotlinOrigin &&
objectSymbol == other.objectSymbol)
override fun hashCode(): Int = kotlinOrigin.hashCode() override fun hashCode(): Int = objectDeclaration.hashCode()
override fun isValid(): Boolean = super.isValid() && objectSymbol.isValid() override fun isValid(): Boolean = objectDeclaration.isValid
} }