From 54e9a46f1269fcb5a3ddba4c97a69c39e2abf03e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 4 Jun 2015 22:43:19 +0300 Subject: [PATCH] Smart completion: fixed in argument with "*" --- .../kotlin/idea/completion/ExpectedInfos.kt | 18 ++++++++++++++---- .../testData/handlers/smart/VarargAfterStar.kt | 7 +++++++ .../handlers/smart/VarargAfterStar.kt.after | 7 +++++++ .../testData/smart/NamedVarargAfterStar.kt | 9 +++++++++ .../testData/smart/VarargAfterStar.kt | 10 ++++++++++ .../test/JvmSmartCompletionTestGenerated.java | 12 ++++++++++++ .../SmartCompletionHandlerTestGenerated.java | 6 ++++++ 7 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt create mode 100644 idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt.after create mode 100644 idea/idea-completion/testData/smart/NamedVarargAfterStar.kt create mode 100644 idea/idea-completion/testData/smart/VarargAfterStar.kt 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 0ae1c5924ea..256a108de1a 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 @@ -203,26 +203,36 @@ class ExpectedInfos( namedArgumentTail(argumentToParameter, argumentName, descriptor) } + val alreadyHasStar = argument.getSpreadElement() != null + val varargElementType = parameter.getVarargElementType() if (varargElementType != null) { if (isFunctionLiteralArgument) continue + val starOptions = if (!alreadyHasStar) ItemOptions.STAR_PREFIX else ItemOptions.DEFAULT if (argumentName == null) { // even if it's the last parameter, there can be more arguments for the same parameter val varargTail = if (tail == Tail.RPARENTH) null else tail - expectedInfos.add(ArgumentExpectedInfo(varargElementType, expectedName?.unpluralize(), varargTail, descriptor, argumentPosition)) + if (!alreadyHasStar) { + expectedInfos.add(ArgumentExpectedInfo(varargElementType, expectedName?.unpluralize(), varargTail, descriptor, argumentPosition)) + } if (argumentIndex == parameters.indexOf(parameter)) { - expectedInfos.add(ArgumentExpectedInfo(parameter.getType(), expectedName, varargTail, descriptor, argumentPosition, ItemOptions.STAR_PREFIX)) + expectedInfos.add(ArgumentExpectedInfo(parameter.getType(), expectedName, varargTail, descriptor, argumentPosition, starOptions)) } } else { - expectedInfos.add(ArgumentExpectedInfo(varargElementType, expectedName?.unpluralize(), tail, descriptor, argumentPosition)) - expectedInfos.add(ArgumentExpectedInfo(parameter.getType(), expectedName, tail, descriptor, argumentPosition, ItemOptions.STAR_PREFIX)) + if (!alreadyHasStar) { + expectedInfos.add(ArgumentExpectedInfo(varargElementType, expectedName?.unpluralize(), tail, descriptor, argumentPosition)) + } + + expectedInfos.add(ArgumentExpectedInfo(parameter.getType(), expectedName, tail, descriptor, argumentPosition, starOptions)) } } else { + if (alreadyHasStar) continue + val parameterType = if (useHeuristicSignatures) HeuristicSignatures.correctedParameterType(descriptor, parameter, moduleDescriptor, callElement.getProject()) ?: parameter.getType() else diff --git a/idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt b/idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt new file mode 100644 index 00000000000..ba7efab3f51 --- /dev/null +++ b/idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt @@ -0,0 +1,7 @@ +fun foo(vararg strings: String){ } + +fun bar(list: List){ + foo(*list.) +} + +// ELEMENT: toTypedArray diff --git a/idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt.after b/idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt.after new file mode 100644 index 00000000000..d8a0b113814 --- /dev/null +++ b/idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt.after @@ -0,0 +1,7 @@ +fun foo(vararg strings: String){ } + +fun bar(list: List){ + foo(*list.toTypedArray()) +} + +// ELEMENT: toTypedArray diff --git a/idea/idea-completion/testData/smart/NamedVarargAfterStar.kt b/idea/idea-completion/testData/smart/NamedVarargAfterStar.kt new file mode 100644 index 00000000000..9dbfa21b8f4 --- /dev/null +++ b/idea/idea-completion/testData/smart/NamedVarargAfterStar.kt @@ -0,0 +1,9 @@ +fun foo(vararg args: Any){ } + +fun bar(s: String, arr: Array){ + foo(args = *) +} + +// ABSENT: s +// EXIST: { lookupString: "arr", itemText: "arr" } +// ABSENT: { lookupString: "arr", itemText: "*arr" } diff --git a/idea/idea-completion/testData/smart/VarargAfterStar.kt b/idea/idea-completion/testData/smart/VarargAfterStar.kt new file mode 100644 index 00000000000..dfdd86a9890 --- /dev/null +++ b/idea/idea-completion/testData/smart/VarargAfterStar.kt @@ -0,0 +1,10 @@ +fun foo(vararg args: Any){ } +fun foo(s: String){ } + +fun bar(s: String, arr: Array){ + foo(*) +} + +// ABSENT: s +// EXIST: { lookupString: "arr", itemText: "arr" } +// ABSENT: { lookupString: "arr", itemText: "*arr" } diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java index ef7b765ae1f..97b1a346227 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java @@ -269,6 +269,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest(fileName); } + @TestMetadata("NamedVarargAfterStar.kt") + public void testNamedVarargAfterStar() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/NamedVarargAfterStar.kt"); + doTest(fileName); + } + @TestMetadata("NoExtensionMethodFromClassObject.kt") public void testNoExtensionMethodFromClassObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/NoExtensionMethodFromClassObject.kt"); @@ -419,6 +425,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest(fileName); } + @TestMetadata("VarargAfterStar.kt") + public void testVarargAfterStar() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/VarargAfterStar.kt"); + doTest(fileName); + } + @TestMetadata("VariableAsFunction1.kt") public void testVariableAsFunction1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/VariableAsFunction1.kt"); 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 d77bb1a1d9a..a1116032f39 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 @@ -767,6 +767,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest(fileName); } + @TestMetadata("VarargAfterStar.kt") + public void testVarargAfterStar() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/VarargAfterStar.kt"); + doTest(fileName); + } + @TestMetadata("VarargWithParameterAfter.kt") public void testVarargWithParameterAfter() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/VarargWithParameterAfter.kt");