From ed8aad614966b1b47715b4398198a3cf990c13a1 Mon Sep 17 00:00:00 2001 From: Alexander Podkhalyuzin Date: Tue, 11 Sep 2018 14:39:52 +0300 Subject: [PATCH] Override completion right after override modifier #KT-25312 Fixed --- .../idea/completion/OverridesCompletion.kt | 16 ++++++++++++++-- .../testData/handlers/basic/override/kt25312.kt | 8 ++++++++ .../handlers/basic/override/kt25312.kt.after | 8 ++++++++ .../BasicCompletionHandlerTestGenerated.java | 5 +++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/basic/override/kt25312.kt create mode 100644 idea/idea-completion/testData/handlers/basic/override/kt25312.kt.after diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt index 76a2d83ec7d..71b1ac38b0e 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt @@ -112,12 +112,24 @@ class OverridesCompletion( else -> "dummy() {}" } val dummyMemberText = dummyMemberHead + dummyMemberTail - context.document.replaceString(context.startOffset, context.tailOffset, dummyMemberText) + val override = KtTokens.OVERRIDE_KEYWORD.value + + tailrec fun calcStartOffset(startOffset: Int, diff: Int = 0): Int { + if (context.document.text[startOffset - 1].isWhitespace()) { + return calcStartOffset(startOffset - 1, diff + 1) + } else if (context.document.text.substring(startOffset - override.length, startOffset) == override) { + return startOffset - override.length + } else return diff + startOffset + } + + val startOffset = calcStartOffset(context.startOffset) + val tailOffset = context.tailOffset + context.document.replaceString(startOffset, tailOffset, dummyMemberText) val psiDocumentManager = PsiDocumentManager.getInstance(context.project) psiDocumentManager.commitAllDocuments() - val dummyMember = context.file.findElementAt(context.startOffset)!!.getStrictParentOfType()!! + val dummyMember = context.file.findElementAt(startOffset)!!.getStrictParentOfType()!! // keep original modifiers val modifierList = KtPsiFactory(context.project).createModifierList(dummyMember.modifierList!!.text) diff --git a/idea/idea-completion/testData/handlers/basic/override/kt25312.kt b/idea/idea-completion/testData/handlers/basic/override/kt25312.kt new file mode 100644 index 00000000000..e58d60793f7 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/override/kt25312.kt @@ -0,0 +1,8 @@ +interface Interface { + fun funA() +} + +expect class SClass : Interface { // there is no error highlighting about unimplemented members, see KT-25044 + override fu +} +// ELEMENT_TEXT: "override fun funA() {...}" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/override/kt25312.kt.after b/idea/idea-completion/testData/handlers/basic/override/kt25312.kt.after new file mode 100644 index 00000000000..b905107d371 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/override/kt25312.kt.after @@ -0,0 +1,8 @@ +interface Interface { + fun funA() +} + +expect class SClass : Interface { // there is no error highlighting about unimplemented members, see KT-25044 + override fun funA() +} +// ELEMENT_TEXT: "override fun funA() {...}" \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index 73992bc8ef9..c86f504392c 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -521,6 +521,11 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion runTest("idea/idea-completion/testData/handlers/basic/override/KeepModifiersBefore.kt"); } + @TestMetadata("kt25312.kt") + public void testKt25312() throws Exception { + runTest("idea/idea-completion/testData/handlers/basic/override/kt25312.kt"); + } + @TestMetadata("OverrideFunction.kt") public void testOverrideFunction() throws Exception { runTest("idea/idea-completion/testData/handlers/basic/override/OverrideFunction.kt");