FIR LC: populate continuation parameter for suspend function

This commit is contained in:
Jinseong Jeon
2021-10-19 23:08:06 -07:00
committed by Ilya Kirillov
parent 98791000bf
commit 5ed9cac0cc
5 changed files with 78 additions and 9 deletions
@@ -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
@@ -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
)
)
}
}
}
@@ -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
@@ -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,
@@ -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()
}