From 15c83abfd89db32fdb6d1f01fcb7c4ba7e8ffc9a Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 11 Nov 2021 19:13:05 +0300 Subject: [PATCH] [FIR] Throw UNCHECKED_CAST instead of NO_TYPE_ARGUMENTS_ON_RHS closer to FE 1.0 --- .../resolve/FirExpressionsResolveTransformer.kt | 16 ++++++++++------ .../capturedParameters/uncheckedCast.fir.kt | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 6b787020c32..6321e4017a4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.diagnostics.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression @@ -603,7 +604,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform override fun shouldRunCompletion(call: T): Boolean where T : FirStatement, T : FirResolvable = false } - private fun FirTypeRef.withTypeArgumentsForBareType(argument: FirExpression): FirTypeRef { + private fun FirTypeRef.withTypeArgumentsForBareType(argument: FirExpression, operation: FirOperation): FirTypeRef { val type = coneTypeSafe() ?: return this if (type.typeArguments.isNotEmpty()) return this @@ -611,10 +612,13 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform if (firClass.typeParameters.isEmpty()) return this val originalType = argument.unwrapSmartcastExpression().typeRef.coneTypeSafe() ?: return this - val newType = components.computeRepresentativeTypeForBareType(type, originalType) ?: return buildErrorTypeRef { - source = this@withTypeArgumentsForBareType.source - diagnostic = ConeNoTypeArgumentsOnRhsError(firClass.typeParameters.size, firClass.symbol) - } + val newType = components.computeRepresentativeTypeForBareType(type, originalType) + ?: if (firClass.isLocal && (operation == FirOperation.AS || operation == FirOperation.SAFE_AS)) { + (firClass as FirClass).defaultType() + } else return buildErrorTypeRef { + source = this@withTypeArgumentsForBareType.source + diagnostic = ConeNoTypeArgumentsOnRhsError(firClass.typeParameters.size, firClass.symbol) + } return if (newType.typeArguments.isEmpty()) this else withReplacedConeType(newType) } @@ -632,7 +636,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform } }.transformTypeOperatorCallChildren() - val conversionTypeRef = resolved.conversionTypeRef.withTypeArgumentsForBareType(resolved.argument) + val conversionTypeRef = resolved.conversionTypeRef.withTypeArgumentsForBareType(resolved.argument, typeOperatorCall.operation) resolved.transformChildren(object : FirDefaultTransformer() { override fun transformElement(element: E, data: Any?): E { return element diff --git a/compiler/testData/diagnostics/tests/generics/capturedParameters/uncheckedCast.fir.kt b/compiler/testData/diagnostics/tests/generics/capturedParameters/uncheckedCast.fir.kt index 1c0cb0eec96..6d7618c501e 100644 --- a/compiler/testData/diagnostics/tests/generics/capturedParameters/uncheckedCast.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/capturedParameters/uncheckedCast.fir.kt @@ -6,11 +6,11 @@ fun foo(x: Any, y: Any) : Any { } if (1 == 2) { - x as C + x as C } if (2 == 3) { - x as? C + x as? C } class Outer {