diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 9369e3e8d7e..4b2ac9c4e8c 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -483,6 +483,14 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("typeParameter") } + val TYPE_PARAMETER_AS_REIFIED_ARRAY by error { + parameter("typeParameter") + } + + val TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING by warning { + parameter("typeParameter") + } + val FINAL_UPPER_BOUND by warning { parameter("type") } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 57837edb110..c2472535a47 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -319,6 +319,8 @@ object FirErrors { val INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS by error0(SourceElementPositioningStrategies.DECLARATION_NAME) val KCLASS_WITH_NULLABLE_TYPE_PARAMETER_IN_SIGNATURE by error1(SourceElementPositioningStrategies.DECLARATION_NAME) val TYPE_PARAMETER_AS_REIFIED by error1() + val TYPE_PARAMETER_AS_REIFIED_ARRAY by error1() + val TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING by warning1() val FINAL_UPPER_BOUND by warning1() val UPPER_BOUND_IS_EXTENSION_FUNCTION_TYPE by error0() val BOUNDS_NOT_ALLOWED_IF_BOUNDED_BY_TYPE_PARAMETER by error0() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt index 2864c9bfde1..53803b8d2ab 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt @@ -42,7 +42,8 @@ object CommonExpressionCheckers : ExpressionCheckers() { FirTypeParameterInQualifiedAccessChecker, FirSealedClassConstructorCallChecker, FirUninitializedEnumChecker, - FirFunInterfaceConstructorReferenceChecker + FirFunInterfaceConstructorReferenceChecker, + FirTypeParameterAsReifiedChecker ) override val functionCallCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index fddd64a9129..e25b1925657 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -601,24 +601,20 @@ fun extractArgumentTypeRefAndSource(typeRef: FirTypeRef?, index: Int): FirTypeRe if (typeRef is FirResolvedTypeRef) { val delegatedTypeRef = typeRef.delegatedTypeRef if (delegatedTypeRef is FirUserTypeRef) { - var currentTypeArguments: List? = null var currentIndex = index val qualifier = delegatedTypeRef.qualifier for (i in qualifier.size - 1 downTo 0) { val typeArguments = qualifier[i].typeArgumentList.typeArguments if (currentIndex < typeArguments.size) { - currentTypeArguments = typeArguments - break + val typeArgument = typeArguments.elementAtOrNull(currentIndex) + return if (typeArgument is FirTypeProjection) + FirTypeRefSource((typeArgument as? FirTypeProjectionWithVariance)?.typeRef, typeArgument.source) + else null } else { currentIndex -= typeArguments.size } } - - val typeArgument = currentTypeArguments?.elementAtOrNull(currentIndex) - if (typeArgument is FirTypeProjection) { - return FirTypeRefSource((typeArgument as? FirTypeProjectionWithVariance)?.typeRef, typeArgument.source) - } } else if (delegatedTypeRef is FirFunctionTypeRef) { val valueParameters = delegatedTypeRef.valueParameters if (index < valueParameters.size) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirTypeParameterAsReifiedChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirTypeParameterAsReifiedChecker.kt new file mode 100644 index 00000000000..3a51a547dc8 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirTypeParameterAsReifiedChecker.kt @@ -0,0 +1,78 @@ +/* + * 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.fir.analysis.checkers.expression + +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticFactory1 +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression +import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol +import org.jetbrains.kotlin.fir.languageVersionSettings +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.name.StandardClassIds + +object FirTypeParameterAsReifiedChecker : FirQualifiedAccessExpressionChecker() { + override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) { + val calleReference = expression.calleeReference + val typeArguments = expression.typeArguments + val typeParameters = calleReference.toResolvedCallableSymbol()?.typeParameterSymbols ?: return + + val count = minOf(typeArguments.size, typeParameters.size) + for (index in 0 until count) { + val typeArgumentProjection = typeArguments.elementAt(index) + val source = typeArgumentProjection.source ?: calleReference.source + val typeArgument = typeArgumentProjection.toConeTypeProjection().type + val typeParameter = typeParameters[index] + + if (source != null && (typeParameter.isTypeParameterOfKotlinArray())) { + checkArgumentAndReport(typeArgument, source, false, context, reporter) + } + } + } + + private fun FirTypeParameterSymbol.isTypeParameterOfKotlinArray(): Boolean { + val containingDeclaration = containingDeclarationSymbol + return isReified || + containingDeclaration is FirRegularClassSymbol && containingDeclaration.classId == StandardClassIds.Array + } + + private fun checkArgumentAndReport( + typeArgument: ConeKotlinType?, + source: FirSourceElement, + isArray: Boolean, + context: CheckerContext, + reporter: DiagnosticReporter + ) { + if (typeArgument?.classId == StandardClassIds.Array) { + checkArgumentAndReport(typeArgument.typeArguments[0].type, source, true, context, reporter) + return + } + + var factory: FirDiagnosticFactory1? = null + + lateinit var symbol: FirTypeParameterSymbol + if (typeArgument is ConeTypeParameterType) { + factory = if (isArray) { + if (context.session.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitNonReifiedArraysAsReifiedTypeArguments)) + FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY else + FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING + } else { + FirErrors.TYPE_PARAMETER_AS_REIFIED + } + symbol = typeArgument.toSymbol(context.session) as FirTypeParameterSymbol + } + + if (factory != null && !symbol.isReified) { + reporter.reportOn(source, factory, symbol, context) + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt index 441fe21b023..b220531c767 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt @@ -41,6 +41,10 @@ class ExpressionCheckersDiagnosticComponent( checkers.allFunctionCallCheckers.check(functionCall, data, reporter) } + override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: CheckerContext) { + checkers.allFunctionCallCheckers.check(implicitInvokeCall, data, reporter) + } + override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: CheckerContext) { checkers.allCallableReferenceAccessCheckers.check(callableReferenceAccess, data, reporter) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 1586a4b76bc..14b6bfcfb1c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -365,6 +365,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETERS_I import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETERS_IN_OBJECT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETERS_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_AS_REIFIED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_IN_CATCH_CLAUSE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_IS_NOT_AN_EXPRESSION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER @@ -782,6 +784,16 @@ class FirDefaultErrorMessages { ) map.put(TYPE_PARAMETER_AS_REIFIED, "Cannot use ''{0}'' as reified type parameter. Use a class instead", SYMBOL) + map.put( + TYPE_PARAMETER_AS_REIFIED_ARRAY, + "Cannot use ''{0}'' as reified type parameter, since the array type parameter is not reified.", + SYMBOL + ) + map.put( + TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING, + "Cannot use ''{0}'' as reified type parameter, since the array type parameter is not reified.", + SYMBOL + ) map.put( FINAL_UPPER_BOUND, "''{0}'' is a final type, and thus a value of the type parameter is predetermined", diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.fir.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.fir.kt deleted file mode 100644 index 377d73d3998..00000000000 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.fir.kt +++ /dev/null @@ -1,13 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER - -inline operator fun T.plus(p: T): T = this - -inline operator fun T.invoke(): T = this - -fun main(tp: A, any: Any) { - tp + tp - any + any - - tp() - any() -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt index feec86f78af..3eb2b10eaa6 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER inline operator fun T.plus(p: T): T = this diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.fir.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.fir.kt deleted file mode 100644 index cff415b6311..00000000000 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -// !LANGUAGE: +ProhibitNonReifiedArraysAsReifiedTypeArguments -// !DIAGNOSTICS: -UNUSED_PARAMETER - -inline fun foo() {} - -fun bar() { - foo() - foo>() - foo>>() - foo>() - foo>>() - foo() - foo>() - foo>>() -} - -fun test(x: Array, y: Array<*>) { - bar() -} diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt index 77e506a2a7d..1780ee23d14 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +ProhibitNonReifiedArraysAsReifiedTypeArguments // !DIAGNOSTICS: -UNUSED_PARAMETER diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.fir.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.fir.kt deleted file mode 100644 index ae665ca8b29..00000000000 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -// !LANGUAGE: -ProhibitNonReifiedArraysAsReifiedTypeArguments -// !DIAGNOSTICS: -UNUSED_PARAMETER - -inline fun foo() {} - -fun bar() { - foo() - foo>() - foo>>() - foo>() - foo>>() - foo() - foo>() - foo>>() -} - -fun test(x: Array, y: Array<*>) { - bar() -} diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.kt index f3fc135f654..77d60de6176 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgumentWarning.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: -ProhibitNonReifiedArraysAsReifiedTypeArguments // !DIAGNOSTICS: -UNUSED_PARAMETER diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.fir.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.fir.kt deleted file mode 100644 index f3e15d9fd8e..00000000000 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -class C<reified T> - -fun id(p: T): T = p - -fun main() { - C() - - val a: C = C() - C() - - val b: C = C() - C() - - // TODO svtk, uncomment when extensions are called for nested calls! - //val < !UNUSED_VARIABLE!>с< !>: C = id(< !TYPE_PARAMETER_AS_REIFIED!>C< !>()) -} diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.kt index c8e57da4172..8f843fe2c82 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/InConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL class C<reified T> fun id(p: T): T = p diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.fir.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.fir.kt index 04e5a2598a4..c1ef308779d 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.fir.kt @@ -11,11 +11,11 @@ fun id(p: T): T = p fun main() { f() - val a: A = f() - f() + val a: A = f() + f<A>() val b: Int = f() f() - val с: A = id(f()) + val с: A = id(f()) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/ArrayOfNothing.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/ArrayOfNothing.fir.kt index 5965caa70c1..00ec2885ce0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/ArrayOfNothing.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/ArrayOfNothing.fir.kt @@ -50,6 +50,6 @@ fun test6() = foo() class B(val array: Array) -fun bar() = B>(arrayOf()) +fun bar() = B>(arrayOf()) fun test7() = bar() diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.fir.kt deleted file mode 100644 index 846ac885b61..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ - -fun fail1(): Array = Array(1) { null!! } -fun ok1(block: () -> Array): Array = block() -inline fun ok2(): Array = Array(1) { null!! } - - -fun fail2(): Array = ok1 { Array(1) { null!! } } -fun ok3(block: () -> Array): Array = ok1 { block() } -inline fun ok4(): Array = ok1 { Array(1) { null!! } } - -fun fail3(block: () -> T): Pair, Array> = Pair(arrayOf( - block()), arrayOf() -) -inline fun ok5(block: () -> T): Pair, Array> = Pair( - arrayOf(block()), arrayOf() -) - diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt index 6c46aac5dc2..de07bddad3d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun fail1(): Array = Array(1) { null!! } fun ok1(block: () -> Array): Array = block() diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.fir.kt deleted file mode 100644 index e418e602769..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE - -fun foo() { - val x = arrayOfNulls(5) -} - -inline fun bar() { - val x = arrayOfNulls(5) -} - -fun baz() { - bar() - val x: Array = arrayOfNulls(5) -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt index 573db585717..eeab9623e2d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE fun foo() { diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.fir.kt deleted file mode 100644 index 77fe0056f6a..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -class Inv - -inline operator fun Inv.invoke() {} - -operator fun Inv.get(i: Int): Inv = this - -fun test(a: Inv) { - a[1]() -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.kt index 2e81ae2f383..3605f378154 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/kt11881.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL class Inv inline operator fun Inv.invoke() {} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index d24067fc164..755c9f42317 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -1440,6 +1440,20 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY) { firDiagnostic -> + TypeParameterAsReifiedArrayImpl( + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING) { firDiagnostic -> + TypeParameterAsReifiedArrayWarningImpl( + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.FINAL_UPPER_BOUND) { firDiagnostic -> FinalUpperBoundImpl( firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index b18417a8f5d..8bde3ef90fb 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1024,6 +1024,16 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val typeParameter: KtTypeParameterSymbol } + abstract class TypeParameterAsReifiedArray : KtFirDiagnostic() { + override val diagnosticClass get() = TypeParameterAsReifiedArray::class + abstract val typeParameter: KtTypeParameterSymbol + } + + abstract class TypeParameterAsReifiedArrayWarning : KtFirDiagnostic() { + override val diagnosticClass get() = TypeParameterAsReifiedArrayWarning::class + abstract val typeParameter: KtTypeParameterSymbol + } + abstract class FinalUpperBound : KtFirDiagnostic() { override val diagnosticClass get() = FinalUpperBound::class abstract val type: KtType diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index b047d3be3fc..72b82695a45 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -1643,6 +1643,22 @@ internal class TypeParameterAsReifiedImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class TypeParameterAsReifiedArrayImpl( + override val typeParameter: KtTypeParameterSymbol, + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.TypeParameterAsReifiedArray(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class TypeParameterAsReifiedArrayWarningImpl( + override val typeParameter: KtTypeParameterSymbol, + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.TypeParameterAsReifiedArrayWarning(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class FinalUpperBoundImpl( override val type: KtType, firDiagnostic: FirPsiDiagnostic,