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:
committed by
Ilya Kirillov
parent
c1afb6354b
commit
ba8f2e6bf3
+4
-22
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
+68
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user