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) + } +}