If the last argument of a function is a suspend function,

suggest trailing lambda variant in completion.
This commit is contained in:
Dmitry Petrov
2016-12-15 16:00:22 +03:00
committed by Stanislav Erokhin
parent f9d550732e
commit 8e3fd0efc3
5 changed files with 27 additions and 5 deletions
@@ -16,8 +16,8 @@
package org.jetbrains.kotlin.resolve.calls.util
import org.jetbrains.kotlin.builtins.isExtensionFunctionType
import org.jetbrains.kotlin.builtins.isFunctionType
import org.jetbrains.kotlin.builtins.isBuiltinExtensionFunctionalType
import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
@@ -43,7 +43,7 @@ fun createValueParametersForInvokeInFunctionType(
}
fun getValueParametersCountFromFunctionType(type: KotlinType): Int {
assert(type.isFunctionType) { "Not a function type: $type" }
assert(type.isBuiltinFunctionalType) { "Not a function type: $type" }
// Function type arguments = receiver? + parameters + return-type
return type.arguments.size - (if (type.isExtensionFunctionType) 1 else 0) - 1
return type.arguments.size - (if (type.isBuiltinExtensionFunctionalType) 1 else 0) - 1
}
@@ -23,6 +23,7 @@ import com.intellij.codeInsight.lookup.LookupElementDecorator
import com.intellij.codeInsight.lookup.LookupElementPresentation
import com.intellij.codeInsight.lookup.impl.LookupCellRenderer
import com.intellij.util.SmartList
import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType
import org.jetbrains.kotlin.builtins.isFunctionType
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.completion.handlers.GenerateLambdaInfo
@@ -138,7 +139,7 @@ class LookupElementFactory(
val lastParameter = descriptor.valueParameters.lastOrNull() ?: return
if (!descriptor.valueParameters.all { it == lastParameter || it.hasDefaultValue() }) return
if (lastParameter.original.type.isFunctionType) {
if (lastParameter.original.type.isBuiltinFunctionalType) {
val isSingleParameter = descriptor.valueParameters.size == 1
val parameterType = lastParameter.type
@@ -0,0 +1,9 @@
fun xfoo(p: suspend () -> Unit) {}
fun test() {
xf<caret>
}
// EXIST: { itemText:"xfoo", tailText:" {...} (p: suspend () -> Unit) (<root>)", typeText:"Unit" }
// EXIST: { itemText:"xfoo", tailText:"(p: suspend () -> Unit) (<root>)", typeText:"Unit" }
// NOTHING_ELSE
@@ -1668,6 +1668,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/highOrderFunctions/OptionalParameters.kt");
doTest(fileName);
}
@TestMetadata("SuspendFunction.kt")
public void testSuspendFunction() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/highOrderFunctions/SuspendFunction.kt");
doTest(fileName);
}
}
@TestMetadata("idea/idea-completion/testData/basic/common/inStringLiterals")
@@ -1668,6 +1668,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/highOrderFunctions/OptionalParameters.kt");
doTest(fileName);
}
@TestMetadata("SuspendFunction.kt")
public void testSuspendFunction() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/highOrderFunctions/SuspendFunction.kt");
doTest(fileName);
}
}
@TestMetadata("idea/idea-completion/testData/basic/common/inStringLiterals")