From 6f234beb9c326d440e2b67f23e9c7058a1e8a997 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 21 Nov 2019 19:59:16 +0300 Subject: [PATCH] KT-34414 Make sure completion for suspend functional parameters works too - Replace `isFunctionType` with `isBuiltinFunctionalType` where it is relevant - ^KT-34414 Fixed --- .../kotlin/idea/completion/ContextVariablesProvider.kt | 4 ++-- .../kotlin/idea/completion/InsertHandlerProvider.kt | 3 ++- .../kotlin/idea/completion/LookupElementFactory.kt | 2 +- .../basic/common/highOrderFunctions/SuspendFunction.kt | 7 +++++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ContextVariablesProvider.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ContextVariablesProvider.kt index b4c0e4855af..941982b3d2b 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ContextVariablesProvider.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ContextVariablesProvider.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.completion import com.intellij.psi.PsiElement import com.intellij.util.SmartList -import org.jetbrains.kotlin.builtins.isFunctionTypeOrSubtype +import org.jetbrains.kotlin.builtins.isBuiltinFunctionalTypeOrSubtype import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver @@ -39,7 +39,7 @@ class RealContextVariablesProvider( ) : ContextVariablesProvider { val allFunctionTypeVariables by lazy { - collectVariables().filter { it.type.isFunctionTypeOrSubtype } + collectVariables().filter { it.type.isBuiltinFunctionalTypeOrSubtype } } private fun collectVariables(): Collection { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt index 8acce6d1753..44f24c9cf29 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.completion import com.intellij.codeInsight.completion.InsertHandler import com.intellij.codeInsight.lookup.LookupElement import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType +import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.completion.handlers.* @@ -51,7 +52,7 @@ class InsertHandlerProvider( if (callType != CallType.SUPER_MEMBERS) { // for super call we don't suggest to generate "super.foo { ... }" (seems to be non-typical use) val parameter = parameters.single() val parameterType = parameter.type - if (parameterType.isFunctionType) { + if (parameterType.isBuiltinFunctionalType) { if (getValueParametersCountFromFunctionType(parameterType) <= 1 && !parameter.hasDefaultValue()) { // otherwise additional item with lambda template is to be added return KotlinFunctionInsertHandler.Normal( diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt index ad705ef69be..45afd667ce9 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt @@ -75,7 +75,7 @@ class LookupElementFactory( companion object { fun hasSingleFunctionTypeParameter(descriptor: FunctionDescriptor): Boolean { val parameter = descriptor.original.valueParameters.singleOrNull() ?: return false - return parameter.type.isFunctionType + return parameter.type.isBuiltinFunctionalType } val CAST_REQUIRED_COLOR = JBColor(0x4E4040, 0x969696) diff --git a/idea/idea-completion/testData/basic/common/highOrderFunctions/SuspendFunction.kt b/idea/idea-completion/testData/basic/common/highOrderFunctions/SuspendFunction.kt index 4b846083531..955763a6b1d 100644 --- a/idea/idea-completion/testData/basic/common/highOrderFunctions/SuspendFunction.kt +++ b/idea/idea-completion/testData/basic/common/highOrderFunctions/SuspendFunction.kt @@ -1,9 +1,12 @@ +interface I : suspend () -> Unit + fun xfoo(p: suspend () -> Unit) {} -fun test() { +fun test(action: suspend () -> Unit, i: I, notSuspend: () -> Unit) { xf } // EXIST: { itemText:"xfoo", tailText:" {...} (p: suspend () -> Unit) ()", typeText:"Unit" } -// EXIST: { itemText:"xfoo", tailText:"(p: suspend () -> Unit) ()", typeText:"Unit" } +// EXIST: { itemText:"xfoo", tailText:"(action) ()", typeText:"Unit" } +// EXIST: { itemText:"xfoo", tailText:"(i) ()", typeText:"Unit" } // NOTHING_ELSE \ No newline at end of file