From c876759ee03ed5945bd98e056297bac19764813e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 6 Oct 2015 17:25:30 +0300 Subject: [PATCH] Insert ']' instead of ')' --- .../kotlin/idea/completion/ExpectedInfos.kt | 14 ++++++++------ .../smart/MultipleArgumentsItemProvider.kt | 16 +++++++++++----- .../handlers/smart/MultipleArgsIntoBrackets.kt | 7 +++++++ .../smart/MultipleArgsIntoBrackets.kt.after | 7 +++++++ .../smart/multipleArgsItem/CallWithBrackets.kt | 7 +++++++ .../test/JvmSmartCompletionTestGenerated.java | 6 ++++++ .../SmartCompletionHandlerTestGenerated.java | 6 ++++++ 7 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt create mode 100644 idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt.after create mode 100644 idea/idea-completion/testData/smart/multipleArgsItem/CallWithBrackets.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 2a7ede4bded..ac92264b31b 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 @@ -133,15 +133,16 @@ class ExpectedInfo( val ExpectedInfo.fuzzyType: FuzzyType? get() = (this.filter as? ByExpectedTypeFilter)?.fuzzyType -sealed class ArgumentPositionData(val function: FunctionDescriptor) : ExpectedInfo.AdditionalData { +sealed class ArgumentPositionData(val function: FunctionDescriptor, val callType: Call.CallType) : ExpectedInfo.AdditionalData { class Positional( function: FunctionDescriptor, + callType: Call.CallType, val argumentIndex: Int, val isFunctionLiteralArgument: Boolean, val namedArgumentCandidates: Collection - ) : ArgumentPositionData(function) + ) : ArgumentPositionData(function, callType) - class Named(function: FunctionDescriptor, val argumentName: Name) : ArgumentPositionData(function) + class Named(function: FunctionDescriptor, callType: Call.CallType, val argumentName: Name) : ArgumentPositionData(function, callType) } class ReturnValueAdditionalData(val callable: CallableDescriptor) : ExpectedInfo.AdditionalData @@ -309,8 +310,10 @@ class ExpectedInfos( val argumentName = argument.getArgumentName()?.asName val isFunctionLiteralArgument = argument is FunctionLiteralArgument + val callType = call.callType + val argumentPositionData = if (argumentName != null) { - ArgumentPositionData.Named(descriptor, argumentName) + ArgumentPositionData.Named(descriptor, callType, argumentName) } else { val namedArgumentCandidates = if (!isFunctionLiteralArgument && descriptor.hasStableParameterNames()) { @@ -320,10 +323,9 @@ class ExpectedInfos( else { emptyList() } - ArgumentPositionData.Positional(descriptor, argumentIndex, isFunctionLiteralArgument, namedArgumentCandidates) + ArgumentPositionData.Positional(descriptor, callType, argumentIndex, isFunctionLiteralArgument, namedArgumentCandidates) } - val callType = call.callType val isArrayAccess = callType == Call.CallType.ARRAY_GET_METHOD || callType == Call.CallType.ARRAY_SET_METHOD val rparenthTail = if (isArrayAccess) Tail.RBRACKET else Tail.RPARENTH diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt index 5022de1de30..0d041ee3268 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.completion.SmartCastCalculator import org.jetbrains.kotlin.idea.completion.Tail import org.jetbrains.kotlin.idea.util.getVariableFromImplicitReceivers import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.psi.Call import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext @@ -47,16 +48,21 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext, val added = HashSet() for (expectedInfo in expectedInfos) { - if (expectedInfo.additionalData is ArgumentPositionData.Positional && expectedInfo.additionalData.argumentIndex == 0) { - val parameters = expectedInfo.additionalData.function.valueParameters + val additionalData = expectedInfo.additionalData + if (additionalData is ArgumentPositionData.Positional && additionalData.argumentIndex == 0) { + val parameters = additionalData.function.valueParameters if (parameters.size() > 1) { + val tail = when (additionalData.callType) { + Call.CallType.ARRAY_GET_METHOD, Call.CallType.ARRAY_SET_METHOD -> Tail.RBRACKET + else -> Tail.RPARENTH + } val variables = ArrayList() for ((i, parameter) in parameters.withIndex()) { val variable = variableInScope(parameter, resolutionScope) ?: break variables.add(variable) // TODO: cannot inline variable because of KT-5890 if (i > 0 && parameters.asSequence().drop(i + 1).all { it.hasDefaultValue() }) { // this is the last parameter or all others have default values - val lookupElement = createParametersLookupElement(variables) + val lookupElement = createParametersLookupElement(variables, tail) if (added.add(lookupElement.getLookupString())) { // check that we don't already have item with the same text collection.add(lookupElement) } @@ -67,7 +73,7 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext, } } - private fun createParametersLookupElement(variables: List): LookupElement { + private fun createParametersLookupElement(variables: List, tail: Tail): LookupElement { val compoundIcon = LayeredIcon(2) val firstIcon = JetDescriptorIconProvider.getIcon(variables.first(), null, 0) val lastIcon = JetDescriptorIconProvider.getIcon(variables.last(), null, 0) @@ -86,7 +92,7 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext, } .withIcon(compoundIcon) - .addTail(Tail.RPARENTH) //TODO: support square brackets + .addTail(tail) .assignSmartCompletionPriority(SmartCompletionItemPriority.MULTIPLE_ARGUMENTS_ITEM) } diff --git a/idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt b/idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt new file mode 100644 index 00000000000..64f57734e30 --- /dev/null +++ b/idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt @@ -0,0 +1,7 @@ +operator fun String.get(a: Int, b: String, c: String): Int = 0 + +fun bar(b: String, a: Int, c: String) { + ""[] +} + +// ELEMENT: "a, b, c" diff --git a/idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt.after b/idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt.after new file mode 100644 index 00000000000..4e6516f0286 --- /dev/null +++ b/idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt.after @@ -0,0 +1,7 @@ +operator fun String.get(a: Int, b: String, c: String): Int = 0 + +fun bar(b: String, a: Int, c: String) { + ""[a, b, c] +} + +// ELEMENT: "a, b, c" diff --git a/idea/idea-completion/testData/smart/multipleArgsItem/CallWithBrackets.kt b/idea/idea-completion/testData/smart/multipleArgsItem/CallWithBrackets.kt new file mode 100644 index 00000000000..96f73729ee6 --- /dev/null +++ b/idea/idea-completion/testData/smart/multipleArgsItem/CallWithBrackets.kt @@ -0,0 +1,7 @@ +operator fun String.get(a: Int, b: String, c: String): Int = 0 + +fun bar(b: String, a: Int, c: String) { + ""[] +} + +// EXIST: "a, b, c" 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 dc2f3c5b534..7cc8333330d 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 @@ -1356,6 +1356,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT public void testAllFilesPresentInMultipleArgsItem() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/smart/multipleArgsItem"), Pattern.compile("^(.+)\\.kt$"), true); } + + @TestMetadata("CallWithBrackets.kt") + public void testCallWithBrackets() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/multipleArgsItem/CallWithBrackets.kt"); + doTest(fileName); + } } @TestMetadata("idea/idea-completion/testData/smart/smartCasts") 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 9fc66b5b1f8..00cf7dc2610 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 @@ -569,6 +569,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest(fileName); } + @TestMetadata("MultipleArgsIntoBrackets.kt") + public void testMultipleArgsIntoBrackets() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/MultipleArgsIntoBrackets.kt"); + doTest(fileName); + } + @TestMetadata("MultipleArgsItem.kt") public void testMultipleArgsItem() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/MultipleArgsItem.kt");