diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt index d08a397bd44..2c1bbb0638c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt @@ -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, classOrObjectSymbol: KtNamedClassOrObjectSymbol) { + private fun addInstanceFieldIfNeeded(result: MutableList) { if (isNamedObject && !isLocal) { result.add( SymbolLightFieldForObject( - objectSymbol = classOrObjectSymbol, + objectDeclaration = classOrObject as KtObjectDeclaration, containingClass = this@SymbolLightClass, name = JvmAbi.INSTANCE_FIELD, lightMemberOrigin = null diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt index 9157c218288..e86489060e6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt @@ -136,16 +136,14 @@ abstract class SymbolLightClassForClassOrObject(protected val classOrObject: KtC } } - protected fun addCompanionObjectFieldIfNeeded( - result: MutableList, - ): Unit = withNamedClassOrObjectSymbol { classOrObjectSymbol -> - classOrObjectSymbol.companionObject?.run { + protected fun addCompanionObjectFieldIfNeeded(result: MutableList) { + 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, ) ) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt index 743b3c469e0..7e910def353 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt @@ -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 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 }