From 166b6db764dbb38a65c6426b13fe79acb098b6d4 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Mon, 10 Aug 2020 14:56:20 +0300 Subject: [PATCH] Make keyword lookup objects correctly comparable - This is done to fix the problem with duplicated keyword items in CodeWithMe plugin (see https://youtrack.jetbrains.com/issue/CWM-438) --- .../kotlin/idea/completion/KeywordCompletion.kt | 11 ++++++++++- .../kotlin/idea/completion/handlers/handlerUtils.kt | 8 +++++++- 2 files changed, 17 insertions(+), 2 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 b5f1b2a548f..11abbe4de65 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 @@ -48,7 +48,16 @@ import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.ModifierCheckerCore import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull -open class KeywordLookupObject +/** + * We want all [KeywordLookupObject]s to be equal to each other. + * + * That way, if the same keyword is completed twice, it would not be duplicated in the completion. This is not required in the regular + * completion, but can be a problem in CodeWithMe plugin (see https://youtrack.jetbrains.com/issue/CWM-438). + */ +open class KeywordLookupObject { + override fun equals(other: Any?): Boolean = this === other || javaClass == other?.javaClass + override fun hashCode(): Int = javaClass.hashCode() +} object KeywordCompletion { private val ALL_KEYWORDS = (KEYWORDS.types + SOFT_KEYWORDS.types) 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 e552ee252ed..042368070cf 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 @@ -100,6 +100,11 @@ fun CharSequence.isCharAt(offset: Int, c: Char) = offset < length && this[offset fun Document.isTextAt(offset: Int, text: String) = offset + text.length <= textLength && getText(TextRange(offset, offset + text.length)) == text +private data class KeywordConstructLookupObject( + private val keyword: String, + private val constructToInsert: String +) : KeywordLookupObject() + fun createKeywordConstructLookupElement( project: Project, keyword: String, @@ -136,7 +141,8 @@ fun createKeywordConstructLookupElement( "..." + (if (tailAfterCaret.contains('\n')) tailAfterCaret.replace("\n", "").trimStart() else tailAfterCaret) - return LookupElementBuilder.create(KeywordLookupObject(), keyword) + val lookupElement = KeywordConstructLookupObject(keyword, fileTextToReformat) + return LookupElementBuilder.create(lookupElement, keyword) .bold() .withTailText(tailText) .withInsertHandler { insertionContext, _ ->