From f1e5a9b2233d2e71283ae0de8fa545cde4a6429f Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 6 Sep 2023 18:31:42 +0200 Subject: [PATCH] [FIR builder] create error types for vararg parameters correctly Otherwise, such types are treated as resolved, but anyway requires transformation on type phase. Also, this commit drops the redundant duplicated transformation of typeReference from primary constructor property generator ^KT-61422 --- .../fir/symbols/KtFirValueParameterSymbol.kt | 13 +++++-- .../LightTreeRawFirDeclarationBuilder.kt | 7 ++-- .../fir/lightTree/fir/ValueParameter.kt | 15 +++++--- .../kotlin/fir/builder/PsiRawFirBuilder.kt | 35 ++++++++++++++----- ...rimaryConstructorWithVararg.lazyBodies.txt | 2 +- ...erTypRefInPrimaryConstructorWithVararg.txt | 2 +- ...aryConsturctorValWithVararg.lazyBodies.txt | 6 ++-- ...ypRefInPrimaryConsturctorValWithVararg.txt | 6 ++-- ...rimaryConstructorWithVararg.lazyBodies.txt | 2 +- ...edTypRefInPrimaryConstructorWithVararg.txt | 2 +- ...aryConsturctorValWithVararg.lazyBodies.txt | 6 ++-- ...ypRefInPrimaryConsturctorValWithVararg.txt | 6 ++-- .../fir/builder/AbstractRawFirBuilder.kt | 3 +- .../kotlin/fir/builder/ConversionUtils.kt | 15 +++++++- 14 files changed, 84 insertions(+), 36 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt index 8527bfe93e9..6dda6ca4858 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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. */ @@ -24,8 +24,10 @@ import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol -import org.jetbrains.kotlin.fir.types.varargElementType +import org.jetbrains.kotlin.fir.types.arrayElementType +import org.jetbrains.kotlin.fir.utils.exceptions.withFirSymbolEntry import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment internal class KtFirValueParameterSymbol( override val firSymbol: FirValueParameterSymbol, @@ -49,7 +51,12 @@ internal class KtFirValueParameterSymbol( override val returnType by cached { val returnType = firSymbol.resolvedReturnType if (firSymbol.isVararg) { - builder.typeBuilder.buildKtType(returnType.varargElementType()) + // There SHOULD always be an array element type (even if it is an error type, e.g., unresolved). + val arrayElementType = returnType.arrayElementType() + ?: errorWithAttachment("No array element type for vararg value parameter") { + withFirSymbolEntry("symbol", firSymbol) + } + builder.typeBuilder.buildKtType(arrayElementType) } else { builder.typeBuilder.buildKtType(returnType) } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt index 79d0d1e4e78..abc876ffdfc 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt @@ -2311,9 +2311,10 @@ class LightTreeRawFirDeclarationBuilder( } } container += buildFunctionTypeParameter { - source = node.toFirSourceElement() + val parameterSource = node.toFirSourceElement() + source = parameterSource this.name = name - this.returnTypeRef = typeRef ?: createNoTypeForParameterTypeRef() + this.returnTypeRef = typeRef ?: createNoTypeForParameterTypeRef(parameterSource) } } } @@ -2373,7 +2374,7 @@ class LightTreeRawFirDeclarationBuilder( modifiers = modifiers, returnTypeRef = firType ?: when { - valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef() + valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef(valueParameterSource) else -> implicitType }, source = valueParameterSource, diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 4aae191ffa6..3e96c6ccfcb 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -1,6 +1,6 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * Copyright 2010-2023 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.fir.lightTree.fir @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.builder.Context import org.jetbrains.kotlin.fir.builder.appliesToPrimaryConstructorParameter import org.jetbrains.kotlin.fir.builder.filterUseSiteTarget import org.jetbrains.kotlin.fir.builder.initContainingClassAttr +import org.jetbrains.kotlin.fir.builder.wrapIntoArray import org.jetbrains.kotlin.fir.copy import org.jetbrains.kotlin.fir.copyWithNewSourceKind import org.jetbrains.kotlin.fir.correspondingProperty @@ -38,6 +39,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef @@ -77,13 +79,18 @@ class ValueParameter( source = this@ValueParameter.source moduleData = this@ValueParameter.moduleData origin = FirDeclarationOrigin.Source - returnTypeRef = this@ValueParameter.returnTypeRef + isVararg = modifiers.hasVararg() + returnTypeRef = if (isVararg && this@ValueParameter.returnTypeRef is FirErrorTypeRef) { + this@ValueParameter.returnTypeRef.wrapIntoArray() + } else { + this@ValueParameter.returnTypeRef + } + this.name = this@ValueParameter.name symbol = FirValueParameterSymbol(name) defaultValue = this@ValueParameter.defaultValue isCrossinline = modifiers.hasCrossinline() isNoinline = modifiers.hasNoinline() - isVararg = modifiers.hasVararg() containingFunctionSymbol = this@ValueParameter.containingFunctionSymbol ?: error("containingFunctionSymbol should present when converting ValueParameter to a FirValueParameter") 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 c38967c62ac..30b34c58d5f 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 @@ -635,15 +635,24 @@ open class PsiRawFirBuilder( ): FirValueParameter { val name = convertValueParameterName(nameAsSafeName, valueParameterDeclaration) { nameIdentifier?.node?.text } return buildValueParameter { - source = toFirSourceElement() + val parameterSource = toFirSourceElement() + source = parameterSource moduleData = baseModuleData origin = FirDeclarationOrigin.Source + isVararg = isVarArg returnTypeRef = when { typeReference != null -> typeReference.toFirOrErrorType() defaultTypeRef != null -> defaultTypeRef - valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef() + valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef(parameterSource) else -> null.toFirOrImplicitType() + }.let { + if (isVararg && it is FirErrorTypeRef) { + it.wrapIntoArray() + } else { + it + } } + this.name = name symbol = FirValueParameterSymbol(name) defaultValue = if (hasDefaultValue()) { @@ -651,7 +660,6 @@ open class PsiRawFirBuilder( } else null isCrossinline = hasModifier(CROSSINLINE_KEYWORD) isNoinline = hasModifier(NOINLINE_KEYWORD) - isVararg = isVarArg containingFunctionSymbol = functionSymbol addAnnotationsFrom( this@toFirValueParameter, @@ -673,14 +681,23 @@ open class PsiRawFirBuilder( private fun KtParameter.toFirProperty(firParameter: FirValueParameter): FirProperty { require(hasValOrVar()) - val type = typeReference.convertSafe() ?: createNoTypeForParameterTypeRef() val status = FirDeclarationStatusImpl(visibility, modality).apply { isExpect = hasExpectModifier() || this@PsiRawFirBuilder.context.containerIsExpect isActual = hasActualModifier() isOverride = hasModifier(OVERRIDE_KEYWORD) isConst = hasModifier(CONST_KEYWORD) } + val propertySource = toFirSourceElement(KtFakeSourceElementKind.PropertyFromParameter) + // We can't just reuse a type from firParameter to avoid annotation leak. + val type = (typeReference.convertSafe() ?: createNoTypeForParameterTypeRef(propertySource)).let { + if (it is FirErrorTypeRef && firParameter.isVararg) { + it.wrapIntoArray() + } else { + it + } + } + val propertyName = nameAsSafeName val parameterAnnotations = mutableListOf() for (annotationEntry in annotationEntries) { @@ -2163,11 +2180,12 @@ open class PsiRawFirBuilder( returnTypeRef = unwrappedElement.returnTypeReference.toFirOrErrorType() for (valueParameter in unwrappedElement.parameters) { parameters += buildFunctionTypeParameter { - this.source = valueParameter.toFirSourceElement() + val parameterSource = valueParameter.toFirSourceElement() + this.source = parameterSource name = valueParameter.nameAsName returnTypeRef = when { valueParameter.typeReference != null -> valueParameter.typeReference.toFirOrErrorType() - else -> createNoTypeForParameterTypeRef() + else -> createNoTypeForParameterTypeRef(parameterSource) } } } @@ -2357,12 +2375,13 @@ open class PsiRawFirBuilder( ) { ktParameter.nameIdentifier?.node?.text } buildProperty { - source = ktParameter.toFirSourceElement() + val parameterSource = ktParameter.toFirSourceElement() + source = parameterSource moduleData = baseModuleData origin = FirDeclarationOrigin.Source returnTypeRef = when { ktParameter.typeReference != null -> ktParameter.typeReference.toFirOrErrorType() - else -> createNoTypeForParameterTypeRef() + else -> createNoTypeForParameterTypeRef(parameterSource) } isVar = false status = FirResolvedDeclarationStatusImpl(Visibilities.Local, Modality.FINAL, EffectiveVisibility.Local) diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.lazyBodies.txt index 495633016c2..b13c3fa9701 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.lazyBodies.txt @@ -1,6 +1,6 @@ FILE: noParameterTypRefInPrimaryConstructorWithVararg.kt public? final? class X : R|kotlin/Any| { - public? constructor(vararg x: ): R|X| { + public? constructor(vararg x: R|kotlin/Array|): R|X| { LAZY_super } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.txt index e4f30579441..fecc2f93fa4 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.txt @@ -1,6 +1,6 @@ FILE: noParameterTypRefInPrimaryConstructorWithVararg.kt public? final? class X : R|kotlin/Any| { - public? [ContainingClassKey=X] constructor(vararg x: ): R|X| { + public? [ContainingClassKey=X] constructor(vararg x: R|kotlin/Array|): R|X| { super() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt index 31e76f583c7..32bcad97084 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt @@ -1,10 +1,10 @@ FILE: noParameterTypRefInPrimaryConsturctorValWithVararg.kt public? final? class X : R|kotlin/Any| { - public? constructor(vararg x: ): R|X| { + public? constructor(vararg x: R|kotlin/Array|): R|X| { LAZY_super } - public? final? val x: = R|/x| - public? get(): + public? final? val x: R|kotlin/Array| = R|/x| + public? get(): R|kotlin/Array| } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.txt index db944a2ede6..862a9509730 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.txt @@ -1,10 +1,10 @@ FILE: noParameterTypRefInPrimaryConsturctorValWithVararg.kt public? final? class X : R|kotlin/Any| { - public? [ContainingClassKey=X] constructor([CorrespondingProperty=/X.x] vararg x: ): R|X| { + public? [ContainingClassKey=X] constructor([CorrespondingProperty=/X.x] vararg x: R|kotlin/Array|): R|X| { super() } - public? final? [IsFromPrimaryConstructor=true, IsFromVarargKey=true] val x: = R|/x| - public? [ContainingClassKey=X] get(): + public? final? [IsFromPrimaryConstructor=true, IsFromVarargKey=true] val x: R|kotlin/Array| = R|/x| + public? [ContainingClassKey=X] get(): R|kotlin/Array| } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.lazyBodies.txt index 4229f0ca67d..0b8c6195ade 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.lazyBodies.txt @@ -1,6 +1,6 @@ FILE: uncompletedTypRefInPrimaryConstructorWithVararg.kt public? final? class X : R|kotlin/Any| { - public? constructor(vararg x: ): R|X| { + public? constructor(vararg x: R|kotlin/Array|): R|X| { LAZY_super } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.txt index 1eabd5bc74a..bd9c8bdb175 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.txt @@ -1,6 +1,6 @@ FILE: uncompletedTypRefInPrimaryConstructorWithVararg.kt public? final? class X : R|kotlin/Any| { - public? [ContainingClassKey=X] constructor(vararg x: ): R|X| { + public? [ContainingClassKey=X] constructor(vararg x: R|kotlin/Array|): R|X| { super() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt index 6512ad035f3..bf114d5da77 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.lazyBodies.txt @@ -1,10 +1,10 @@ FILE: uncompletedTypRefInPrimaryConsturctorValWithVararg.kt public? final? class X : R|kotlin/Any| { - public? constructor(vararg x: ): R|X| { + public? constructor(vararg x: R|kotlin/Array|): R|X| { LAZY_super } - public? final? val x: = R|/x| - public? get(): + public? final? val x: R|kotlin/Array| = R|/x| + public? get(): R|kotlin/Array| } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.txt index 8f23ff77464..e3f666acf68 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.txt @@ -1,10 +1,10 @@ FILE: uncompletedTypRefInPrimaryConsturctorValWithVararg.kt public? final? class X : R|kotlin/Any| { - public? [ContainingClassKey=X] constructor([CorrespondingProperty=/X.x] vararg x: ): R|X| { + public? [ContainingClassKey=X] constructor([CorrespondingProperty=/X.x] vararg x: R|kotlin/Array|): R|X| { super() } - public? final? [IsFromPrimaryConstructor=true, IsFromVarargKey=true] val x: = R|/x| - public? [ContainingClassKey=X] get(): + public? final? [IsFromPrimaryConstructor=true, IsFromVarargKey=true] val x: R|kotlin/Array| = R|/x| + public? [ContainingClassKey=X] get(): R|kotlin/Array| } 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 0fe46965b29..607694622ad 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 @@ -1078,8 +1078,9 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context symbol = FirErrorPropertySymbol(diagnostic) } - protected fun createNoTypeForParameterTypeRef(): FirErrorTypeRef { + protected fun createNoTypeForParameterTypeRef(parameterSource: KtSourceElement): FirErrorTypeRef { return buildErrorTypeRef { + source = parameterSource diagnostic = ConeSimpleDiagnostic("No type for parameter", DiagnosticKind.ValueParameterWithNoTypeAnnotation) } } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index bc741cb9de4..1711cd1228a 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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. */ @@ -40,10 +40,14 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.ConeKotlinTypeProjectionOut import org.jetbrains.kotlin.fir.types.ConeStarProjection +import org.jetbrains.kotlin.fir.types.FirErrorTypeRef +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.constructClassLikeType import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImplWithoutSource @@ -705,3 +709,12 @@ fun KtSourceElement.withForcedKindFrom(context: Context<*>): KtSourceElement { else -> this.realElement() } } + +fun FirErrorTypeRef.wrapIntoArray(): FirResolvedTypeRef { + val typeRef = this + return buildResolvedTypeRef { + source = typeRef.source + type = StandardClassIds.Array.constructClassLikeType(arrayOf(ConeKotlinTypeProjectionOut(typeRef.coneType))) + delegatedTypeRef = typeRef.copyWithNewSourceKind(KtFakeSourceElementKind.ArrayTypeFromVarargParameter) + } +}