From 2d601cf4a217dc0c2f5d4d807a8c61f3228df4fe Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 18 May 2012 15:20:37 +0400 Subject: [PATCH] Frontend part of KT-910 Type of try/catch/finally --- .../ControlStructureTypingVisitor.java | 11 +++----- .../tests/controlStructures/tryReturnType.jet | 27 +++++++++++++++++++ .../jet/types/JetTypeCheckerTest.java | 3 ++- 3 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/controlStructures/tryReturnType.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index edcc2b2eda4..1ccf530bf4d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -411,7 +411,8 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { JetParameter catchParameter = catchClause.getCatchParameter(); JetExpression catchBody = catchClause.getCatchBody(); if (catchParameter != null) { - VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver().resolveLocalVariableDescriptor(context.scope.getContainingDeclaration(), context.scope, catchParameter, context.trace); + VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver().resolveLocalVariableDescriptor( + context.scope.getContainingDeclaration(), context.scope, catchParameter, context.trace); JetType throwableType = JetStandardLibrary.getInstance().getThrowable().getDefaultType(); DataFlowUtils.checkType(variableDescriptor.getType(), catchParameter, context.replaceExpectedType(throwableType)); if (catchBody != null) { @@ -425,13 +426,9 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { } } if (finallyBlock != null) { - types.clear(); // Do not need the list for the check, but need the code above to typecheck catch bodies - JetType type = facade.getType(finallyBlock.getFinalExpression(), context.replaceScope(context.scope)); - if (type != null) { - types.add(type); - } + facade.getType(finallyBlock.getFinalExpression(), context.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE)); } - JetType type = facade.getType(tryBlock, context.replaceScope(context.scope)); + JetType type = facade.getType(tryBlock, context); if (type != null) { types.add(type); } diff --git a/compiler/testData/diagnostics/tests/controlStructures/tryReturnType.jet b/compiler/testData/diagnostics/tests/controlStructures/tryReturnType.jet new file mode 100644 index 00000000000..a61bf21605b --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/tryReturnType.jet @@ -0,0 +1,27 @@ +package a + +fun foo() : Int { + try { + doSmth() + } + catch (e: Exception) { + return "" + } + finally { + return "" + } +} + +fun bar() : Int = + try { + doSmth() + } + catch (e: Exception) { + "" + } + finally { + "" + } + + +fun doSmth() {} diff --git a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 3309b8b442d..2d400f2ec5e 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -158,7 +158,8 @@ public class JetTypeCheckerTest extends JetLiteFixture { public void testTry() throws Exception { assertType("try {1} finally{2}", "Int"); - assertType("try {1} catch (e : Exception) {'a'} finally{2}", "Int"); + assertType("try {1} catch (e : Exception) {'a'} finally{2}", "Any"); + assertType("try {1} catch (e : Exception) {2} finally{'a'}", "Int"); assertType("try {1} catch (e : Exception) {'a'} finally{'2'}", "Any"); assertType("try {1} catch (e : Exception) {'a'}", "Any"); assertType("try {1} catch (e : Exception) {'a'} catch (e : Exception) {null}", "Any?");