[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.name.Name
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.psi.*
import org.jetbrains.kotlin.resolve.DataClassResolver
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
@@ -222,7 +219,7 @@ internal open class SymbolLightClass(classOrObject: KtClassOrObject, ktModule: K
addPropertyBackingFields(result, classOrObjectSymbol)
// Next, add INSTANCE field if non-local named object
addInstanceFieldIfNeeded(result, classOrObjectSymbol)
addInstanceFieldIfNeeded(result)
// Last, add fields for enum entries
addFieldsForEnumEntries(result, classOrObjectSymbol)
@@ -269,12 +266,11 @@ internal open class SymbolLightClass(classOrObject: KtClassOrObject, ktModule: K
propertyGroups[false]?.forEach(::addPropertyBackingField)
}
context(KtAnalysisSession)
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>, classOrObjectSymbol: KtNamedClassOrObjectSymbol) {
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
if (isNamedObject && !isLocal) {
result.add(
SymbolLightFieldForObject(
objectSymbol = classOrObjectSymbol,
objectDeclaration = classOrObject as KtObjectDeclaration,
containingClass = this@SymbolLightClass,
name = JvmAbi.INSTANCE_FIELD,
lightMemberOrigin = null
@@ -136,16 +136,14 @@ abstract class SymbolLightClassForClassOrObject(protected val classOrObject: KtC
}
}
protected fun addCompanionObjectFieldIfNeeded(
result: MutableList<KtLightField>,
): Unit = withNamedClassOrObjectSymbol { classOrObjectSymbol ->
classOrObjectSymbol.companionObject?.run {
protected fun addCompanionObjectFieldIfNeeded(result: MutableList<KtLightField>) {
classOrObject.companionObjects.forEach {
result.add(
SymbolLightFieldForObject(
objectSymbol = this,
objectDeclaration = it,
containingClass = this@SymbolLightClassForClassOrObject,
name = name.asString(),
lightMemberOrigin = null
name = it.name ?: return@forEach,
lightMemberOrigin = null,
)
)
}
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.light.classes.symbol.fields
import com.intellij.psi.*
import org.jetbrains.annotations.NotNull
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.asJava.builder.LightMemberOrigin
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.annotations.SymbolLightSimpleAnnotation
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.nonExistentType
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(
private val objectSymbol: KtNamedClassOrObjectSymbol,
private val objectDeclaration: KtObjectDeclaration,
containingClass: KtLightClass,
private val name: String,
lightMemberOrigin: 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
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)
SymbolLightMemberModifierList(this, modifiers, listOf(notNullAnnotation))
}
private val _isDeprecated: Boolean by lazyPub {
objectSymbol.hasDeprecatedAnnotation()
withObjectDeclarationSymbol { objectSymbol ->
objectSymbol.hasDeprecatedAnnotation()
}
}
override fun isDeprecated(): Boolean = _isDeprecated
override fun getModifierList(): PsiModifierList? = _modifierList
override fun getModifierList(): PsiModifierList = _modifierList
private val _type: PsiType by lazyPub {
objectSymbol.buildSelfClassType().asPsiType(this@SymbolLightFieldForObject)
?: nonExistentType()
withObjectDeclarationSymbol { objectSymbol ->
objectSymbol.buildSelfClassType().asPsiType(this@SymbolLightFieldForObject)
} ?: nonExistentType()
}
private val _identifier: PsiIdentifier by lazyPub {
SymbolLightIdentifier(this, objectSymbol)
withObjectDeclarationSymbol { objectSymbol ->
SymbolLightIdentifier(this@SymbolLightFieldForObject, objectSymbol)
}
}
override fun getNameIdentifier(): PsiIdentifier = _identifier
override fun getType(): PsiType = _type
override fun getInitializer(): PsiExpression? = null //TODO
override fun equals(other: Any?): Boolean =
this === other ||
(other is SymbolLightFieldForObject &&
kotlinOrigin == other.kotlinOrigin &&
objectSymbol == other.objectSymbol)
this === other || other is SymbolLightFieldForObject && objectDeclaration == other.objectDeclaration
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
}