[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.chooseFactory
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
@@ -54,6 +53,12 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() {
|
|||||||
containingDeclaration is FirRegularClassSymbol && containingDeclaration.classId == StandardClassIds.Array
|
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(
|
private fun checkArgumentAndReport(
|
||||||
typeArgument: ConeKotlinType,
|
typeArgument: ConeKotlinType,
|
||||||
source: KtSourceElement,
|
source: KtSourceElement,
|
||||||
@@ -85,7 +90,7 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() {
|
|||||||
} else if (typeArgument is ConeDefinitelyNotNullType && isExplicit) {
|
} 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.
|
// 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)
|
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)
|
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
|
// !DIAGNOSTICS: -UNUSED_PARAMETER -REIFIED_TYPE_PARAMETER_NO_INLINE
|
||||||
|
|
||||||
fun <reified T> foo(t: T) {}
|
fun <reified T> foo(t: T) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user