diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethodForSymbol.kt index 12878baecd9..9e76674fe5a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethodForSymbol.kt @@ -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() -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterList.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterList.kt new file mode 100644 index 00000000000..04ae0cef665 --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterList.kt @@ -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, + // 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 { + return clsDelegate.parameters + } + + override fun getParameterIndex(p: PsiParameter): Int { + return clsDelegate.getParameterIndex(p) + } + + override fun getParametersCount(): Int { + return clsDelegate.parametersCount + } +}