From bd2ad6a0897e307162a273127e7991490f2416b4 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 24 Apr 2017 19:53:19 +0300 Subject: [PATCH] Tweak keyword completion for lateinit and companion object #KT-13673 fixed #KT-12293 fixed --- .../kotlin/idea/completion/KeywordCompletion.kt | 14 +++++++++----- .../idea/completion/handlers/handlerUtils.kt | 5 ++++- .../handlers/keywords/CompanionObject.kt.after | 4 +++- .../testData/keywords/AfterClassProperty.kt | 4 ++-- .../idea-completion/testData/keywords/AfterFuns.kt | 4 ++-- .../keywords/CompanionObjectBeforeObject.kt | 2 +- .../testData/keywords/InAnnotationClassScope.kt | 2 +- .../testData/keywords/InClassBeforeFun.kt | 4 ++-- .../testData/keywords/InClassScope.kt | 4 ++-- .../testData/keywords/InEnumScope2.kt | 4 ++-- .../testData/keywords/InInterfaceScope.kt | 4 ++-- .../testData/keywords/InObjectScope.kt | 2 +- .../keywords/InPrimaryConstructorParametersList.kt | 2 +- .../testData/keywords/PropertyAccessors.kt | 4 ++-- .../testData/keywords/PropertyAccessors2.kt | 4 ++-- .../testData/keywords/PropertySetter.kt | 4 ++-- 16 files changed, 38 insertions(+), 29 deletions(-) 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 2bc49984dbb..caa2ef93292 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 @@ -58,7 +58,8 @@ object KeywordCompletion { COMPANION_KEYWORD to OBJECT_KEYWORD, ENUM_KEYWORD to CLASS_KEYWORD, ANNOTATION_KEYWORD to CLASS_KEYWORD, - SEALED_KEYWORD to CLASS_KEYWORD + SEALED_KEYWORD to CLASS_KEYWORD, + LATEINIT_KEYWORD to VAR_KEYWORD ) private val KEYWORD_CONSTRUCTS = mapOf( @@ -70,7 +71,8 @@ object KeywordCompletion { FINALLY_KEYWORD to "fun foo() { try {\n}\nfinally{\ncaret\n}", DO_KEYWORD to "fun foo() { do {\ncaret\n}", INIT_KEYWORD to "class C { init {\ncaret\n}", - CONSTRUCTOR_KEYWORD to "class C { constructor(caret)" + CONSTRUCTOR_KEYWORD to "class C { constructor(caret)", + COMPANION_KEYWORD to "class C { companion object {\ncaret\n}" ) private val NO_SPACE_AFTER = listOf(THIS_KEYWORD, @@ -95,6 +97,7 @@ object KeywordCompletion { var keyword = keywordToken.value val nextKeyword = COMPOUND_KEYWORDS[keywordToken] + var applicableAsCompound = false if (nextKeyword != null) { fun PsiElement.isSpace() = this is PsiWhiteSpace && '\n' !in getText() @@ -102,9 +105,10 @@ object KeywordCompletion { if (next != null && next.startsWith("$")) { next = next.substring(1) } - if (next != nextKeyword.value) { + if (next != nextKeyword.value) keyword += " " + nextKeyword.value - } + else + applicableAsCompound = true } if (keywordToken == DYNAMIC_KEYWORD && isJvmModule) continue // not supported for JVM @@ -115,7 +119,7 @@ object KeywordCompletion { if (!parserFilter(keywordToken)) continue val constructText = KEYWORD_CONSTRUCTS[keywordToken] - if (constructText != null) { + if (constructText != null && !applicableAsCompound) { val element = createKeywordConstructLookupElement(position.project, keyword, constructText) consumer(element) } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/handlerUtils.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/handlerUtils.kt index 2b2e43d7f1b..769e4871827 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/handlerUtils.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/handlerUtils.kt @@ -140,7 +140,10 @@ fun createKeywordConstructLookupElement( .bold() .withTailText(tailText) .withInsertHandler { insertionContext, _ -> - if (insertionContext.completionChar == Lookup.NORMAL_SELECT_CHAR || insertionContext.completionChar == Lookup.REPLACE_SELECT_CHAR) { + if (insertionContext.completionChar == Lookup.NORMAL_SELECT_CHAR || + insertionContext.completionChar == Lookup.REPLACE_SELECT_CHAR || + insertionContext.completionChar == Lookup.AUTO_INSERT_SELECT_CHAR) { + val offset = insertionContext.tailOffset val newIndent = detectIndent(insertionContext.document.charsSequence, offset - keyword.length) diff --git a/idea/idea-completion/testData/handlers/keywords/CompanionObject.kt.after b/idea/idea-completion/testData/handlers/keywords/CompanionObject.kt.after index bc65038821d..44bca97a302 100644 --- a/idea/idea-completion/testData/handlers/keywords/CompanionObject.kt.after +++ b/idea/idea-completion/testData/handlers/keywords/CompanionObject.kt.after @@ -1,3 +1,5 @@ class C { - companion object + companion object { + + } } \ 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 e6187c6f778..15bec318ffb 100644 --- a/idea/idea-completion/testData/keywords/AfterClassProperty.kt +++ b/idea/idea-completion/testData/keywords/AfterClassProperty.kt @@ -29,11 +29,11 @@ class MouseMovedEventArgs // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/AfterFuns.kt b/idea/idea-completion/testData/keywords/AfterFuns.kt index 53cc4138b0a..fde2d452207 100644 --- a/idea/idea-completion/testData/keywords/AfterFuns.kt +++ b/idea/idea-completion/testData/keywords/AfterFuns.kt @@ -28,11 +28,11 @@ class A { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/CompanionObjectBeforeObject.kt b/idea/idea-completion/testData/keywords/CompanionObjectBeforeObject.kt index cb6fcdd8bac..de17a952034 100644 --- a/idea/idea-completion/testData/keywords/CompanionObjectBeforeObject.kt +++ b/idea/idea-completion/testData/keywords/CompanionObjectBeforeObject.kt @@ -3,4 +3,4 @@ class TestClass { object O {} } -// EXIST: "companion object" +// EXIST: { itemText: "companion object", tailText: " {...}" } diff --git a/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt b/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt index 69a59dcfbb5..2df8341ad90 100644 --- a/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt +++ b/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt @@ -18,7 +18,7 @@ annotation class Test { // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt index 00f7bf3233e..35fd5907135 100644 --- a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt +++ b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt @@ -26,11 +26,11 @@ public class Test { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/InClassScope.kt b/idea/idea-completion/testData/keywords/InClassScope.kt index 56e6e5c7002..c9c61c0ea52 100644 --- a/idea/idea-completion/testData/keywords/InClassScope.kt +++ b/idea/idea-completion/testData/keywords/InClassScope.kt @@ -20,11 +20,11 @@ class TestClass { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/InEnumScope2.kt b/idea/idea-completion/testData/keywords/InEnumScope2.kt index 91f644c66e2..278b41af66e 100644 --- a/idea/idea-completion/testData/keywords/InEnumScope2.kt +++ b/idea/idea-completion/testData/keywords/InEnumScope2.kt @@ -14,11 +14,11 @@ enum class Test { // EXIST: private // EXIST: protected // EXIST: public -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/InInterfaceScope.kt b/idea/idea-completion/testData/keywords/InInterfaceScope.kt index 459245ef72c..4edc96079c4 100644 --- a/idea/idea-completion/testData/keywords/InInterfaceScope.kt +++ b/idea/idea-completion/testData/keywords/InInterfaceScope.kt @@ -16,11 +16,11 @@ interface Test { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/InObjectScope.kt b/idea/idea-completion/testData/keywords/InObjectScope.kt index 9d5da45884f..eaee53418cf 100644 --- a/idea/idea-completion/testData/keywords/InObjectScope.kt +++ b/idea/idea-completion/testData/keywords/InObjectScope.kt @@ -21,7 +21,7 @@ object Test { // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt b/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt index e143a85ff36..f2be4158b02 100644 --- a/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt +++ b/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt @@ -18,5 +18,5 @@ class TestSample() /* TODO: keywords below should not be here*/ // EXIST: abstract // EXIST: const -// EXIST: lateinit +// EXIST: lateinit var // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors.kt b/idea/idea-completion/testData/keywords/PropertyAccessors.kt index 0a62241a005..3865c0f270e 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors.kt @@ -28,11 +28,11 @@ class Some { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt index 2e116ddf721..8594fb935cc 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt @@ -28,11 +28,11 @@ class Some { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec diff --git a/idea/idea-completion/testData/keywords/PropertySetter.kt b/idea/idea-completion/testData/keywords/PropertySetter.kt index a8070bbc5a2..30c373a93c6 100644 --- a/idea/idea-completion/testData/keywords/PropertySetter.kt +++ b/idea/idea-completion/testData/keywords/PropertySetter.kt @@ -26,11 +26,11 @@ class Some { // EXIST: var // EXIST: constructor // EXIST: init -// EXIST: companion object +// EXIST: { itemText: "companion object", tailText: " {...}" } // EXIST: operator // EXIST: infix // EXIST: sealed class -// EXIST: lateinit +// EXIST: lateinit var // EXIST: data // EXIST: inline // EXIST: tailrec