From 019ccae7f6671210cd41f1829a61ce93c550be4b Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 3 Nov 2011 21:11:03 +0400 Subject: [PATCH] KT-175: infer nullability in then block from if condition if (x != null) { // x is non-null here } --- .../jet/lang/resolve/calls/CallResolver.java | 2 +- .../types/expressions/ExpressionTypingServices.java | 7 ++++++- .../quick/InferNullabilityInThenBlock.jet | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/checkerWithErrorTypes/quick/InferNullabilityInThenBlock.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 5341725067d..231bf7a3e0f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -652,7 +652,7 @@ public class CallResolver { List argumentExpressions = resolvedArgument.getArgumentExpressions(); for (JetExpression argumentExpression : argumentExpressions) { ExpressionTypingServices temporaryServices = new ExpressionTypingServices(semanticServices, candidateCall.getTrace()); - JetType type = temporaryServices.getType(scope, argumentExpression, parameterType); + JetType type = temporaryServices.getType(scope, argumentExpression, parameterType, dataFlowInfo); if (type == null) { candidateCall.argumentHasNoType(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java index 13731b9f345..f47a527d75b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java @@ -53,10 +53,15 @@ public class ExpressionTypingServices { @Nullable public JetType getType(@NotNull final JetScope scope, @NotNull JetExpression expression, @NotNull JetType expectedType) { + return getType(scope, expression, expectedType, DataFlowInfo.EMPTY); + } + + @Nullable + public JetType getType(@NotNull final JetScope scope, @NotNull JetExpression expression, @NotNull JetType expectedType, DataFlowInfo dataFlowInfo) { ExpressionTypingContext context = ExpressionTypingContext.newContext( semanticServices, new HashMap(), new HashMap>(), new LabelResolver(), - trace, scope, DataFlowInfo.EMPTY, expectedType, FORBIDDEN, false + trace, scope, dataFlowInfo, expectedType, FORBIDDEN, false ); return expressionTypingFacade.getType(expression, context); } diff --git a/compiler/testData/checkerWithErrorTypes/quick/InferNullabilityInThenBlock.jet b/compiler/testData/checkerWithErrorTypes/quick/InferNullabilityInThenBlock.jet new file mode 100644 index 00000000000..4925867c8c6 --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/quick/InferNullabilityInThenBlock.jet @@ -0,0 +1,11 @@ + +fun ff(a: String) = 1 + +fun gg() { + val a: String? = "" + + if (a != null) { + ff(a) + } +} +