[JS FIR] Fix REIFIED_TYPE_FORBIDDEN_SUBSTITUTION for dynamic types
^KT-59987 Fixed
This commit is contained in:
committed by
Space Team
parent
6db22b4975
commit
0d06efb488
+8
-3
@@ -11,8 +11,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.diagnostics.chooseFactory
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
@@ -54,6 +53,12 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() {
|
||||
containingDeclaration is FirRegularClassSymbol && containingDeclaration.classId == StandardClassIds.Array
|
||||
}
|
||||
|
||||
private fun ConeKotlinType.cannotBeReified() = when (this) {
|
||||
is ConeCapturedType -> true
|
||||
is ConeDynamicType -> true
|
||||
else -> isNothing || isNullableNothing
|
||||
}
|
||||
|
||||
private fun checkArgumentAndReport(
|
||||
typeArgument: ConeKotlinType,
|
||||
source: KtSourceElement,
|
||||
@@ -85,7 +90,7 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() {
|
||||
} else if (typeArgument is ConeDefinitelyNotNullType && isExplicit) {
|
||||
// We sometimes infer type arguments to DNN types, which seems to be ok. Only report explicit DNN types written by user.
|
||||
reporter.reportOn(source, FirErrors.DEFINITELY_NON_NULLABLE_AS_REIFIED, context)
|
||||
} else if (typeArgument.isNothing || typeArgument.isNullableNothing || typeArgument is ConeCapturedType) {
|
||||
} else if (typeArgument.cannotBeReified()) {
|
||||
reporter.reportOn(source, FirErrors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION, typeArgument, context)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -REIFIED_TYPE_PARAMETER_NO_INLINE
|
||||
|
||||
fun <reified T> foo(t: T) {}
|
||||
class C<reified T>(t: T)
|
||||
|
||||
fun test(d: dynamic) {
|
||||
foo<dynamic>(d)
|
||||
foo(d)
|
||||
|
||||
C<dynamic>(d)
|
||||
C(d)
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -REIFIED_TYPE_PARAMETER_NO_INLINE
|
||||
|
||||
fun <reified T> foo(t: T) {}
|
||||
|
||||
Reference in New Issue
Block a user