From ee15eae6b37748e3925b39b2a51f6d097ae6b930 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 4 Jun 2015 22:21:11 +0300 Subject: [PATCH] Smart completion: function literal argument can correspond only to the last parameter! --- .../org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt | 6 ++---- .../handlers/smart/LastNonOptionalParamIsFunction.kt.after | 2 +- .../testData/handlers/smart/LastParamIsFunction.kt | 7 +++++++ .../testData/handlers/smart/LastParamIsFunction.kt.after | 7 +++++++ .../test/handlers/SmartCompletionHandlerTestGenerated.java | 6 ++++++ 5 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt create mode 100644 idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt.after diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt index 93b5ba48f8d..c8664e3b4a2 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt @@ -183,13 +183,11 @@ class ExpectedInfos( val expectedName = if (descriptor.hasSynthesizedParameterNames()) null else parameter.getName().asString() - val lastNonOptionalParam = parameters.lastOrNull { !it.hasDefaultValue() } - fun needCommaForParameter(parameter: ValueParameterDescriptor): Boolean { if (parameter.hasDefaultValue()) return false // parameter is optional if (parameter.getVarargElementType() != null) return false // vararg arguments list can be empty - // last non-optional parameter of functional type can be placed outside parenthesis: - if (parameter == lastNonOptionalParam && KotlinBuiltIns.isFunctionOrExtensionFunctionType(parameter.getType())) return false + // last parameter of functional type can be placed outside parenthesis: + if (parameter == parameters.last() && KotlinBuiltIns.isFunctionOrExtensionFunctionType(parameter.getType())) return false return true } diff --git a/idea/idea-completion/testData/handlers/smart/LastNonOptionalParamIsFunction.kt.after b/idea/idea-completion/testData/handlers/smart/LastNonOptionalParamIsFunction.kt.after index 72a6b758102..84e561688f2 100644 --- a/idea/idea-completion/testData/handlers/smart/LastNonOptionalParamIsFunction.kt.after +++ b/idea/idea-completion/testData/handlers/smart/LastNonOptionalParamIsFunction.kt.after @@ -1,7 +1,7 @@ fun foo(p: Int, handler: () -> Unit, optional: String = ""){} fun bar(p: Int) { - foo(p) + foo(p, ) } // ELEMENT: p diff --git a/idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt b/idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt new file mode 100644 index 00000000000..cccf94fcd4a --- /dev/null +++ b/idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt @@ -0,0 +1,7 @@ +fun foo(p: Int, handler: () -> Unit){} + +fun bar(p: Int) { + foo() +} + +// ELEMENT: p diff --git a/idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt.after b/idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt.after new file mode 100644 index 00000000000..596daad6724 --- /dev/null +++ b/idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt.after @@ -0,0 +1,7 @@ +fun foo(p: Int, handler: () -> Unit){} + +fun bar(p: Int) { + foo(p) +} + +// ELEMENT: p diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionHandlerTestGenerated.java index f5c8da25a89..d77bb1a1d9a 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionHandlerTestGenerated.java @@ -485,6 +485,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest(fileName); } + @TestMetadata("LastParamIsFunction.kt") + public void testLastParamIsFunction() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/LastParamIsFunction.kt"); + doTest(fileName); + } + @TestMetadata("MergeTail1.kt") public void testMergeTail1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/MergeTail1.kt");