From 92070d132e476925ccee440c8f58fe61270a066f Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 20 Feb 2018 16:26:52 +0100 Subject: [PATCH] Completion: do not force dsl members to the top if some type is expected --- .../idea/completion/CompletionSession.kt | 7 ++- .../weighers/basic/DslCallWithExpectedType.kt | 45 +++++++++++++++++++ .../BasicCompletionWeigherTestGenerated.java | 6 +++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 idea/idea-completion/testData/weighers/basic/DslCallWithExpectedType.kt diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 5625725b691..bf8ec66bbd9 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -49,6 +49,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.checker.KotlinTypeChecker +import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import java.util.* @@ -269,7 +270,11 @@ abstract class CompletionSession( sorter = sorter.weighAfter("kotlin.proximity", ByNameAlphabeticalWeigher, PreferLessParametersWeigher) - sorter = sorter.weighBefore("prefix", PreferDslMembers) + if (expectedInfos.all { it.fuzzyType?.type?.isUnit() == true }) { + sorter = sorter.weighBefore("prefix", PreferDslMembers) + } else { + sorter = sorter.weighAfter("kotlin.preferContextElements", PreferDslMembers) + } return sorter } diff --git a/idea/idea-completion/testData/weighers/basic/DslCallWithExpectedType.kt b/idea/idea-completion/testData/weighers/basic/DslCallWithExpectedType.kt new file mode 100644 index 00000000000..b528ea55947 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/DslCallWithExpectedType.kt @@ -0,0 +1,45 @@ +// RUNTIME +package test + +import bar.r +import bar.foo3 + +fun main() { + val foo5 = 3 + r { + val j: String = foo + } +} + +@DslMarker +annotation class Dsl + + +@Dsl +class R + +fun r(body: R.() -> Unit) { + +} + +fun foo1(i: Int): String "" + +fun foo3() { + +} + +@Dsl +fun R.foobar2(): String = "" + +@Dsl +fun R.foobar4() { + +} + + + +// ORDER: foobar2 +// ORDER: foo1 +// ORDER: foo5 +// ORDER: foobar4 +// ORDER: foo3 diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java index 4b28ecf8489..cc37a0c0ce3 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java @@ -61,6 +61,12 @@ public class BasicCompletionWeigherTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("DslCallWithExpectedType.kt") + public void testDslCallWithExpectedType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/weighers/basic/DslCallWithExpectedType.kt"); + doTest(fileName); + } + @TestMetadata("DslCalls.kt") public void testDslCalls() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/weighers/basic/DslCalls.kt");