Standard data flow analysis results are taken into account during condition analysis #KT-7933 Fixed

This commit is contained in:
Mikhail Glukhikh
2015-10-30 12:00:38 +03:00
parent dd1196ae6b
commit 182cde1e02
6 changed files with 114 additions and 4 deletions
@@ -49,17 +49,20 @@ public class DataFlowAnalyzer {
private final ConstantExpressionEvaluator constantExpressionEvaluator;
private final KotlinBuiltIns builtIns;
private final SmartCastManager smartCastManager;
private final ExpressionTypingFacade facade;
public DataFlowAnalyzer(
@NotNull Iterable<AdditionalTypeChecker> additionalTypeCheckers,
@NotNull ConstantExpressionEvaluator constantExpressionEvaluator,
@NotNull KotlinBuiltIns builtIns,
@NotNull SmartCastManager smartCastManager
@NotNull SmartCastManager smartCastManager,
@NotNull ExpressionTypingFacade facade
) {
this.additionalTypeCheckers = additionalTypeCheckers;
this.constantExpressionEvaluator = constantExpressionEvaluator;
this.builtIns = builtIns;
this.smartCastManager = smartCastManager;
this.facade = facade;
}
@NotNull
@@ -100,6 +103,7 @@ public class DataFlowAnalyzer {
result.set(dataFlowInfo);
}
else {
DataFlowInfo expressionFlowInfo = facade.getTypeInfo(expression, context).getDataFlowInfo();
KtExpression left = expression.getLeft();
if (left == null) return;
KtExpression right = expression.getRight();
@@ -122,12 +126,14 @@ public class DataFlowAnalyzer {
}
if (equals != null) {
if (equals == conditionValue) { // this means: equals && conditionValue || !equals && !conditionValue
result.set(context.dataFlowInfo.equate(leftValue, rightValue));
result.set(context.dataFlowInfo.equate(leftValue, rightValue).and(expressionFlowInfo));
}
else {
result.set(context.dataFlowInfo.disequate(leftValue, rightValue));
result.set(context.dataFlowInfo.disequate(leftValue, rightValue).and(expressionFlowInfo));
}
}
else {
result.set(expressionFlowInfo);
}
}
}
@@ -141,6 +147,15 @@ public class DataFlowAnalyzer {
result.set(extractDataFlowInfoFromCondition(baseExpression, !conditionValue, context));
}
}
else {
visitExpression(expression);
}
}
@Override
public void visitExpression(@NotNull KtExpression expression) {
// In fact, everything is taken from trace here
result.set(facade.getTypeInfo(expression, context).getDataFlowInfo());
}
@Override