Tweak keyword completion for lateinit and companion object

#KT-13673 fixed
 #KT-12293 fixed
This commit is contained in:
Simon Ogorodnik
2017-04-24 19:53:19 +03:00
parent 3fb15a4423
commit bd2ad6a089
16 changed files with 38 additions and 29 deletions
@@ -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<KtKeywordToken, String>(
@@ -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)
}
@@ -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)
@@ -1,3 +1,5 @@
class C {
companion object<caret>
companion object {
<caret>
}
}
@@ -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
+2 -2
View File
@@ -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
@@ -3,4 +3,4 @@ class TestClass {
object O {}
}
// EXIST: "companion object"
// EXIST: { itemText: "companion object", tailText: " {...}" }
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -21,7 +21,7 @@ object Test {
// EXIST: operator
// EXIST: infix
// EXIST: sealed class
// EXIST: lateinit
// EXIST: lateinit var
// EXIST: data
// EXIST: inline
// EXIST: tailrec
@@ -18,5 +18,5 @@ class TestSample(<caret>)
/* TODO: keywords below should not be here*/
// EXIST: abstract
// EXIST: const
// EXIST: lateinit
// EXIST: lateinit var
// NOTHING_ELSE
@@ -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
@@ -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
+2 -2
View File
@@ -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