From 2a3b87f783f9df2a8b416c2f517063f09479dd61 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 18 Apr 2016 21:44:40 +0300 Subject: [PATCH] KT-11784 Completion for 'if' statement should add parentheses automatically #KT-11784 Fixed --- .../idea/completion/BasicCompletionSession.kt | 46 +------- .../idea/completion/KeywordCompletion.kt | 51 ++++++--- .../handlers/KotlinKeywordInsertHandler.kt | 104 ++++++++++++++++++ .../testData/handlers/keywords/Catch.kt.after | 10 ++ .../testData/handlers/keywords/Catch.kt.todo | 10 ++ .../testData/handlers/keywords/Constructor.kt | 5 + .../handlers/keywords/Constructor.kt.after | 5 + .../testData/handlers/keywords/Do.kt | 5 + .../testData/handlers/keywords/Do.kt.after | 7 ++ .../testData/handlers/keywords/For.kt | 5 + .../testData/handlers/keywords/For.kt.after | 5 + .../testData/handlers/keywords/Getter1.kt | 3 +- .../handlers/keywords/Getter1.kt.after | 3 +- .../testData/handlers/keywords/Getter2.kt | 3 +- .../handlers/keywords/Getter2.kt.after | 3 +- .../testData/handlers/keywords/If.kt | 7 ++ .../testData/handlers/keywords/If.kt.after | 7 ++ .../testData/handlers/keywords/IfLParenth.kt | 8 ++ .../handlers/keywords/IfLParenth.kt.after | 8 ++ .../testData/handlers/keywords/IfSpace.kt | 8 ++ .../handlers/keywords/IfSpace.kt.after | 8 ++ .../testData/handlers/keywords/Init.kt | 5 + .../testData/handlers/keywords/Init.kt.after | 7 ++ .../testData/handlers/keywords/Setter1.kt | 3 +- .../handlers/keywords/Setter1.kt.after | 3 +- .../testData/handlers/keywords/Setter2.kt | 3 +- .../handlers/keywords/Setter2.kt.after | 3 +- .../testData/handlers/keywords/Try.kt | 7 ++ .../testData/handlers/keywords/Try.kt.after | 9 ++ .../testData/handlers/keywords/While.kt | 5 + .../testData/handlers/keywords/While.kt.after | 5 + .../testData/keywords/AfterClassProperty.kt | 12 +- .../keywords/GlobalPropertyAccessors.kt | 12 +- .../testData/keywords/PropertyAccessors.kt | 12 +- .../testData/keywords/PropertyAccessors2.kt | 12 +- .../testData/keywords/PropertySetter.kt | 6 +- ...KeywordCompletionHandlerTestGenerated.java | 54 +++++++++ 37 files changed, 378 insertions(+), 91 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/keywords/Catch.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/Catch.kt.todo create mode 100644 idea/idea-completion/testData/handlers/keywords/Constructor.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/Constructor.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/Do.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/Do.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/For.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/For.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/If.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/If.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/IfLParenth.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/IfLParenth.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/IfSpace.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/IfSpace.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/Init.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/Init.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/Try.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/Try.kt.after create mode 100644 idea/idea-completion/testData/handlers/keywords/While.kt create mode 100644 idea/idea-completion/testData/handlers/keywords/While.kt.after diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index 8f046c7dda6..8c6f3a94ccc 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -26,18 +26,17 @@ import com.intellij.codeInsight.template.TemplateManager import com.intellij.patterns.PatternCondition import com.intellij.patterns.StandardPatterns import com.intellij.psi.JavaPsiFacade -import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.ProcessingContext import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.idea.completion.handlers.createKeywordConstructLookupElement import org.jetbrains.kotlin.idea.completion.smart.ExpectedInfoMatch import org.jetbrains.kotlin.idea.completion.smart.SMART_COMPLETION_ITEM_PRIORITY_KEY import org.jetbrains.kotlin.idea.completion.smart.SmartCompletion import org.jetbrains.kotlin.idea.completion.smart.SmartCompletionItemPriority import org.jetbrains.kotlin.idea.core.ExpectedInfo import org.jetbrains.kotlin.idea.project.ProjectStructureUtil -import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.lexer.KtTokens @@ -376,8 +375,8 @@ class BasicCompletionSession( collector.addElement(lookupElement) if (!isUseSiteAnnotationTarget) { - collector.addElement(createKeywordConstructLookupElement(keyword, "val v:Int get()=caret", "caret")) - collector.addElement(createKeywordConstructLookupElement(keyword, "val v:Int get(){caret}", "caret", trimSpacesAroundCaret = true)) + collector.addElement(createKeywordConstructLookupElement(project, keyword, "val v:Int get()=caret")) + collector.addElement(createKeywordConstructLookupElement(project, keyword, "val v:Int get(){caret}", trimSpacesAroundCaret = true)) } } @@ -385,8 +384,8 @@ class BasicCompletionSession( collector.addElement(lookupElement) if (!isUseSiteAnnotationTarget) { - collector.addElement(createKeywordConstructLookupElement(keyword, "var v:Int set(value)=caret", "caret")) - collector.addElement(createKeywordConstructLookupElement(keyword, "var v:Int set(value){caret}", "caret", trimSpacesAroundCaret = true)) + collector.addElement(createKeywordConstructLookupElement(project, keyword, "var v:Int set(value)=caret")) + collector.addElement(createKeywordConstructLookupElement(project, keyword, "var v:Int set(value){caret}", trimSpacesAroundCaret = true)) } } @@ -394,41 +393,6 @@ class BasicCompletionSession( } } } - - private fun createKeywordConstructLookupElement( - keyword: String, - fileTextToReformat: String, - caretPlaceHolder: String, - trimSpacesAroundCaret: Boolean = false - ): LookupElement { - val file = KtPsiFactory(project).createFile(fileTextToReformat) - CodeStyleManager.getInstance(project).reformat(file) - val newFileText = file.text - - val keywordOffset = newFileText.indexOf(keyword) - assert(keywordOffset >= 0) - val keywordEndOffset = keywordOffset + keyword.length - - val caretOffset = newFileText.indexOf(caretPlaceHolder) - assert(caretOffset >= 0) - assert(caretOffset >= keywordEndOffset) - - var tailBeforeCaret = newFileText.substring(keywordEndOffset, caretOffset) - var tailAfterCaret = newFileText.substring(caretOffset + caretPlaceHolder.length) - - if (trimSpacesAroundCaret) { - tailBeforeCaret = tailBeforeCaret.trimEnd() - tailAfterCaret = tailAfterCaret.trimStart() - } - - return LookupElementBuilder.create(KeywordLookupObject(), keyword + tailBeforeCaret + tailAfterCaret) - .withPresentableText(keyword) - .bold() - .withTailText(tailBeforeCaret + tailAfterCaret) - .withInsertHandler { insertionContext, lookupElement -> - insertionContext.editor.moveCaret(insertionContext.editor.caretModel.offset - tailAfterCaret.length) - } - } } private val NAMED_ARGUMENTS_ONLY = object : CompletionKind { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt index 88797e8d072..80b8c08aa88 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.* import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler import org.jetbrains.kotlin.idea.completion.handlers.KotlinKeywordInsertHandler import org.jetbrains.kotlin.idea.completion.handlers.UseSiteAnnotationTargetInsertHandler +import org.jetbrains.kotlin.idea.completion.handlers.createKeywordConstructLookupElement import org.jetbrains.kotlin.lexer.KtKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens @@ -58,6 +59,19 @@ object KeywordCompletion { ANNOTATION_KEYWORD to CLASS_KEYWORD ) + private val KEYWORD_CONSTRUCTS = mapOf( + IF_KEYWORD to "fun foo() { if (caret)", + WHILE_KEYWORD to "fun foo() { while(caret)", + FOR_KEYWORD to "fun foo() { for(caret)", + TRY_KEYWORD to "fun foo() { try {\ncaret\n}", +/* TODO! + CATCH_KEYWORD to "fun foo() { try {} catch ()", +*/ + DO_KEYWORD to "fun foo() { do {\ncaret\n}", + INIT_KEYWORD to "class C { init {\ncaret\n}", + CONSTRUCTOR_KEYWORD to "class C { constructor(caret)" + ) + fun complete(position: PsiElement, prefix: String, isJvmModule: Boolean, consumer: (LookupElement) -> Unit) { if (!GENERAL_FILTER.isAcceptable(position, position)) return @@ -85,23 +99,30 @@ object KeywordCompletion { if (!parserFilter(keywordToken)) continue - var element = LookupElementBuilder.create(KeywordLookupObject(), keyword).bold() - - val isUseSiteAnnotationTarget = position.prevLeaf()?.node?.elementType == KtTokens.AT - - val insertHandler = if (isUseSiteAnnotationTarget) - UseSiteAnnotationTargetInsertHandler - else if (keywordToken !in FUNCTION_KEYWORDS) - KotlinKeywordInsertHandler - else - KotlinFunctionInsertHandler.Normal(inputTypeArguments = false, inputValueArguments = false) - element = element.withInsertHandler(insertHandler) - - if (isUseSiteAnnotationTarget) { - element = element.withPresentableText(keyword + ":") + val constructText = KEYWORD_CONSTRUCTS[keywordToken] + if (constructText != null) { + val element = createKeywordConstructLookupElement(position.project, keyword, constructText, showConstructInLookup = false) + consumer(element) } + else { + var element = LookupElementBuilder.create(KeywordLookupObject(), keyword).bold() - consumer(element) + val isUseSiteAnnotationTarget = position.prevLeaf()?.node?.elementType == KtTokens.AT + + val insertHandler = if (isUseSiteAnnotationTarget) + UseSiteAnnotationTargetInsertHandler + else if (keywordToken !in FUNCTION_KEYWORDS) + KotlinKeywordInsertHandler + else + KotlinFunctionInsertHandler.Normal(inputTypeArguments = false, inputValueArguments = false) + element = element.withInsertHandler(insertHandler) + + if (isUseSiteAnnotationTarget) { + element = element.withPresentableText(keyword + ":") + } + + consumer(element) + } } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt index eb66859ea0b..5378baf682a 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt @@ -18,8 +18,15 @@ package org.jetbrains.kotlin.idea.completion.handlers import com.intellij.codeInsight.completion.InsertHandler import com.intellij.codeInsight.completion.InsertionContext +import com.intellij.codeInsight.lookup.Lookup import com.intellij.codeInsight.lookup.LookupElement +import com.intellij.codeInsight.lookup.LookupElementBuilder +import com.intellij.openapi.project.Project +import com.intellij.psi.codeStyle.CodeStyleManager +import org.jetbrains.kotlin.idea.completion.KeywordLookupObject +import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.lexer.KtTokens.* +import org.jetbrains.kotlin.psi.KtPsiFactory object KotlinKeywordInsertHandler : InsertHandler { private val NO_SPACE_AFTER = listOf(THIS_KEYWORD, @@ -51,6 +58,103 @@ object KotlinKeywordInsertHandler : InsertHandler { } } +fun createKeywordConstructLookupElement( + project: Project, + keyword: String, + fileTextToReformat: String, + trimSpacesAroundCaret: Boolean = false, + showConstructInLookup: Boolean = true +): LookupElement { + val file = KtPsiFactory(project).createFile(fileTextToReformat) + CodeStyleManager.getInstance(project).reformat(file) + val newFileText = file.text + + val keywordOffset = newFileText.indexOf(keyword) + assert(keywordOffset >= 0) + val keywordEndOffset = keywordOffset + keyword.length + + val caretPlaceHolder = "caret" + + val caretOffset = newFileText.indexOf(caretPlaceHolder) + assert(caretOffset >= 0) + assert(caretOffset >= keywordEndOffset) + + var tailBeforeCaret = newFileText.substring(keywordEndOffset, caretOffset) + var tailAfterCaret = newFileText.substring(caretOffset + caretPlaceHolder.length) + + if (trimSpacesAroundCaret) { + tailBeforeCaret = tailBeforeCaret.trimEnd() + tailAfterCaret = tailAfterCaret.trimStart() + } + + val indent = detectIndent(newFileText, keywordOffset) + if (indent != null) { + tailBeforeCaret = tailBeforeCaret.unindent(indent) + tailAfterCaret = tailAfterCaret.unindent(indent) + } + + var lookupElementBuilder = LookupElementBuilder.create(KeywordLookupObject(), keyword) + .bold() + .withInsertHandler { insertionContext, lookupElement -> + if (insertionContext.completionChar == Lookup.NORMAL_SELECT_CHAR || insertionContext.completionChar == Lookup.REPLACE_SELECT_CHAR) { + val offset = insertionContext.tailOffset + val newIndent = detectIndent(insertionContext.document.charsSequence, offset - keyword.length) + var beforeCaret = tailBeforeCaret + var afterCaret = tailAfterCaret + if (newIndent != null) { + beforeCaret = beforeCaret.indentLinesAfterFirst(newIndent) + afterCaret = afterCaret.indentLinesAfterFirst(newIndent) + } + insertionContext.document.insertString(offset, beforeCaret + afterCaret) + insertionContext.editor.moveCaret(offset + beforeCaret.length) + } + } + if (showConstructInLookup) { + lookupElementBuilder = lookupElementBuilder.withTailText(tailBeforeCaret + tailAfterCaret) + } + return lookupElementBuilder +} + +private fun detectIndent(text: CharSequence, offset: Int): String? { + val reversedIndent = buildString { + var index = offset - 1 + Loop@ + while (index >= 0) { + val c = text[index] + when (c) { + ' ', '\t' -> append(c) + '\r', '\n' -> break@Loop + else -> return null + } + index-- + } + } + return reversedIndent.reversed() +} + +private fun String.indentLinesAfterFirst(indent: String): String { + val text = this + return buildString { + val lines = text.lines() + for ((index, line) in lines.withIndex()) { + if (index > 0) append(indent) + append(line) + if (index != lines.lastIndex) append('\n') + } + } +} + +private fun String.unindent(indent: String): String { + val text = this + return buildString { + val lines = text.lines() + for ((index, line) in lines.withIndex()) { + append(line.removePrefix(indent)) + if (index != lines.lastIndex) append('\n') + } + } +} + object UseSiteAnnotationTargetInsertHandler : InsertHandler { override fun handleInsert(context: InsertionContext, item: LookupElement) { WithTailInsertHandler(":", spaceBefore = false, spaceAfter = false).postHandleInsert(context, item) diff --git a/idea/idea-completion/testData/handlers/keywords/Catch.kt.after b/idea/idea-completion/testData/handlers/keywords/Catch.kt.after new file mode 100644 index 00000000000..56f4a3f64ed --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Catch.kt.after @@ -0,0 +1,10 @@ +fun t() { + while (true) { + try { + + } + catch () + } +} + +// ELEMENT: catch \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Catch.kt.todo b/idea/idea-completion/testData/handlers/keywords/Catch.kt.todo new file mode 100644 index 00000000000..00fd4e70504 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Catch.kt.todo @@ -0,0 +1,10 @@ +fun t() { + while (true) { + try { + + } + c + } +} + +// ELEMENT: catch \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Constructor.kt b/idea/idea-completion/testData/handlers/keywords/Constructor.kt new file mode 100644 index 00000000000..23d7c08a4c4 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Constructor.kt @@ -0,0 +1,5 @@ +class C { + c +} + +// ELEMENT: constructor \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Constructor.kt.after b/idea/idea-completion/testData/handlers/keywords/Constructor.kt.after new file mode 100644 index 00000000000..3a596e7fb67 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Constructor.kt.after @@ -0,0 +1,5 @@ +class C { + constructor() +} + +// ELEMENT: constructor \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Do.kt b/idea/idea-completion/testData/handlers/keywords/Do.kt new file mode 100644 index 00000000000..95e68317984 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Do.kt @@ -0,0 +1,5 @@ +fun t() { + d +} + +// ELEMENT: do \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Do.kt.after b/idea/idea-completion/testData/handlers/keywords/Do.kt.after new file mode 100644 index 00000000000..e5cfc713101 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Do.kt.after @@ -0,0 +1,7 @@ +fun t() { + do { + + } +} + +// ELEMENT: do \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/For.kt b/idea/idea-completion/testData/handlers/keywords/For.kt new file mode 100644 index 00000000000..971433e1e08 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/For.kt @@ -0,0 +1,5 @@ +fun t() { + f +} + +// ELEMENT: for \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/For.kt.after b/idea/idea-completion/testData/handlers/keywords/For.kt.after new file mode 100644 index 00000000000..b1103c4a15e --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/For.kt.after @@ -0,0 +1,5 @@ +fun t() { + for () +} + +// ELEMENT: for \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Getter1.kt b/idea/idea-completion/testData/handlers/keywords/Getter1.kt index d70e04b475c..39dc825755c 100644 --- a/idea/idea-completion/testData/handlers/keywords/Getter1.kt +++ b/idea/idea-completion/testData/handlers/keywords/Getter1.kt @@ -1,4 +1,5 @@ val v: Int g -// ELEMENT: "get() = " \ No newline at end of file +// ELEMENT: "get" +// TAIL_TEXT: "() = " \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Getter1.kt.after b/idea/idea-completion/testData/handlers/keywords/Getter1.kt.after index 527cab5d1e2..0e29891e5ed 100644 --- a/idea/idea-completion/testData/handlers/keywords/Getter1.kt.after +++ b/idea/idea-completion/testData/handlers/keywords/Getter1.kt.after @@ -1,4 +1,5 @@ val v: Int get() = -// ELEMENT: "get() = " \ No newline at end of file +// ELEMENT: "get" +// TAIL_TEXT: "() = " \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Getter2.kt b/idea/idea-completion/testData/handlers/keywords/Getter2.kt index 487bdbebe0c..b14ece60988 100644 --- a/idea/idea-completion/testData/handlers/keywords/Getter2.kt +++ b/idea/idea-completion/testData/handlers/keywords/Getter2.kt @@ -1,4 +1,5 @@ val v: Int g -// ELEMENT: "get() {}" \ No newline at end of file +// ELEMENT: "get" +// TAIL_TEXT: "() {}" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Getter2.kt.after b/idea/idea-completion/testData/handlers/keywords/Getter2.kt.after index bcd208c5b57..6867e0c8378 100644 --- a/idea/idea-completion/testData/handlers/keywords/Getter2.kt.after +++ b/idea/idea-completion/testData/handlers/keywords/Getter2.kt.after @@ -1,4 +1,5 @@ val v: Int get() {} -// ELEMENT: "get() {}" \ No newline at end of file +// ELEMENT: "get" +// TAIL_TEXT: "() {}" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/If.kt b/idea/idea-completion/testData/handlers/keywords/If.kt new file mode 100644 index 00000000000..b470db8595f --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/If.kt @@ -0,0 +1,7 @@ +fun t() { + while (true) { + i + } +} + +// ELEMENT: if \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/If.kt.after b/idea/idea-completion/testData/handlers/keywords/If.kt.after new file mode 100644 index 00000000000..d130f163164 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/If.kt.after @@ -0,0 +1,7 @@ +fun t() { + while (true) { + if () + } +} + +// ELEMENT: if \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/IfLParenth.kt b/idea/idea-completion/testData/handlers/keywords/IfLParenth.kt new file mode 100644 index 00000000000..15b8befd853 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/IfLParenth.kt @@ -0,0 +1,8 @@ +fun t() { + while (true) { + i + } +} + +// ELEMENT: if +// CHAR: '(' \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/IfLParenth.kt.after b/idea/idea-completion/testData/handlers/keywords/IfLParenth.kt.after new file mode 100644 index 00000000000..5858f48fd71 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/IfLParenth.kt.after @@ -0,0 +1,8 @@ +fun t() { + while (true) { + if() + } +} + +// ELEMENT: if +// CHAR: '(' \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/IfSpace.kt b/idea/idea-completion/testData/handlers/keywords/IfSpace.kt new file mode 100644 index 00000000000..0ca462989ad --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/IfSpace.kt @@ -0,0 +1,8 @@ +fun t() { + while (true) { + i + } +} + +// ELEMENT: if +// CHAR: ' ' \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/IfSpace.kt.after b/idea/idea-completion/testData/handlers/keywords/IfSpace.kt.after new file mode 100644 index 00000000000..52258c5c4ff --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/IfSpace.kt.after @@ -0,0 +1,8 @@ +fun t() { + while (true) { + if + } +} + +// ELEMENT: if +// CHAR: ' ' \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Init.kt b/idea/idea-completion/testData/handlers/keywords/Init.kt new file mode 100644 index 00000000000..16b654dfb10 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Init.kt @@ -0,0 +1,5 @@ +class C { + i +} + +// ELEMENT: init \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Init.kt.after b/idea/idea-completion/testData/handlers/keywords/Init.kt.after new file mode 100644 index 00000000000..999927fd788 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Init.kt.after @@ -0,0 +1,7 @@ +class C { + init { + + } +} + +// ELEMENT: init \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Setter1.kt b/idea/idea-completion/testData/handlers/keywords/Setter1.kt index 0e06288b218..a2ec914eb75 100644 --- a/idea/idea-completion/testData/handlers/keywords/Setter1.kt +++ b/idea/idea-completion/testData/handlers/keywords/Setter1.kt @@ -2,4 +2,5 @@ var v: Int get() = 0 s -// ELEMENT: "set(value) = " \ No newline at end of file +// ELEMENT: "set" +// TAIL_TEXT: "(value) = " \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Setter1.kt.after b/idea/idea-completion/testData/handlers/keywords/Setter1.kt.after index e297fe18295..b5f1850d952 100644 --- a/idea/idea-completion/testData/handlers/keywords/Setter1.kt.after +++ b/idea/idea-completion/testData/handlers/keywords/Setter1.kt.after @@ -2,4 +2,5 @@ var v: Int get() = 0 set(value) = -// ELEMENT: "set(value) = " \ No newline at end of file +// ELEMENT: "set" +// TAIL_TEXT: "(value) = " \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Setter2.kt b/idea/idea-completion/testData/handlers/keywords/Setter2.kt index 357285edbda..89ad2f834b6 100644 --- a/idea/idea-completion/testData/handlers/keywords/Setter2.kt +++ b/idea/idea-completion/testData/handlers/keywords/Setter2.kt @@ -2,4 +2,5 @@ var v: Int get() = 0 s -// ELEMENT: "set(value) {}" \ No newline at end of file +// ELEMENT: "set" +// TAIL_TEXT: "(value) {}" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Setter2.kt.after b/idea/idea-completion/testData/handlers/keywords/Setter2.kt.after index 464c2e29eea..d481643c7f2 100644 --- a/idea/idea-completion/testData/handlers/keywords/Setter2.kt.after +++ b/idea/idea-completion/testData/handlers/keywords/Setter2.kt.after @@ -2,4 +2,5 @@ var v: Int get() = 0 set(value) {} -// ELEMENT: "set(value) {}" \ No newline at end of file +// ELEMENT: "set" +// TAIL_TEXT: "(value) {}" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Try.kt b/idea/idea-completion/testData/handlers/keywords/Try.kt new file mode 100644 index 00000000000..c01b5efd9fe --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Try.kt @@ -0,0 +1,7 @@ +fun t() { + while (true) { + t + } +} + +// ELEMENT: try \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/Try.kt.after b/idea/idea-completion/testData/handlers/keywords/Try.kt.after new file mode 100644 index 00000000000..07d06f5ff3d --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/Try.kt.after @@ -0,0 +1,9 @@ +fun t() { + while (true) { + try { + + } + } +} + +// ELEMENT: try \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/While.kt b/idea/idea-completion/testData/handlers/keywords/While.kt new file mode 100644 index 00000000000..5ba6d2918fa --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/While.kt @@ -0,0 +1,5 @@ +fun t() { + w +} + +// ELEMENT: while \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/keywords/While.kt.after b/idea/idea-completion/testData/handlers/keywords/While.kt.after new file mode 100644 index 00000000000..8fa9fbeada3 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/While.kt.after @@ -0,0 +1,5 @@ +fun t() { + while () +} + +// ELEMENT: while \ No newline at end of file diff --git a/idea/idea-completion/testData/keywords/AfterClassProperty.kt b/idea/idea-completion/testData/keywords/AfterClassProperty.kt index 3440f963fcb..59c7456e1dd 100644 --- a/idea/idea-completion/testData/keywords/AfterClassProperty.kt +++ b/idea/idea-completion/testData/keywords/AfterClassProperty.kt @@ -10,9 +10,9 @@ class MouseMovedEventArgs // EXIST: enum class // EXIST: final // EXIST: fun -// EXIST: get -// EXIST: "get() = " -// EXIST: "get() {}" +// EXIST: { itemText: "get", tailText: null } +// EXIST: { itemText: "get", tailText: "() = " } +// EXIST: { itemText: "get", tailText: "() {}" } // EXIST: inner // EXIST: internal // EXIST: object @@ -21,9 +21,9 @@ class MouseMovedEventArgs // EXIST: private // EXIST: protected // EXIST: public -// EXIST: set -// EXIST: "set(value) = " -// EXIST: "set(value) {}" +// EXIST: { itemText: "set", tailText: null } +// EXIST: { itemText: "set", tailText: "(value) = " } +// EXIST: { itemText: "set", tailText: "(value) {}" } // EXIST: interface // EXIST: val // EXIST: var diff --git a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt index be2534f2035..0b83a351d4d 100644 --- a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt @@ -15,17 +15,17 @@ var a : Int // EXIST: enum class // EXIST: final // EXIST: fun -// EXIST: get -// EXIST: "get() = " -// EXIST: "get() {}" +// EXIST: { itemText: "get", tailText: null } +// EXIST: { itemText: "get", tailText: "() = " } +// EXIST: { itemText: "get", tailText: "() {}" } // EXIST: internal // EXIST: object // EXIST: open // EXIST: private // EXIST: public -// EXIST: set -// EXIST: "set(value) = " -// EXIST: "set(value) {}" +// EXIST: { itemText: "set", tailText: null } +// EXIST: { itemText: "set", tailText: "(value) = " } +// EXIST: { itemText: "set", tailText: "(value) {}" } // EXIST: interface // EXIST: val // EXIST: var diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors.kt b/idea/idea-completion/testData/keywords/PropertyAccessors.kt index d53e083eb44..a008de23786 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors.kt @@ -9,9 +9,9 @@ class Some { // EXIST: enum class // EXIST: final // EXIST: fun -// EXIST: get -// EXIST: "get() = " -// EXIST: "get() {}" +// EXIST: { itemText: "get", tailText: null } +// EXIST: { itemText: "get", tailText: "() = " } +// EXIST: { itemText: "get", tailText: "() {}" } // EXIST: inner // EXIST: internal // EXIST: object @@ -20,9 +20,9 @@ class Some { // EXIST: private // EXIST: protected // EXIST: public -// EXIST: set -// EXIST: "set(value) = " -// EXIST: "set(value) {}" +// EXIST: { itemText: "set", tailText: null } +// EXIST: { itemText: "set", tailText: "(value) = " } +// EXIST: { itemText: "set", tailText: "(value) {}" } // EXIST: interface // EXIST: val // EXIST: var diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt index b828edb7dd9..ea0e005e578 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt @@ -9,9 +9,9 @@ class Some { // EXIST: enum class // EXIST: final // EXIST: fun -// EXIST: get -// EXIST: "get() = " -// EXIST: "get() {}" +// EXIST: { itemText: "get", tailText: null } +// EXIST: { itemText: "get", tailText: "() = " } +// EXIST: { itemText: "get", tailText: "() {}" } // EXIST: inner // EXIST: internal // EXIST: object @@ -20,9 +20,9 @@ class Some { // EXIST: private // EXIST: protected // EXIST: public -// EXIST: set -// EXIST: "set(value) = " -// EXIST: "set(value) {}" +// EXIST: { itemText: "set", tailText: null } +// EXIST: { itemText: "set", tailText: "(value) = " } +// EXIST: { itemText: "set", tailText: "(value) {}" } // EXIST: interface // EXIST: val // EXIST: var diff --git a/idea/idea-completion/testData/keywords/PropertySetter.kt b/idea/idea-completion/testData/keywords/PropertySetter.kt index ee8d6b8076e..9605a8aba87 100644 --- a/idea/idea-completion/testData/keywords/PropertySetter.kt +++ b/idea/idea-completion/testData/keywords/PropertySetter.kt @@ -18,9 +18,9 @@ class Some { // EXIST: private // EXIST: protected // EXIST: public -// EXIST: set -// EXIST: "set(value) = " -// EXIST: "set(value) {}" +// EXIST: { itemText: "set", tailText: null } +// EXIST: { itemText: "set", tailText: "(value) = " } +// EXIST: { itemText: "set", tailText: "(value) {}" } // EXIST: interface // EXIST: val // EXIST: var diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java index 8f925f57047..044d6a8d09e 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java @@ -53,12 +53,30 @@ public class KeywordCompletionHandlerTestGenerated extends AbstractKeywordComple doTest(fileName); } + @TestMetadata("Constructor.kt") + public void testConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/Constructor.kt"); + doTest(fileName); + } + + @TestMetadata("Do.kt") + public void testDo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/Do.kt"); + doTest(fileName); + } + @TestMetadata("FileKeyword.kt") public void testFileKeyword() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/FileKeyword.kt"); doTest(fileName); } + @TestMetadata("For.kt") + public void testFor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/For.kt"); + doTest(fileName); + } + @TestMetadata("Getter1.kt") public void testGetter1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/Getter1.kt"); @@ -71,6 +89,30 @@ public class KeywordCompletionHandlerTestGenerated extends AbstractKeywordComple doTest(fileName); } + @TestMetadata("If.kt") + public void testIf() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/If.kt"); + doTest(fileName); + } + + @TestMetadata("IfLParenth.kt") + public void testIfLParenth() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/IfLParenth.kt"); + doTest(fileName); + } + + @TestMetadata("IfSpace.kt") + public void testIfSpace() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/IfSpace.kt"); + doTest(fileName); + } + + @TestMetadata("Init.kt") + public void testInit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/Init.kt"); + doTest(fileName); + } + @TestMetadata("NoSpaceAfterNull.kt") public void testNoSpaceAfterNull() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/NoSpaceAfterNull.kt"); @@ -149,6 +191,12 @@ public class KeywordCompletionHandlerTestGenerated extends AbstractKeywordComple doTest(fileName); } + @TestMetadata("Try.kt") + public void testTry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/Try.kt"); + doTest(fileName); + } + @TestMetadata("UseSiteAnnotationTarget1.kt") public void testUseSiteAnnotationTarget1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt"); @@ -166,4 +214,10 @@ public class KeywordCompletionHandlerTestGenerated extends AbstractKeywordComple String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt"); doTest(fileName); } + + @TestMetadata("While.kt") + public void testWhile() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/While.kt"); + doTest(fileName); + } }