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 b0bdb536e51..4f6ac171f09 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 @@ -14,6 +14,8 @@ import com.intellij.psi.stubs.StubElement import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointer import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.asJava.classes.getParentForLocalDeclaration import org.jetbrains.kotlin.asJava.classes.lazyPub @@ -28,6 +30,7 @@ import org.jetbrains.kotlin.light.classes.symbol.basicIsEquivalentTo import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForObject import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForProperty import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightTypeParameterList +import org.jetbrains.kotlin.light.classes.symbol.withSymbol import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassBody @@ -42,10 +45,11 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs abstract class SymbolLightClassForClassOrObject(protected val classOrObject: KtClassOrObject, ktModule: KtModule) : SymbolLightClassBase(ktModule, classOrObject.manager), StubBasedPsiElement> { - protected fun withClassOrObjectSymbol(action: KtAnalysisSession.(KtClassOrObjectSymbol) -> T): T = - analyzeForLightClasses(ktModule) { - action(requireNotNull(classOrObject.getClassOrObjectSymbol())) - } + private val classOrObjectSymbolPointer: KtSymbolPointer = classOrObject.symbolPointer() + + protected fun withClassOrObjectSymbol(action: KtAnalysisSession.(KtClassOrObjectSymbol) -> T): T { + return classOrObjectSymbolPointer.withSymbol(ktModule, action) + } protected fun withNamedClassOrObjectSymbol(action: KtAnalysisSession.(KtNamedClassOrObjectSymbol) -> T): T = analyzeForLightClasses(ktModule) { @@ -82,12 +86,12 @@ abstract class SymbolLightClassForClassOrObject(protected val classOrObject: KtC private val _typeParameterList: PsiTypeParameterList? by lazyPub { hasTypeParameters().ifTrue { - withClassOrObjectSymbol { - SymbolLightTypeParameterList( - owner = this@SymbolLightClassForClassOrObject, - symbolWithTypeParameterList = it, - ) - } + SymbolLightTypeParameterList( + owner = this, + symbolWithTypeParameterPointer = classOrObjectSymbolPointer, + ktModule = ktModule, + ktDeclaration = classOrObject, + ) } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt index 6c394b7af72..3c55f725090 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt @@ -89,12 +89,12 @@ internal class SymbolLightAccessorMethod( private val _typeParameterList: PsiTypeParameterList? by lazyPub { hasTypeParameters().ifTrue { - analyzeForLightClasses(ktModule) { - SymbolLightTypeParameterList( - owner = this@SymbolLightAccessorMethod, - symbolWithTypeParameterList = propertySymbol(), - ) - } + SymbolLightTypeParameterList( + owner = this, + symbolWithTypeParameterPointer = containingPropertySymbolPointer, + ktModule = ktModule, + ktDeclaration = containingPropertyDeclaration, + ) } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt index 39eab14e98c..4afda71a2f6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt @@ -51,12 +51,12 @@ internal class SymbolLightSimpleMethod( private val _typeParameterList: PsiTypeParameterList? by lazyPub { hasTypeParameters().ifTrue { - withFunctionSymbol { functionSymbol -> - SymbolLightTypeParameterList( - owner = this@SymbolLightSimpleMethod, - symbolWithTypeParameterList = functionSymbol, - ) - } + SymbolLightTypeParameterList( + owner = this, + symbolWithTypeParameterPointer = functionSymbolPointer, + ktModule = ktModule, + ktDeclaration = functionDeclaration, + ) } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightTypeParameterList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightTypeParameterList.kt index 0abfcf0f91e..c86c8e9e54a 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightTypeParameterList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightTypeParameterList.kt @@ -8,18 +8,22 @@ package org.jetbrains.kotlin.light.classes.symbol.parameters import com.intellij.psi.* import com.intellij.psi.impl.light.LightElement import com.intellij.psi.scope.PsiScopeProcessor -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.light.classes.symbol.basicIsEquivalentTo +import org.jetbrains.kotlin.light.classes.symbol.compareSymbolPointers +import org.jetbrains.kotlin.light.classes.symbol.withSymbol +import org.jetbrains.kotlin.psi.KtTypeParameterListOwner -context(KtAnalysisSession) internal class SymbolLightTypeParameterList( internal val owner: PsiTypeParameterListOwner, - private val symbolWithTypeParameterList: KtSymbolWithTypeParameters, + private val symbolWithTypeParameterPointer: KtSymbolPointer, + internal val ktModule: KtModule, + private val ktDeclaration: KtTypeParameterListOwner?, ) : LightElement(owner.manager, KotlinLanguage.INSTANCE), PsiTypeParameterList { - override fun accept(visitor: PsiElementVisitor) { if (visitor is JavaElementVisitor) { visitor.visitTypeParameterList(this) @@ -33,39 +37,45 @@ internal class SymbolLightTypeParameterList( state: ResolveState, lastParent: PsiElement?, place: PsiElement - ): Boolean { - return typeParameters.all { processor.execute(it, state) } - } + ): Boolean = typeParameters.all { processor.execute(it, state) } private val _typeParameters: Array by lazyPub { - symbolWithTypeParameterList.typeParameters.mapIndexed { index, parameter -> - SymbolLightTypeParameter( - parent = this@SymbolLightTypeParameterList, - index = index, - typeParameterSymbol = parameter - ) - }.toTypedArray() + symbolWithTypeParameterPointer.withSymbol(ktModule) { + it.typeParameters.mapIndexed { index, parameter -> + SymbolLightTypeParameter( + parent = this, + index = index, + typeParameterSymbol = parameter, + ) + }.toTypedArray() + } } override fun getTypeParameters(): Array = _typeParameters - override fun getTypeParameterIndex(typeParameter: PsiTypeParameter?): Int = - _typeParameters.indexOf(typeParameter) + override fun getTypeParameterIndex(typeParameter: PsiTypeParameter?): Int = _typeParameters.indexOf(typeParameter) override fun toString(): String = "SymbolLightTypeParameterList" - override fun equals(other: Any?): Boolean = - this === other || - (other is SymbolLightTypeParameterList && symbolWithTypeParameterList == other.symbolWithTypeParameterList) + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is SymbolLightTypeParameterList || other.ktModule != ktModule) return false + if (ktDeclaration != null) { + return other.ktDeclaration == ktDeclaration + } - override fun hashCode(): Int = symbolWithTypeParameterList.hashCode() + return other.ktDeclaration == null && + compareSymbolPointers(ktModule, symbolWithTypeParameterPointer, other.symbolWithTypeParameterPointer) && + other.owner == owner + } - override fun isEquivalentTo(another: PsiElement?): Boolean = - basicIsEquivalentTo(this, another) + override fun hashCode(): Int = ktDeclaration.hashCode() + 1 + + override fun isEquivalentTo(another: PsiElement?): Boolean = basicIsEquivalentTo(this, another) override fun getParent(): PsiElement = owner override fun getContainingFile(): PsiFile = parent.containingFile - override fun getText(): String? = "" - override fun getTextOffset(): Int = 0 - override fun getStartOffsetInParent(): Int = 0 + override fun getText(): String? = ktDeclaration?.typeParameterList?.text + override fun getTextOffset(): Int = ktDeclaration?.typeParameterList?.textOffset ?: -1 + override fun getStartOffsetInParent(): Int = ktDeclaration?.typeParameterList?.startOffsetInParent ?: -1 }