FIR LC: use FirLightParameterList for setter parameter

to preserve the parent chain from setter parameter to setter
This commit is contained in:
Jinseong Jeon
2021-08-26 17:03:35 -07:00
committed by Ilya Kirillov
parent 5a63498963
commit dbce9b3d45
3 changed files with 29 additions and 34 deletions
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyAccessorSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySetterSymbol
import org.jetbrains.kotlin.idea.frontend.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
@@ -168,25 +169,18 @@ internal class FirLightAccessorMethodForSymbol(
private val _parametersList by lazyPub {
val builder = LightParameterListBuilder(manager, language)
FirLightParameterForReceiver.tryGet(containingPropertySymbol, this)?.let {
builder.addParameter(it)
}
val propertyParameter = (propertyAccessorSymbol as? KtPropertySetterSymbol)?.parameter
if (propertyParameter != null) {
builder.addParameter(
FirLightSetterParameterForSymbol(
parameterSymbol = propertyParameter,
containingPropertySymbol = containingPropertySymbol,
containingMethod = this@FirLightAccessorMethodForSymbol
FirLightParameterList(this, containingPropertySymbol) { builder ->
val propertyParameter = (propertyAccessorSymbol as? KtPropertySetterSymbol)?.parameter
if (propertyParameter != null) {
builder.addParameter(
FirLightSetterParameterForSymbol(
parameterSymbol = propertyParameter,
containingPropertySymbol = containingPropertySymbol,
containingMethod = this@FirLightAccessorMethodForSymbol
)
)
)
}
}
builder
}
override fun getParameterList(): PsiParameterList = _parametersList
@@ -31,7 +31,19 @@ internal abstract class FirLightMethodForSymbol(
override fun isVarArgs(): Boolean = _isVarArgs
private val _parametersList by lazyPub {
FirLightParameterList(this, functionSymbol, argumentsSkipMask)
FirLightParameterList(this, functionSymbol) { builder ->
functionSymbol.valueParameters.mapIndexed { index, parameter ->
val needToSkip = argumentsSkipMask?.get(index) == true
if (!needToSkip) {
builder.addParameter(
FirLightParameterForSymbol(
parameterSymbol = parameter,
containingMethod = this@FirLightMethodForSymbol
)
)
}
}
}
}
private val _identifier: PsiIdentifier by lazyPub {
@@ -11,18 +11,17 @@ import com.intellij.psi.impl.light.LightParameterListBuilder
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.idea.frontend.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.idea.frontend.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
import java.util.*
internal class FirLightParameterList(
private val parent: FirLightMethod,
private val functionSymbol: KtFunctionLikeSymbol,
argumentsSkipMask: BitSet? = null
private val callableSymbol: KtCallableSymbol,
parameterPopulator: (LightParameterListBuilder) -> Unit,
) : KtLightElement<KtParameterList, PsiParameterList>,
// With this, a parent chain is properly built: from FirLightParameter through FirLightParameterList to FirLightMethod
KtLightElementBase(parent),
@@ -35,21 +34,11 @@ internal class FirLightParameterList(
override val clsDelegate: PsiParameterList by lazyPub {
val builder = LightParameterListBuilder(manager, language)
FirLightParameterForReceiver.tryGet(functionSymbol, parent)?.let {
FirLightParameterForReceiver.tryGet(callableSymbol, parent)?.let {
builder.addParameter(it)
}
functionSymbol.valueParameters.mapIndexed { index, parameter ->
val needToSkip = argumentsSkipMask?.get(index) == true
if (!needToSkip) {
builder.addParameter(
FirLightParameterForSymbol(
parameterSymbol = parameter,
containingMethod = parent
)
)
}
}
parameterPopulator.invoke(builder)
builder
}