From 89aaa018fe5d2d286e4f2856c17da18abb8f05ce Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 27 Aug 2014 21:45:46 +0400 Subject: [PATCH] Completion: escaping of named arguments --- .../completion/NamedParametersCompletion.kt | 25 ++++++++++--------- .../common/namedParameters/AfterBrace.kt | 2 +- .../common/namedParameters/AfterComma.kt | 4 +-- .../namedParameters/CompactTypeNames.kt | 4 +-- .../namedParameters/InParameterExpression.kt | 4 +-- .../NamedParametersFromOverloads.kt | 10 ++++---- .../NamedParamsInConstructor.kt | 4 +-- .../NoAlreadyUsedParameters.kt | 8 +++--- .../NoParamsFromUnapplicableOverload.kt | 8 +++--- .../namedParameters/NotOnlyNamedParameters.kt | 6 ++--- .../NotOnlyNamedParameters2.kt | 6 ++--- .../namedParameters/OnlyNamedParameters.kt | 6 ++--- .../WithParameterExpression.kt | 4 +-- .../basic/custom/NamedArgumentsKotlin.kt | 4 +-- .../handlers/NamedParameterKeywordName.kt | 5 ++++ .../NamedParameterKeywordName.kt.after | 5 ++++ .../completion/weighers/NamedParameters.kt | 4 +-- .../handlers/BasicCompletionHandlerTest.kt | 4 ++- 18 files changed, 63 insertions(+), 50 deletions(-) create mode 100644 idea/testData/completion/handlers/NamedParameterKeywordName.kt create mode 100644 idea/testData/completion/handlers/NamedParameterKeywordName.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt index b4b40310cf3..55f858edb11 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt @@ -36,7 +36,8 @@ import com.intellij.psi.filters.ClassFilter import org.jetbrains.jet.plugin.util.FirstChildInParentFilter import org.jetbrains.jet.lang.psi.psiUtil.getCallNameExpression import com.intellij.psi.PsiElement -import org.jetbrains.jet.plugin.completion.handlers.BaseDeclarationInsertHandler +import com.intellij.codeInsight.completion.InsertHandler +import org.jetbrains.jet.lang.resolve.name.Name object NamedParametersCompletion { private val positionFilter = AndFilter( @@ -83,13 +84,14 @@ object NamedParametersCompletion { val usedArguments = QuickFixUtil.getUsedParameters(callElement, valueArgument, funDescriptor) for (parameter in funDescriptor.getValueParameters()) { - val name = parameter.getName().asString() - if (name !in usedArguments) { - val lookupElement = LookupElementBuilder.create(parameter, name) - .withPresentableText("$name = ") - .withTailText("${DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(parameter.getType())}") + val name = parameter.getName() + val nameString = name.asString() + if (nameString !in usedArguments) { + val text = "$nameString =" + val lookupElement = LookupElementBuilder.create(text) + .withTailText(" ${DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(parameter.getType())}") .withIcon(JetIcons.PARAMETER) - .withInsertHandler(NamedParameterInsertHandler) + .withInsertHandler(NamedParameterInsertHandler(name)) .assignPriority(ItemPriority.NAMED_PARAMETER) lookupElement.putUserData(JetCompletionCharFilter.ACCEPT_EQ, true); @@ -99,7 +101,7 @@ object NamedParametersCompletion { } } - private object NamedParameterInsertHandler : BaseDeclarationInsertHandler() { + private class NamedParameterInsertHandler(val parameterName: Name) : InsertHandler { override fun handleInsert(context: InsertionContext, item: LookupElement) { val ch = context.getCompletionChar() if (ch == '=' || ch == ' ') { @@ -107,10 +109,9 @@ object NamedParametersCompletion { } val editor = context.getEditor() - val tailOffset = context.getTailOffset() - - editor.getDocument().insertString(tailOffset, " = ") - editor.getCaretModel().moveToOffset(tailOffset + 3) + val text = DescriptorRenderer.SOURCE_CODE.renderName(parameterName) + " = " + editor.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), text) + editor.getCaretModel().moveToOffset(context.getStartOffset() + text.length) } } } \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/AfterBrace.kt b/idea/testData/completion/basic/common/namedParameters/AfterBrace.kt index f7e60aff425..ea13c7f99c2 100644 --- a/idea/testData/completion/basic/common/namedParameters/AfterBrace.kt +++ b/idea/testData/completion/basic/common/namedParameters/AfterBrace.kt @@ -3,4 +3,4 @@ fun small(param: Int) { fun test() = small() -// EXIST: {"lookupString":"param","tailText":"Int","itemText":"param = "} \ No newline at end of file +// EXIST: {"lookupString":"param =","tailText":" Int","itemText":"param ="} \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/AfterComma.kt b/idea/testData/completion/basic/common/namedParameters/AfterComma.kt index bbef0242e95..c03edc69dac 100644 --- a/idea/testData/completion/basic/common/namedParameters/AfterComma.kt +++ b/idea/testData/completion/basic/common/namedParameters/AfterComma.kt @@ -3,5 +3,5 @@ fun small(first: Int, second: Int) { fun test() = small(12, ) -// ABSENT: first -// EXIST: second \ No newline at end of file +// ABSENT: "first =" +// EXIST: "second =" \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/CompactTypeNames.kt b/idea/testData/completion/basic/common/namedParameters/CompactTypeNames.kt index 4051aec5f1c..c9aab60647c 100644 --- a/idea/testData/completion/basic/common/namedParameters/CompactTypeNames.kt +++ b/idea/testData/completion/basic/common/namedParameters/CompactTypeNames.kt @@ -7,5 +7,5 @@ fun small(paramFirst: ArrayList, paramSecond: Comparable) -// EXIST: {"lookupString":"paramSecond","tailText":"Comparable","itemText":"paramSecond = "} -// EXIST: {"lookupString":"paramFirst","tailText":"ArrayList","itemText":"paramFirst = "} \ No newline at end of file +// EXIST: {"lookupString":"paramSecond =","tailText":" Comparable","itemText":"paramSecond ="} +// EXIST: {"lookupString":"paramFirst =","tailText":" ArrayList","itemText":"paramFirst ="} \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/InParameterExpression.kt b/idea/testData/completion/basic/common/namedParameters/InParameterExpression.kt index 376790fec2c..5fcb12a8ba8 100644 --- a/idea/testData/completion/basic/common/namedParameters/InParameterExpression.kt +++ b/idea/testData/completion/basic/common/namedParameters/InParameterExpression.kt @@ -6,6 +6,6 @@ fun small(paramFirst: Int, paramSecond: Int) { fun test() = small(paramFirst = param) // EXIST: paramTest -// ABSENT: {"lookupString":"paramFirst","tailText":"Int","itemText":"paramFirst = "} -// ABSENT: paramSecond +// ABSENT: {"lookupString":"paramFirst =","tailText":" Int","itemText":"paramFirst ="} +// ABSENT: "paramSecond =" // NUMBER: 1 \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/NamedParametersFromOverloads.kt b/idea/testData/completion/basic/common/namedParameters/NamedParametersFromOverloads.kt index 9251c69430a..3689fe27294 100644 --- a/idea/testData/completion/basic/common/namedParameters/NamedParametersFromOverloads.kt +++ b/idea/testData/completion/basic/common/namedParameters/NamedParametersFromOverloads.kt @@ -10,11 +10,11 @@ fun other() { foo(n) } -// EXIST: nFirst -// EXIST: nSecond -// EXIST: nThird +// EXIST: "nFirst =" +// EXIST: "nSecond =" +// EXIST: "nThird =" // EXIST: nLocal // todo - should exist -// ABSENT: nClassParam -// ABSENT: nClassField \ No newline at end of file +// ABSENT: "nClassParam =" +// ABSENT: "nClassField =" \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/NamedParamsInConstructor.kt b/idea/testData/completion/basic/common/namedParameters/NamedParamsInConstructor.kt index e759db3d59f..1157af6638f 100644 --- a/idea/testData/completion/basic/common/namedParameters/NamedParamsInConstructor.kt +++ b/idea/testData/completion/basic/common/namedParameters/NamedParamsInConstructor.kt @@ -6,5 +6,5 @@ fun other() { Foo(p) } -// EXIST: {"lookupString":"pFirst","tailText":"String?","itemText":"pFirst = "} -// EXIST: {"lookupString":"pSecond","tailText":"Int","itemText":"pSecond = "} \ No newline at end of file +// EXIST: {"lookupString":"pFirst =","tailText":" String?","itemText":"pFirst ="} +// EXIST: {"lookupString":"pSecond =","tailText":" Int","itemText":"pSecond ="} \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/NoAlreadyUsedParameters.kt b/idea/testData/completion/basic/common/namedParameters/NoAlreadyUsedParameters.kt index d1fce8ccd54..91ab373cc44 100644 --- a/idea/testData/completion/basic/common/namedParameters/NoAlreadyUsedParameters.kt +++ b/idea/testData/completion/basic/common/namedParameters/NoAlreadyUsedParameters.kt @@ -4,8 +4,8 @@ fun test() { foo("str", paramThird = "test", param) } -// ABSENT: paramFirst -// EXIST: paramSecond -// ABSENT: paramThird -// EXIST: paramFourth +// ABSENT: "paramFirst =" +// EXIST: "paramSecond =" +// ABSENT: "paramThird =" +// EXIST: "paramFourth =" diff --git a/idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt b/idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt index 0208ec5f0ce..d6cea25c235 100644 --- a/idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt +++ b/idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt @@ -5,7 +5,7 @@ fun test() { foo(12, param) } -// ABSENT: paramFirst -// EXIST: {"lookupString":"paramSecond","tailText":"Int","itemText":"paramSecond = "} -// ABSENT: paramThird -// ABSENT: paramFourth \ No newline at end of file +// ABSENT: "paramFirst =" +// EXIST: {"lookupString":"paramSecond =","tailText":" Int","itemText":"paramSecond ="} +// ABSENT: "paramThird =" +// ABSENT: "paramFourth =" \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt b/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt index 7fb4c496401..7d4c5506245 100644 --- a/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt +++ b/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt @@ -4,6 +4,6 @@ fun foo(first: Int, second: Int, third: String) { fun test(p: Int) = foo(12, , third = "") // EXIST: p -// ABSENT: first -// EXIST: third -// EXIST: second +// ABSENT: "first =" +// EXIST: "third =" +// EXIST: "second =" diff --git a/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters2.kt b/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters2.kt index a5089cd1bad..34e2cecdbf4 100644 --- a/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters2.kt +++ b/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters2.kt @@ -4,6 +4,6 @@ fun foo(first: Int, second: Int, third: String) { fun test(p: Int) = foo(second = 3) // EXIST: p -// EXIST: first -// EXIST: second -// EXIST: third +// EXIST: "first =" +// EXIST: "second =" +// EXIST: "third =" diff --git a/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt b/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt index a0f5378bbf6..c3842ad223c 100644 --- a/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt +++ b/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt @@ -4,7 +4,7 @@ fun foo(first: Int, second: Int, third: String) { fun test(p: Int) = foo(12, third = "", ) // ABSENT: p -// ABSENT: first -// ABSENT: third -// EXIST: second +// ABSENT: "first =" +// ABSENT: "third =" +// EXIST: "second =" // NUMBER: 1 \ No newline at end of file diff --git a/idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt b/idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt index dbe02b0f671..ce7fae1b6bd 100644 --- a/idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt +++ b/idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt @@ -5,8 +5,8 @@ fun small(paramFirst: Int, paramSecond: Int) { fun test() = small(paramFirst = 12) -// EXIST: paramFirst -// EXIST: paramSecond +// EXIST: "paramFirst =" +// EXIST: "paramSecond =" // EXIST: paramTest // NUMBER: 3 \ No newline at end of file diff --git a/idea/testData/completion/basic/custom/NamedArgumentsKotlin.kt b/idea/testData/completion/basic/custom/NamedArgumentsKotlin.kt index d582b29fda9..999df188137 100644 --- a/idea/testData/completion/basic/custom/NamedArgumentsKotlin.kt +++ b/idea/testData/completion/basic/custom/NamedArgumentsKotlin.kt @@ -2,5 +2,5 @@ import lib.KotlinClass fun test() = KotlinClass().foo() -// ABSENT: p0 -// EXIST: paramName +// ABSENT: "p0 =" +// EXIST: "paramName =" diff --git a/idea/testData/completion/handlers/NamedParameterKeywordName.kt b/idea/testData/completion/handlers/NamedParameterKeywordName.kt new file mode 100644 index 00000000000..e39ed8c542c --- /dev/null +++ b/idea/testData/completion/handlers/NamedParameterKeywordName.kt @@ -0,0 +1,5 @@ +fun foo(`class`: Int) {} + +fun test() { + foo() +} diff --git a/idea/testData/completion/handlers/NamedParameterKeywordName.kt.after b/idea/testData/completion/handlers/NamedParameterKeywordName.kt.after new file mode 100644 index 00000000000..c2cdee8781c --- /dev/null +++ b/idea/testData/completion/handlers/NamedParameterKeywordName.kt.after @@ -0,0 +1,5 @@ +fun foo(`class`: Int) {} + +fun test() { + foo(`class` = ) +} diff --git a/idea/testData/completion/weighers/NamedParameters.kt b/idea/testData/completion/weighers/NamedParameters.kt index 4d6654a16bb..2fc62d82a86 100644 --- a/idea/testData/completion/weighers/NamedParameters.kt +++ b/idea/testData/completion/weighers/NamedParameters.kt @@ -18,5 +18,5 @@ fun test(listParam: Int) { // ORDER: listImportedVal // ORDER: listThisFileFun // ORDER: listImportedFun -// ORDER: listMatch -// ORDER: listNew +// ORDER: "listMatch =" +// ORDER: "listNew =" diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt b/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt index dd4f9447bcd..f5e35916088 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt +++ b/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt @@ -48,7 +48,9 @@ public class BasicCompletionHandlerTest : CompletionHandlerTestBase(){ fun testNamedParametersCompletion() = doTest() - fun testNamedParametersCompletionOnEqual() = doTest(0, "paramTest", null, '=') + fun testNamedParametersCompletionOnEqual() = doTest(0, "paramTest =", null, '=') + + fun testNamedParameterKeywordName() = doTest(1, "class =", null, '\n') fun testInsertJavaClassImport() = doTest()