From 45abab2a2cb2d4b569da92db9cbfd2b788c8ca47 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 25 Dec 2013 17:35:56 +0400 Subject: [PATCH] KT-4341 No resolved call for right-hand side of equals expression #KT-4341 Fixed --- .../lang/resolve/calls/CandidateResolver.java | 3 ++- .../BasicExpressionTypingVisitor.java | 9 +++++---- .../tests/inline/regressions/kt4341.kt | 6 ++++++ .../checkers/JetDiagnosticsTestGenerated.java | 16 +++++++++++++++- 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 9e3b0d3acbf..876298066e7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -367,7 +367,8 @@ public class CandidateResolver { CallCandidateResolutionContext contextForArgument = storedContextForArgument .replaceContextDependency(INDEPENDENT).replaceBindingTrace(context.trace).replaceExpectedType(expectedType); JetType type; - if (contextForArgument.candidateCall.hasIncompleteTypeParameters()) { + if (contextForArgument.candidateCall.hasIncompleteTypeParameters() + && !contextForArgument.candidateCall.isCompleted()) { //e.g. 'equals' argument type = completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument, true); } else { 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 b9688367df3..81baf9d1ca4 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 @@ -883,10 +883,12 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { dataFlowInfo = leftTypeInfo.getDataFlowInfo(); ExpressionTypingContext contextWithDataFlow = context.replaceDataFlowInfo(dataFlowInfo); + JetTypeInfo rightTypeInfo = facade.getTypeInfo(right, contextWithDataFlow); + dataFlowInfo = rightTypeInfo.getDataFlowInfo(); + TemporaryBindingTrace traceInterpretingRightAsNullableAny = TemporaryBindingTrace.create( - context.trace, "trace to resolve 'equals(Any?)' interpreting as of type Any? an expression:" + right); + context.trace, "trace to resolve 'equals(Any?)' interpreting as of type Any? an expression:", right); traceInterpretingRightAsNullableAny.record(EXPRESSION_TYPE, right, KotlinBuiltIns.getInstance().getNullableAnyType()); - traceInterpretingRightAsNullableAny.record(PROCESSED, right); Call call = CallMaker.makeCallWithExpressions(operationSign, receiver, null, operationSign, Collections.singletonList(right)); ExpressionTypingContext newContext = context.replaceBindingTrace(traceInterpretingRightAsNullableAny); @@ -897,7 +899,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @Override public boolean accept(@Nullable WritableSlice slice, Object key) { // the type of the right expression isn't 'Any?' actually - if (key == right && (slice == EXPRESSION_TYPE || slice == PROCESSED)) return false; + if (key == right && slice == EXPRESSION_TYPE) return false; // a hack due to KT-678 // without this line an autocast is reported on the receiver (if it was previously checked for not-null) @@ -907,7 +909,6 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return true; } }, true); - dataFlowInfo = facade.getTypeInfo(right, contextWithDataFlow).getDataFlowInfo(); if (resolutionResults.isSuccess()) { FunctionDescriptor equals = resolutionResults.getResultingCall().getResultingDescriptor(); diff --git a/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt b/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt new file mode 100644 index 00000000000..98486f0ec47 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt @@ -0,0 +1,6 @@ +//KT-4341 No resolved call for right-hand side of equals expression +package g + +inline fun inlineFunWithInvoke(s: (p: T) -> U) { + s == s //resolved call for right-hand side 's' not traced +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 66053c208c4..e50e8cac752 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -4039,7 +4039,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { } @TestMetadata("compiler/testData/diagnostics/tests/inline") - @InnerTestClasses({Inline.BinaryExpressions.class, Inline.NonPublicMember.class, Inline.UnaryExpressions.class}) + @InnerTestClasses({Inline.BinaryExpressions.class, Inline.NonPublicMember.class, Inline.Regressions.class, Inline.UnaryExpressions.class}) public static class Inline extends AbstractJetDiagnosticsTest { public void testAllFilesPresentInInline() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/inline"), Pattern.compile("^(.+)\\.kt$"), true); @@ -4236,6 +4236,19 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { } + @TestMetadata("compiler/testData/diagnostics/tests/inline/regressions") + public static class Regressions extends AbstractJetDiagnosticsTest { + public void testAllFilesPresentInRegressions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/inline/regressions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("kt4341.kt") + public void testKt4341() throws Exception { + doTest("compiler/testData/diagnostics/tests/inline/regressions/kt4341.kt"); + } + + } + @TestMetadata("compiler/testData/diagnostics/tests/inline/unaryExpressions") public static class UnaryExpressions extends AbstractJetDiagnosticsTest { public void testAllFilesPresentInUnaryExpressions() throws Exception { @@ -4259,6 +4272,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { suite.addTestSuite(Inline.class); suite.addTestSuite(BinaryExpressions.class); suite.addTestSuite(NonPublicMember.class); + suite.addTestSuite(Regressions.class); suite.addTestSuite(UnaryExpressions.class); return suite; }