From cfc824f9f213005734956144cefcce92a0bf1591 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 22 Jun 2023 13:05:28 +0200 Subject: [PATCH] [FIR] Set vararg modifier on data class copy method parameters This only happens in red code, but it prevents unhelpful initializer type mismatch errors. --- .../StubBasedClassDeserialization.kt | 1 + .../resolve/suppress/withSuppression.fir.txt | 2 +- .../converter/AbstractLightTreeRawFirBuilder.kt | 3 +++ .../kotlin/fir/builder/PsiRawFirBuilder.kt | 3 +++ .../kotlin/fir/builder/AbstractRawFirBuilder.kt | 17 ++++++++++------- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt index bb4edf970f1..960419ec278 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt @@ -212,6 +212,7 @@ internal fun deserializeClassToSymbol( }, toFirSource = { src, kind -> KtFakeSourceElement(src as PsiElement, kind) }, addValueParameterAnnotations = { annotations += context.annotationDeserializer.loadAnnotations(it) }, + isVararg = { it.isVarArg } ) ) } diff --git a/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt b/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt index f99e8a22006..c65d5601c98 100644 --- a/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt @@ -31,6 +31,6 @@ FILE: withSuppression.kt public final operator fun component1(): R|kotlin/String| - public final fun copy(x: R|kotlin/String| = this@R|/D|.R|/D.x|): R|D| + public final fun copy(vararg x: R|kotlin/Array| = this@R|/D|.R|/D.x|): R|D| } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/AbstractLightTreeRawFirBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/AbstractLightTreeRawFirBuilder.kt index 2f66167093b..2bb6fa6c02e 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/AbstractLightTreeRawFirBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/AbstractLightTreeRawFirBuilder.kt @@ -132,6 +132,9 @@ abstract class AbstractLightTreeRawFirBuilder( override val LighterASTNode?.indexExpressions: List? get() = this?.getLastChildExpression()?.getChildrenAsArray()?.filterNotNull()?.filter { it.isExpression() } + override val LighterASTNode.isVararg: Boolean + get() = getChildNodeByType(KtNodeTypes.MODIFIER_LIST)?.getChildNodeByType(VARARG_KEYWORD) != null + fun LighterASTNode.getParent(): LighterASTNode? { return tree.getParent(this) } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index d053cd127d5..a8f16392a02 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -140,6 +140,9 @@ open class PsiRawFirBuilder( override val PsiElement?.indexExpressions: List? get() = (this as? KtArrayAccessExpression)?.indexExpressions + override val PsiElement.isVararg: Boolean + get() = (this as? KtParameter)?.isVarArg ?: false + private val KtModifierListOwner.visibility: Visibility get() = with(modifierList) { when { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt index cc09b5b4d5d..2639be90e52 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt @@ -63,6 +63,7 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context abstract val T?.selectorExpression: T? abstract val T?.arrayExpression: T? abstract val T?.indexExpressions: List? + abstract val T.isVararg: Boolean /**** Class name utils ****/ inline fun withChildClassName( @@ -901,6 +902,7 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context createParameterTypeRefWithSourceKind, { src, kind -> src?.toFirSourceElement(kind) }, addValueParameterAnnotations, + { it.isVararg }, ) ) } @@ -1028,21 +1030,22 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context } } -fun FirRegularClassBuilder.createDataClassCopyFunction( +fun FirRegularClassBuilder.createDataClassCopyFunction( classId: ClassId, - sourceElement: T, + sourceElement: TSource, dispatchReceiver: ConeClassLikeType?, - zippedParameters: List>, + zippedParameters: List>, createClassTypeRefWithSourceKind: (KtFakeSourceElementKind) -> FirTypeRef, createParameterTypeRefWithSourceKind: (FirProperty, KtFakeSourceElementKind) -> FirTypeRef, - toFirSource: (T?, KtFakeSourceElementKind) -> KtSourceElement?, - addValueParameterAnnotations: FirValueParameterBuilder.(T) -> Unit, + toFirSource: (TBase?, KtFakeSourceElementKind) -> KtSourceElement?, + addValueParameterAnnotations: FirValueParameterBuilder.(TParameter) -> Unit, + isVararg: (TParameter) -> Boolean, ): FirSimpleFunction { fun generateComponentAccess( parameterSource: KtSourceElement?, firProperty: FirProperty, classTypeRefWithCorrectSourceKind: FirTypeRef, - firPropertyReturnTypeRefWithCorrectSourceKind: FirTypeRef + firPropertyReturnTypeRefWithCorrectSourceKind: FirTypeRef, ) = buildPropertyAccessExpression { this.source = parameterSource @@ -1088,7 +1091,7 @@ fun FirRegularClassBuilder.createDataClassCopyFunction( defaultValue = generateComponentAccess(parameterSource, firProperty, classTypeRef, propertyReturnTypeRef) isCrossinline = false isNoinline = false - isVararg = false + this.isVararg = isVararg(ktParameter) addValueParameterAnnotations(ktParameter) for (annotation in annotations) { annotation.replaceUseSiteTarget(null)