diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolLightMemberBase.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolLightMemberBase.kt index f3da79e1af9..c38d8e17605 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolLightMemberBase.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolLightMemberBase.kt @@ -21,7 +21,7 @@ internal abstract class SymbolLightMemberBase( override val lightMemberOrigin: LightMemberOrigin?, private val containingClass: SymbolLightClassBase, ) : KtLightElementBase(containingClass), PsiMember, KtLightMember { - protected val ktModule: KtModule get() = containingClass.ktModule + val ktModule: KtModule get() = containingClass.ktModule override fun hasModifierProperty(name: String): Boolean = modifierList?.hasModifierProperty(name) ?: false diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethod.kt index a10207e5711..54e057acbf8 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethod.kt @@ -76,8 +76,9 @@ internal abstract class SymbolLightMethod( if ((functionSymbol as? KtFunctionSymbol)?.isSuspend == true) { builder.addParameter( + @Suppress("UNCHECKED_CAST") SymbolLightSuspendContinuationParameter( - functionSymbol = functionSymbol, + functionSymbolPointer = functionSymbolPointer as KtSymbolPointer, containingMethod = this@SymbolLightMethod, ) ) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt index a9733b85b66..d0d0f79a148 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt @@ -10,48 +10,52 @@ import com.intellij.psi.PsiModifierList import com.intellij.psi.PsiType import org.jetbrains.annotations.NotNull import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.components.buildClassType -import org.jetbrains.kotlin.analysis.api.lifetime.isValid import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThis +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME -import org.jetbrains.kotlin.light.classes.symbol.SymbolLightIdentifier import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.light.classes.symbol.nonExistentType +import org.jetbrains.kotlin.light.classes.symbol.restoreSymbolOrThrowIfDisposed import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.KtParameter -context(KtAnalysisSession) internal class SymbolLightSuspendContinuationParameter( - private val functionSymbol: KtFunctionSymbol, + private val functionSymbolPointer: KtSymbolPointer, private val containingMethod: SymbolLightMethodBase, ) : SymbolLightParameterBase(containingMethod) { + private val ktModule get() = containingMethod.ktModule + + private inline fun withFunctionSymbol(crossinline action: context(KtAnalysisSession) (KtFunctionSymbol) -> T): T { + return analyze(ktModule) { + action(this, functionSymbolPointer.restoreSymbolOrThrowIfDisposed()) + } + } + override fun getName(): String = SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME - override fun getNameIdentifier(): PsiIdentifier = _identifier - - private val _identifier: PsiIdentifier by lazyPub { - SymbolLightIdentifier(this, functionSymbol) - } + override fun getNameIdentifier(): PsiIdentifier? = null override fun getType(): PsiType = _type private val _type by lazyPub { - buildClassType(StandardClassIds.Continuation) { argument(functionSymbol.returnType) } - .asPsiType(this) - ?: nonExistentType() + withFunctionSymbol { functionSymbol -> + buildClassType(StandardClassIds.Continuation) { argument(functionSymbol.returnType) }.asPsiType(this) ?: nonExistentType() + } } override fun isVarArgs(): Boolean = false override fun getModifierList(): PsiModifierList = _modifierList - private val _modifierList: PsiModifierList by lazyPub { + private val _modifierList: PsiModifierList by lazy { val lazyAnnotations = lazy { - if (functionSymbol.visibility.isPrivateOrPrivateToThis()) + if (withFunctionSymbol { it.visibility.isPrivateOrPrivateToThis() }) emptyList() else listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter)) @@ -64,11 +68,13 @@ internal class SymbolLightSuspendContinuationParameter( override val kotlinOrigin: KtParameter? = null - override fun equals(other: Any?): Boolean = - this === other || - (other is SymbolLightSuspendContinuationParameter && functionSymbol == other.functionSymbol) + override fun equals(other: Any?): Boolean = this === other || + other is SymbolLightSuspendContinuationParameter && + containingMethod == other.containingMethod - override fun hashCode(): Int = functionSymbol.hashCode() * 31 + containingMethod.hashCode() + override fun hashCode(): Int = name.hashCode() * 31 + containingMethod.hashCode() - override fun isValid(): Boolean = super.isValid() && functionSymbol.isValid() + override fun isValid(): Boolean = super.isValid() && analyze(ktModule) { + functionSymbolPointer.restoreSymbol() != null + } }