From 2365db13673da537343bfdb17c927232d03d531b Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 15 Oct 2014 15:05:08 +0400 Subject: [PATCH] Fixed KT-6011 Smart completion works for argument of wrong method #KT-6011 Fixed --- .../resolve/calls/model/DelegatingResolvedCall.java | 7 +++++++ .../resolve/calls/model/MutableResolvedCall.java | 3 --- .../jet/lang/resolve/calls/model/ResolvedCall.java | 4 ++++ .../jetbrains/jet/plugin/completion/ExpectedInfos.kt | 4 ++++ idea/testData/completion/smart/WrongReceiver.kt | 12 ++++++++++++ .../completion/JvmBasicCompletionTestGenerated.java | 5 ++++- .../completion/JvmSmartCompletionTestGenerated.java | 6 ++++++ 7 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 idea/testData/completion/smart/WrongReceiver.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/DelegatingResolvedCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/DelegatingResolvedCall.java index 55ecd0f97ac..e3b94de6284 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/DelegatingResolvedCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/DelegatingResolvedCall.java @@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.psi.ValueArgument; +import org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus; import org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.JetType; @@ -37,6 +38,12 @@ public abstract class DelegatingResolvedCall imple this.resolvedCall = resolvedCall; } + @NotNull + @Override + public ResolutionStatus getStatus() { + return resolvedCall.getStatus(); + } + @NotNull @Override public Call getCall() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java index 5445b753d35..c28b5f12543 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java @@ -28,9 +28,6 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor; public interface MutableResolvedCall extends ResolvedCall { - @NotNull - ResolutionStatus getStatus(); - void addStatus(@NotNull ResolutionStatus status); void setStatusToSuccess(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCall.java index 31427ba290c..292b4eb42a9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCall.java @@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.psi.ValueArgument; +import org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus; import org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.JetType; @@ -31,6 +32,9 @@ import java.util.List; import java.util.Map; public interface ResolvedCall { + @NotNull + ResolutionStatus getStatus(); + /** The call that was resolved to this ResolvedCall */ @NotNull Call getCall(); diff --git a/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt b/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt index 9c6be18c360..5d43adb5d3a 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt @@ -67,6 +67,7 @@ import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.lang.descriptors.VariableDescriptor +import org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus enum class Tail { COMMA @@ -166,6 +167,9 @@ class ExpectedInfos(val bindingContext: BindingContext, val resolveSession: Reso val expectedInfos = HashSet() for (candidate: ResolvedCall in results.getAllCandidates()!!) { + val status = candidate.getStatus() + if (status == ResolutionStatus.RECEIVER_TYPE_ERROR || status == ResolutionStatus.RECEIVER_PRESENCE_ERROR) continue + // consider only candidates with more arguments than in the truncated call and with all arguments before the current one matched if (candidate.noErrorsInValueArguments() && (candidate.getCandidateDescriptor().getValueParameters().size > argumentIndex || isFunctionLiteralArgument)) { val descriptor = candidate.getResultingDescriptor() diff --git a/idea/testData/completion/smart/WrongReceiver.kt b/idea/testData/completion/smart/WrongReceiver.kt new file mode 100644 index 00000000000..79868cb09a3 --- /dev/null +++ b/idea/testData/completion/smart/WrongReceiver.kt @@ -0,0 +1,12 @@ +fun String.foo(a: Int){} + +class C { + fun foo(s: String){} + + fun bar(p1: String, p2: Int) { + "".foo() + } +} + +// ABSENT: p1 +// EXIST: p2 diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index f5c73272202..2b386c6dd81 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -17,10 +17,13 @@ package org.jetbrains.jet.completion; import com.intellij.testFramework.TestDataPath; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.junit.runner.RunWith; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.junit.runner.RunWith; +import org.jetbrains.jet.JUnit3RunnerWithInners; import java.io.File; import java.util.regex.Pattern; diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index eba6aed72f1..b6a8e9168bf 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -788,4 +788,10 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest(fileName); } + @TestMetadata("WrongReceiver.kt") + public void testWrongReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/WrongReceiver.kt"); + doTest(fileName); + } + }