Retain data flow info after == (equals)

#KT-2825 In Progress
This commit is contained in:
Alexander Udalov
2012-11-12 17:49:27 +04:00
parent 1fbe9b9a31
commit 3358108c3f
3 changed files with 26 additions and 2 deletions
@@ -1103,10 +1103,15 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
if (OperatorConventions.EQUALS_OPERATIONS.contains(operationType)) {
Name name = Name.identifier("equals");
if (right != null) {
ExpressionReceiver receiver = ExpressionTypingUtils.safeGetExpressionReceiver(facade, left, context.replaceScope(context.scope));
ExpressionReceiver receiver = ExpressionTypingUtils.safeGetExpressionReceiver(facade, left, context);
dataFlowInfo = facade.getTypeInfo(left, context).getDataFlowInfo();
ExpressionTypingContext contextWithDataFlow = context.replaceDataFlowInfo(dataFlowInfo);
OverloadResolutionResults<FunctionDescriptor> resolutionResults = resolveFakeCall(
context, receiver, name, KotlinBuiltIns.getInstance().getNullableAnyType());
contextWithDataFlow, receiver, name, KotlinBuiltIns.getInstance().getNullableAnyType());
dataFlowInfo = facade.getTypeInfo(right, contextWithDataFlow).getDataFlowInfo();
if (resolutionResults.isSuccess()) {
FunctionDescriptor equals = resolutionResults.getResultingCall().getResultingDescriptor();
@@ -0,0 +1,14 @@
trait A
trait B : A
fun foo1(a: A, b: B): Boolean {
val result = (a as B) == b
a : B
return result
}
fun foo2(a: A, b: B): Boolean {
val result = b == (a as B)
a : B
return result
}
@@ -1151,6 +1151,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionCompareToConvention.kt");
}
@TestMetadata("BinaryExpressionEqualsConvention.kt")
public void testBinaryExpressionEqualsConvention() throws Exception {
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionEqualsConvention.kt");
}
@TestMetadata("BinaryExpressionIdentifier.kt")
public void testBinaryExpressionIdentifier() throws Exception {
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionIdentifier.kt");