FIR LC: introduce FirLightParameterList

LightParameterListBuilder, as a subtype of PsiParameterList, is good
enough for LightMethod's parameter list abstraction. However, it does
not have a parent link, which bothers upward conversion in UAST
(a.k.a. convertParent APIs). So we need an abstraction similar to
KtLightParameterList (in FE 1.0 LC).
This commit is contained in:
Jinseong Jeon
2021-07-30 00:34:02 -07:00
committed by Ilya Kirillov
parent c1afb6354b
commit ba8f2e6bf3
2 changed files with 72 additions and 22 deletions
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.*
import com.intellij.psi.impl.light.LightParameterListBuilder
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.idea.asJava.parameters.FirLightParameterList
import org.jetbrains.kotlin.idea.frontend.api.isValid
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.psi.KtDeclaration
import java.util.*
import java.util.BitSet
internal abstract class FirLightMethodForSymbol(
private val functionSymbol: KtFunctionLikeSymbol,
@@ -31,25 +31,7 @@ internal abstract class FirLightMethodForSymbol(
override fun isVarArgs(): Boolean = _isVarArgs
private val _parametersList by lazyPub {
val builder = LightParameterListBuilder(manager, language)
FirLightParameterForReceiver.tryGet(functionSymbol, this)?.let {
builder.addParameter(it)
}
functionSymbol.valueParameters.mapIndexed { index, parameter ->
val needToSkip = argumentsSkipMask?.get(index) == true
if (!needToSkip) {
builder.addParameter(
FirLightParameterForSymbol(
parameterSymbol = parameter,
containingMethod = this@FirLightMethodForSymbol
)
)
}
}
builder
FirLightParameterList(this, functionSymbol, argumentsSkipMask)
}
private val _identifier: PsiIdentifier by lazyPub {
@@ -63,4 +45,4 @@ internal abstract class FirLightMethodForSymbol(
override val kotlinOrigin: KtDeclaration? = functionSymbol.psi as? KtDeclaration
override fun isValid(): Boolean = super.isValid() && functionSymbol.isValid()
}
}
@@ -0,0 +1,68 @@
/*
* 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.idea.asJava.parameters
import com.intellij.psi.PsiParameter
import com.intellij.psi.PsiParameterList
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.asJava.FirLightMethod
import org.jetbrains.kotlin.idea.asJava.FirLightParameterForReceiver
import org.jetbrains.kotlin.idea.asJava.FirLightParameterForSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtParameterList
import java.util.BitSet
internal class FirLightParameterList(
private val parent: FirLightMethod,
private val functionSymbol: KtFunctionLikeSymbol,
argumentsSkipMask: BitSet? = null
) : KtLightElement<KtParameterList, PsiParameterList>,
// With this, a parent chain is properly built: from FirLightParameter through FirLightParameterList to FirLightMethod
KtLightElementBase(parent),
// NB: we can't use delegation here, which will conflict getTextRange from KtLightElementBase
PsiParameterList {
override val kotlinOrigin: KtParameterList?
get() = (parent.kotlinOrigin as? KtFunction)?.valueParameterList
override val clsDelegate: PsiParameterList by lazyPub {
val builder = LightParameterListBuilder(manager, language)
FirLightParameterForReceiver.tryGet(functionSymbol, 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
)
)
}
}
builder
}
override fun getParameters(): Array<PsiParameter> {
return clsDelegate.parameters
}
override fun getParameterIndex(p: PsiParameter): Int {
return clsDelegate.getParameterIndex(p)
}
override fun getParametersCount(): Int {
return clsDelegate.parametersCount
}
}