From ee42da48e17481738ad99c5c8e12ffe922632ef1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 29 Jul 2015 20:32:55 +0200 Subject: [PATCH] support multideclarations in Select Word #KT-6833 Fixed --- .../KotlinDeclarationSelectioner.kt | 27 +++++++++++++++---- .../wordSelection/MultiDeclaration/0.kt | 3 +++ .../wordSelection/MultiDeclaration/1.kt | 3 +++ .../wordSelection/MultiDeclaration/2.kt | 3 +++ .../wordSelection/MultiDeclaration/3.kt | 3 +++ .../wordSelection/MultiDeclaration/4.kt | 3 +++ .../kotlin/idea/WordSelectionTest.java | 2 ++ 7 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 idea/testData/wordSelection/MultiDeclaration/0.kt create mode 100644 idea/testData/wordSelection/MultiDeclaration/1.kt create mode 100644 idea/testData/wordSelection/MultiDeclaration/2.kt create mode 100644 idea/testData/wordSelection/MultiDeclaration/3.kt create mode 100644 idea/testData/wordSelection/MultiDeclaration/4.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/wordSelection/KotlinDeclarationSelectioner.kt b/idea/src/org/jetbrains/kotlin/idea/editor/wordSelection/KotlinDeclarationSelectioner.kt index 8f29e298216..c846593d211 100644 --- a/idea/src/org/jetbrains/kotlin/idea/editor/wordSelection/KotlinDeclarationSelectioner.kt +++ b/idea/src/org/jetbrains/kotlin/idea/editor/wordSelection/KotlinDeclarationSelectioner.kt @@ -25,6 +25,7 @@ import java.util.ArrayList import org.jetbrains.kotlin.psi.psiUtil.siblings import com.intellij.psi.PsiComment import com.intellij.psi.PsiWhiteSpace +import org.jetbrains.kotlin.psi.JetMultiDeclaration import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset @@ -33,8 +34,11 @@ public class KotlinDeclarationSelectioner : ExtendWordSelectionHandlerBase() { = e is JetDeclaration override fun select(e: PsiElement, editorText: CharSequence, cursorOffset: Int, editor: Editor): List? { - val result = ArrayList() + if (e is JetMultiDeclaration) { + return selectMultiDeclaration(editorText, e) + } + val result = ArrayList() val firstChild = e.getFirstChild() val firstNonComment = firstChild .siblings(forward = true, withItself = true) @@ -46,13 +50,26 @@ public class KotlinDeclarationSelectioner : ExtendWordSelectionHandlerBase() { .first { it !is PsiComment && it !is PsiWhiteSpace } if (firstNonComment != firstChild || lastNonComment != lastChild) { - val start = firstNonComment.startOffset - val end = lastNonComment.endOffset - result.addAll(ExtendWordSelectionHandlerBase.expandToWholeLine(editorText, TextRange(start, end))) + result.addRange(editorText, TextRange(firstNonComment.startOffset, lastNonComment.endOffset)) } - result.addAll(ExtendWordSelectionHandlerBase.expandToWholeLine(editorText, e.getTextRange())) + result.addRange(editorText, e.getTextRange()) return result } + + private fun selectMultiDeclaration(editorText: CharSequence, e: JetMultiDeclaration): ArrayList { + val result = ArrayList() + val lpar = e.lPar + val rpar = e.rPar + if (lpar != null && rpar != null) { + result.addRange(editorText, TextRange(lpar.textRange.endOffset, rpar.textRange.startOffset)) + result.addRange(editorText, TextRange(lpar.textRange.startOffset, rpar.textRange.endOffset)) + } + return result + } +} + +fun MutableList.addRange(editorText: CharSequence, range: TextRange) { + addAll(ExtendWordSelectionHandlerBase.expandToWholeLine(editorText, range)) } diff --git a/idea/testData/wordSelection/MultiDeclaration/0.kt b/idea/testData/wordSelection/MultiDeclaration/0.kt new file mode 100644 index 00000000000..f5687d44dfe --- /dev/null +++ b/idea/testData/wordSelection/MultiDeclaration/0.kt @@ -0,0 +1,3 @@ +fun f() { + val (a, b) = 1 to 2 +} \ No newline at end of file diff --git a/idea/testData/wordSelection/MultiDeclaration/1.kt b/idea/testData/wordSelection/MultiDeclaration/1.kt new file mode 100644 index 00000000000..b7d69aaecd0 --- /dev/null +++ b/idea/testData/wordSelection/MultiDeclaration/1.kt @@ -0,0 +1,3 @@ +fun f() { + val (a, b) = 1 to 2 +} \ No newline at end of file diff --git a/idea/testData/wordSelection/MultiDeclaration/2.kt b/idea/testData/wordSelection/MultiDeclaration/2.kt new file mode 100644 index 00000000000..ba8acda21cd --- /dev/null +++ b/idea/testData/wordSelection/MultiDeclaration/2.kt @@ -0,0 +1,3 @@ +fun f() { + val (a, b) = 1 to 2 +} \ No newline at end of file diff --git a/idea/testData/wordSelection/MultiDeclaration/3.kt b/idea/testData/wordSelection/MultiDeclaration/3.kt new file mode 100644 index 00000000000..78587972a26 --- /dev/null +++ b/idea/testData/wordSelection/MultiDeclaration/3.kt @@ -0,0 +1,3 @@ +fun f() { + val (a, b) = 1 to 2 +} \ No newline at end of file diff --git a/idea/testData/wordSelection/MultiDeclaration/4.kt b/idea/testData/wordSelection/MultiDeclaration/4.kt new file mode 100644 index 00000000000..f339ee84007 --- /dev/null +++ b/idea/testData/wordSelection/MultiDeclaration/4.kt @@ -0,0 +1,3 @@ +fun f() { + val (a, b) = 1 to 2 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/WordSelectionTest.java b/idea/tests/org/jetbrains/kotlin/idea/WordSelectionTest.java index dda6476f12e..26f6eaea0a0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/WordSelectionTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/WordSelectionTest.java @@ -62,6 +62,8 @@ public class WordSelectionTest extends JetLightCodeInsightFixtureTestCase { public void testIfCondition() { doTest(); } + public void testMultiDeclaration() { doTest(); } + private void doTest() { String dirName = getTestName(false);