diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt index 031ca4c5730..c5b7643cce6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt @@ -16,8 +16,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol -import org.jetbrains.kotlin.light.classes.symbol.parameters.FirLightParameterList -import org.jetbrains.kotlin.light.classes.symbol.parameters.FirLightSetterParameterForSymbol import org.jetbrains.kotlin.load.java.JvmAbi.getterName import org.jetbrains.kotlin.load.java.JvmAbi.setterName import org.jetbrains.kotlin.psi.KtDeclaration diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethodForSymbol.kt index 19bea42bfe5..b0dcda90fbe 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightMethodForSymbol.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.analysis.api.isValid import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol -import org.jetbrains.kotlin.light.classes.symbol.parameters.FirLightParameterList +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.psi.KtDeclaration import java.util.* @@ -43,6 +43,14 @@ internal abstract class FirLightMethodForSymbol( ) } } + if ((functionSymbol as? KtFunctionSymbol)?.isSuspend == true) { + builder.addParameter( + FirLightSuspendContinuationParameter( + functionSymbol = functionSymbol, + containingMethod = this@FirLightMethodForSymbol + ) + ) + } } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightParameterList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightParameterList.kt index 9e57c1b84a5..edcea61bf24 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightParameterList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightParameterList.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.light.classes.symbol.parameters +package org.jetbrains.kotlin.light.classes.symbol import com.intellij.psi.PsiParameter import com.intellij.psi.PsiParameterList @@ -12,9 +12,6 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightElementBase import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.light.classes.symbol.FirLightMethod -import org.jetbrains.kotlin.light.classes.symbol.FirLightParameterForReceiver -import org.jetbrains.kotlin.light.classes.symbol.FirLightParameterForSymbol import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtParameterList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSetterParameterForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSetterParameterForSymbol.kt index 8e0b988e205..70c92511afc 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSetterParameterForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSetterParameterForSymbol.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.light.classes.symbol.parameters +package org.jetbrains.kotlin.light.classes.symbol import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiModifierList @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.analysis.api.isValid import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol -import org.jetbrains.kotlin.light.classes.symbol.* internal class FirLightSetterParameterForSymbol( private val containingPropertySymbol: KtPropertySymbol, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSuspendContinuationParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSuspendContinuationParameter.kt new file mode 100644 index 00000000000..839f9b185b1 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/FirLightSuspendContinuationParameter.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.light.classes.symbol + +import com.intellij.psi.PsiIdentifier +import com.intellij.psi.PsiModifierList +import com.intellij.psi.PsiType +import org.jetbrains.annotations.NotNull +import org.jetbrains.kotlin.analysis.api.components.buildClassType +import org.jetbrains.kotlin.analysis.api.isValid +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThis +import org.jetbrains.kotlin.asJava.classes.lazyPub +import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME +import org.jetbrains.kotlin.name.StandardClassIds +import org.jetbrains.kotlin.psi.KtParameter + +internal class FirLightSuspendContinuationParameter( + private val functionSymbol: KtFunctionSymbol, + private val containingMethod: FirLightMethod, +) : FirLightParameter(containingMethod) { + override fun getName(): String = SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME + + override fun getNameIdentifier(): PsiIdentifier = _identifier + + private val _identifier: PsiIdentifier by lazyPub { + FirLightIdentifier(this, functionSymbol) + } + + override fun getType(): PsiType = _type + + private val _type by lazyPub { + analyzeWithSymbolAsContext(functionSymbol) { + buildClassType(StandardClassIds.Continuation) { + argument(functionSymbol.annotatedType.type) + }.asPsiType(this@FirLightSuspendContinuationParameter) + } ?: nonExistentType() + } + + override fun isVarArgs(): Boolean = false + + override fun getModifierList(): PsiModifierList = _modifierList + + private val _modifierList: PsiModifierList by lazyPub { + val annotations = + if (functionSymbol.visibility.isPrivateOrPrivateToThis()) emptyList() else + listOf( + FirLightSimpleAnnotation(NotNull::class.java.name, this@FirLightSuspendContinuationParameter) + ) + FirLightClassModifierList(this, emptySet(), annotations) + } + + override fun hasModifierProperty(p0: String): Boolean = false + + override val kotlinOrigin: KtParameter? = null + + override fun equals(other: Any?): Boolean = + this === other || + (other is FirLightSuspendContinuationParameter && functionSymbol == other.functionSymbol) + + override fun hashCode(): Int = functionSymbol.hashCode() * 31 + containingMethod.hashCode() + + override fun isValid(): Boolean = super.isValid() && functionSymbol.isValid() +}