Fixes: use isExactFunctionOrExtensionFunctionType() to detect when lambda can be passed
This commit is contained in:
@@ -188,7 +188,7 @@ class ExpectedInfos(
|
||||
if (parameter.hasDefaultValue()) return false // parameter is optional
|
||||
if (parameter.getVarargElementType() != null) return false // vararg arguments list can be empty
|
||||
// last parameter of functional type can be placed outside parenthesis:
|
||||
if (parameter == parameters.last() && KotlinBuiltIns.isFunctionOrExtensionFunctionType(parameter.getType())) return false
|
||||
if (parameter == parameters.last() && KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(parameter.getType())) return false
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -303,7 +303,7 @@ public class LookupElementFactory(
|
||||
|
||||
1 -> {
|
||||
val parameterType = parameters.single().getType()
|
||||
if (KotlinBuiltIns.isFunctionOrExtensionFunctionType(parameterType)) {
|
||||
if (KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(parameterType)) {
|
||||
val parameterCount = KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(parameterType).size()
|
||||
if (parameterCount <= 1) {
|
||||
// otherwise additional item with lambda template is to be added
|
||||
|
||||
+1
-1
@@ -106,7 +106,7 @@ class LookupElementsCollector(
|
||||
val parameters = descriptor.getValueParameters()
|
||||
if (parameters.size() == 1) {
|
||||
val parameterType = parameters.get(0).getType()
|
||||
if (KotlinBuiltIns.isFunctionOrExtensionFunctionType(parameterType)) {
|
||||
if (KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(parameterType)) {
|
||||
val parameterCount = KotlinBuiltIns.getParameterTypeProjectionsFromFunctionType(parameterType).size()
|
||||
if (parameterCount > 1) {
|
||||
var lookupElement = lookupElementFactory.createLookupElement(descriptor, true)
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface I : () -> Unit
|
||||
|
||||
fun foo(i: I){}
|
||||
|
||||
fun bar() {
|
||||
<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: foo
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface I : () -> Unit
|
||||
|
||||
fun foo(i: I){}
|
||||
|
||||
fun bar() {
|
||||
foo(<caret>)
|
||||
}
|
||||
|
||||
// ELEMENT: foo
|
||||
+6
@@ -220,6 +220,12 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ParameterTypeIsDerivedFromFunction.kt")
|
||||
public void testParameterTypeIsDerivedFromFunction() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/highOrderFunctions/ParameterTypeIsDerivedFromFunction.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ReplaceByLambdaTemplateNoClosingParenth.kt")
|
||||
public void testReplaceByLambdaTemplateNoClosingParenth() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/highOrderFunctions/ReplaceByLambdaTemplateNoClosingParenth.kt");
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class MoveLambdaOutsideParenthesesIntention : JetSelfTargetingIntention<J
|
||||
// if there are functions among candidates but none of them have last function parameter then not show the intention
|
||||
if (candidates.isNotEmpty() && candidates.none {
|
||||
val lastParameter = it.getValueParameters().lastOrNull()
|
||||
lastParameter != null && KotlinBuiltIns.isFunctionOrExtensionFunctionType(lastParameter.getType())
|
||||
lastParameter != null && KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(lastParameter.getType())
|
||||
}) {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ private class LambdaToFunctionExpression(
|
||||
init {
|
||||
val bindingContext = functionLiteralExpression.analyze()
|
||||
val functionLiteralType = bindingContext.getType(functionLiteralExpression)
|
||||
assert(functionLiteralType != null && KotlinBuiltIns.isFunctionOrExtensionFunctionType(functionLiteralType)) {
|
||||
assert(functionLiteralType != null && KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(functionLiteralType)) {
|
||||
"Broken function type for expression: ${functionLiteralExpression.getText()}, at: ${DiagnosticUtils.atLocation(functionLiteralExpression)}"
|
||||
}
|
||||
receiverType = KotlinBuiltIns.getReceiverType(functionLiteralType)?.let { IdeDescriptorRenderers.SOURCE_CODE.renderType(it) }
|
||||
|
||||
Reference in New Issue
Block a user