From 624eaa5aa89502046fe65c670d13449c2195ae53 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 2 Aug 2013 14:26:50 +0400 Subject: [PATCH] refactoring: extracted 'visitElvisExpression' --- .../BasicExpressionTypingVisitor.java | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 9c658322b0d..8a9c533109a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -1013,26 +1013,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { result = booleanType; } else if (operationType == JetTokens.ELVIS) { - JetTypeInfo leftTypeInfo = getTypeInfoOrNullType(left, context, facade); - - JetType leftType = leftTypeInfo.getType(); - dataFlowInfo = leftTypeInfo.getDataFlowInfo(); - - if (left != null && leftType != null) { - if (isKnownToBeNotNull(left, leftType, context)) { - context.trace.report(USELESS_ELVIS.on(left, leftType)); - } - - ExpressionTypingContext newContext = contextWithExpectedType.replaceDataFlowInfo(dataFlowInfo).replaceScope(context.scope); - JetType rightType = right == null ? null : facade.getTypeInfo(right, newContext).getType(); - - if (rightType != null) { - DataFlowUtils.checkType(TypeUtils.makeNullableAsSpecified(leftType, rightType.isNullable()), left, contextWithExpectedType); - return JetTypeInfo.create(TypeUtils.makeNullableAsSpecified( - CommonSupertypes.commonSupertype(Arrays.asList(leftType, rightType)), rightType.isNullable()), - dataFlowInfo); - } - } + return visitElvisExpression(expression, contextWithExpectedType); } else { context.trace.report(UNSUPPORTED.on(operationSign, "Unknown operation")); @@ -1041,6 +1022,36 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return DataFlowUtils.checkType(result, expression, contextWithExpectedType, dataFlowInfo); } + @NotNull + private JetTypeInfo visitElvisExpression( + @NotNull JetBinaryExpression expression, + @NotNull ExpressionTypingContext contextWithExpectedType + ) { + ExpressionTypingContext context = contextWithExpectedType.replaceExpectedType(NO_EXPECTED_TYPE); + JetExpression left = expression.getLeft(); + JetExpression right = expression.getRight(); + + JetTypeInfo leftTypeInfo = getTypeInfoOrNullType(left, context, facade); + JetType leftType = leftTypeInfo.getType(); + DataFlowInfo dataFlowInfo = leftTypeInfo.getDataFlowInfo(); + + if (left == null || leftType == null) return JetTypeInfo.create(null, dataFlowInfo); + + if (isKnownToBeNotNull(left, leftType, context)) { + context.trace.report(USELESS_ELVIS.on(left, leftType)); + } + + ExpressionTypingContext newContext = contextWithExpectedType.replaceDataFlowInfo(dataFlowInfo).replaceScope(context.scope); + JetType rightType = right == null ? null : facade.getTypeInfo(right, newContext).getType(); + + if (rightType != null) { + DataFlowUtils.checkType(TypeUtils.makeNullableAsSpecified(leftType, rightType.isNullable()), left, contextWithExpectedType); + return JetTypeInfo.create(TypeUtils.makeNullableAsSpecified( + CommonSupertypes.commonSupertype(Arrays.asList(leftType, rightType)), rightType.isNullable()), dataFlowInfo); + } + return JetTypeInfo.create(null, dataFlowInfo); + } + @NotNull public JetTypeInfo checkInExpression( JetElement callElement,