Frontend part of KT-910 Type of try/catch/finally

This commit is contained in:
Svetlana Isakova
2012-05-18 15:20:37 +04:00
parent b49fa2ab82
commit 2d601cf4a2
3 changed files with 33 additions and 8 deletions
@@ -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);
}
@@ -0,0 +1,27 @@
package a
fun foo() : Int {
try {
doSmth()
}
catch (e: Exception) {
<!UNREACHABLE_CODE!>return <!TYPE_MISMATCH!>""<!><!>
}
finally {
return <!TYPE_MISMATCH!>""<!>
}
}
fun bar() : Int =
try {
<!TYPE_MISMATCH!>doSmth()<!>
}
catch (e: Exception) {
<!TYPE_MISMATCH!>""<!>
}
finally {
<!UNUSED_EXPRESSION!>""<!>
}
fun doSmth() {}
@@ -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?");