[FIR] Use Throwable as expected type for throw expressions
#KT-58533 Fixed
This commit is contained in:
committed by
Space Team
parent
55632f5df2
commit
7a9c516f68
+6
@@ -14618,6 +14618,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("genericCallInThrow.kt")
|
||||
public void testGenericCallInThrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||
|
||||
+6
@@ -14618,6 +14618,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("genericCallInThrow.kt")
|
||||
public void testGenericCallInThrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||
|
||||
+6
@@ -14618,6 +14618,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("genericCallInThrow.kt")
|
||||
public void testGenericCallInThrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||
|
||||
+6
@@ -14624,6 +14624,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("genericCallInThrow.kt")
|
||||
public void testGenericCallInThrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||
|
||||
+6
-3
@@ -218,10 +218,13 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes
|
||||
|
||||
override fun transformThrowExpression(
|
||||
throwExpression: FirThrowExpression,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): FirStatement {
|
||||
return transformer.transformExpression(throwExpression, ResolutionMode.ContextIndependent).also {
|
||||
dataFlowAnalyzer.exitThrowExceptionNode(it as FirThrowExpression)
|
||||
return throwExpression.apply {
|
||||
replaceTypeRef(throwExpression.typeRef.transform(transformer, data))
|
||||
transformAnnotations(transformer, data)
|
||||
transformException(transformer, withExpectedType(session.builtinTypes.throwableType))
|
||||
dataFlowAnalyzer.exitThrowExceptionNode(this)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,4 +32,6 @@ abstract class FirThrowExpression : FirExpression() {
|
||||
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
|
||||
|
||||
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirThrowExpression
|
||||
|
||||
abstract fun <D> transformException(transformer: FirTransformer<D>, data: D): FirThrowExpression
|
||||
}
|
||||
|
||||
+6
-1
@@ -40,7 +40,7 @@ internal class FirThrowExpressionImpl(
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirThrowExpressionImpl {
|
||||
typeRef = typeRef.transform(transformer, data)
|
||||
transformAnnotations(transformer, data)
|
||||
exception = exception.transform(transformer, data)
|
||||
transformException(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -49,6 +49,11 @@ internal class FirThrowExpressionImpl(
|
||||
return this
|
||||
}
|
||||
|
||||
override fun <D> transformException(transformer: FirTransformer<D>, data: D): FirThrowExpressionImpl {
|
||||
exception = exception.transform(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||
typeRef = newTypeRef
|
||||
}
|
||||
|
||||
+1
-1
@@ -620,7 +620,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
}
|
||||
|
||||
throwExpression.configure {
|
||||
+field("exception", expression)
|
||||
+field("exception", expression).withTransform()
|
||||
}
|
||||
|
||||
variableAssignment.configure {
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
fun <T> a(): T = TODO()
|
||||
val b: Unit = throw a()
|
||||
Generated
+6
@@ -14624,6 +14624,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("genericCallInThrow.kt")
|
||||
public void testGenericCallInThrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user