diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index dd2f186c546..79bf6fe288a 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -321,6 +321,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinStringLiteralSelectioner.kt b/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinStringLiteralSelectioner.kt new file mode 100644 index 00000000000..7e5bbc7c71c --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinStringLiteralSelectioner.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.editor.wordSelection + +import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase +import com.intellij.psi.PsiElement +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.util.TextRange +import org.jetbrains.jet.lang.psi.JetStringTemplateExpression + +public class KotlinStringLiteralSelectioner : ExtendWordSelectionHandlerBase() { + override fun canSelect(e: PsiElement) = e is JetStringTemplateExpression + + override fun select(e: PsiElement, editorText: CharSequence, cursorOffset: Int, editor: Editor): List? { + val entries = (e as JetStringTemplateExpression).getEntries() + if (entries.isEmpty()) return null + val start = entries.first().getTextRange().getStartOffset() + val end = entries.last().getTextRange().getEndOffset() + return listOf(TextRange(start, end)) + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinWordSelectionFilter.kt b/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinWordSelectionFilter.kt index b391967350c..db2badb6540 100644 --- a/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinWordSelectionFilter.kt +++ b/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/KotlinWordSelectionFilter.kt @@ -18,10 +18,23 @@ package org.jetbrains.jet.plugin.editor.wordSelection import com.intellij.openapi.util.Condition import com.intellij.psi.PsiElement -import org.jetbrains.jet.lang.psi.JetBlockExpression +import org.jetbrains.jet.JetNodeTypes.* import org.jetbrains.jet.lang.psi.JetContainerNode +import org.jetbrains.jet.lang.psi.JetElement public class KotlinWordSelectionFilter : Condition{ - override fun value(e: PsiElement) - = !KotlinListSelectioner.canSelect(e) && e !is JetBlockExpression && e !is JetContainerNode + override fun value(e: PsiElement): Boolean { + + if (KotlinListSelectioner.canSelect(e)) return false + if (e is JetContainerNode) return false + + val parent = e.getParent() + if (parent !is JetElement) return true + if (parent.getFirstChild().getNextSibling() == null) return false // skip nodes with the same range as their parent + + return when (e.getNode().getElementType()) { + BLOCK, LITERAL_STRING_TEMPLATE_ENTRY -> false + else -> true + } + } } \ No newline at end of file diff --git a/idea/testData/wordSelection/SimpleStringLiteral/0.kt b/idea/testData/wordSelection/SimpleStringLiteral/0.kt new file mode 100644 index 00000000000..afc35c4242d --- /dev/null +++ b/idea/testData/wordSelection/SimpleStringLiteral/0.kt @@ -0,0 +1 @@ +val v = "aaa bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/SimpleStringLiteral/1.kt b/idea/testData/wordSelection/SimpleStringLiteral/1.kt new file mode 100644 index 00000000000..471f8e4c5fc --- /dev/null +++ b/idea/testData/wordSelection/SimpleStringLiteral/1.kt @@ -0,0 +1 @@ +val v = "aaa bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/SimpleStringLiteral/2.kt b/idea/testData/wordSelection/SimpleStringLiteral/2.kt new file mode 100644 index 00000000000..72a0b426c0d --- /dev/null +++ b/idea/testData/wordSelection/SimpleStringLiteral/2.kt @@ -0,0 +1 @@ +val v = "aaa bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/SimpleStringLiteral/3.kt b/idea/testData/wordSelection/SimpleStringLiteral/3.kt new file mode 100644 index 00000000000..42c7ff84f27 --- /dev/null +++ b/idea/testData/wordSelection/SimpleStringLiteral/3.kt @@ -0,0 +1 @@ +val v = "aaa bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral1/0.kt b/idea/testData/wordSelection/TemplateStringLiteral1/0.kt new file mode 100644 index 00000000000..84cb890ec50 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral1/0.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral1/1.kt b/idea/testData/wordSelection/TemplateStringLiteral1/1.kt new file mode 100644 index 00000000000..c04a20a7b35 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral1/1.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral1/2.kt b/idea/testData/wordSelection/TemplateStringLiteral1/2.kt new file mode 100644 index 00000000000..604b04f1c50 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral1/2.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral1/3.kt b/idea/testData/wordSelection/TemplateStringLiteral1/3.kt new file mode 100644 index 00000000000..1c349f7fcc9 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral1/3.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral2/0.kt b/idea/testData/wordSelection/TemplateStringLiteral2/0.kt new file mode 100644 index 00000000000..a48dfb8ff62 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral2/0.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral2/1.kt b/idea/testData/wordSelection/TemplateStringLiteral2/1.kt new file mode 100644 index 00000000000..02947630903 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral2/1.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral2/2.kt b/idea/testData/wordSelection/TemplateStringLiteral2/2.kt new file mode 100644 index 00000000000..b8584a80381 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral2/2.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral2/3.kt b/idea/testData/wordSelection/TemplateStringLiteral2/3.kt new file mode 100644 index 00000000000..b7e751a5af1 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral2/3.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral2/4.kt b/idea/testData/wordSelection/TemplateStringLiteral2/4.kt new file mode 100644 index 00000000000..ab9548b8629 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral2/4.kt @@ -0,0 +1 @@ +val v = "aaa $x bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral3/0.kt b/idea/testData/wordSelection/TemplateStringLiteral3/0.kt new file mode 100644 index 00000000000..cadc2d6c215 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral3/0.kt @@ -0,0 +1 @@ +val v = "aaa ${x + y} bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral3/1.kt b/idea/testData/wordSelection/TemplateStringLiteral3/1.kt new file mode 100644 index 00000000000..8bc2bf26151 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral3/1.kt @@ -0,0 +1 @@ +val v = "aaa ${x + y} bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral3/2.kt b/idea/testData/wordSelection/TemplateStringLiteral3/2.kt new file mode 100644 index 00000000000..0df9e64d4d1 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral3/2.kt @@ -0,0 +1 @@ +val v = "aaa ${x + y} bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral3/3.kt b/idea/testData/wordSelection/TemplateStringLiteral3/3.kt new file mode 100644 index 00000000000..f8db14cc5d4 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral3/3.kt @@ -0,0 +1 @@ +val v = "aaa ${x + y} bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral3/4.kt b/idea/testData/wordSelection/TemplateStringLiteral3/4.kt new file mode 100644 index 00000000000..e50777ed879 --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral3/4.kt @@ -0,0 +1 @@ +val v = "aaa ${x + y} bbb" \ No newline at end of file diff --git a/idea/testData/wordSelection/TemplateStringLiteral3/5.kt b/idea/testData/wordSelection/TemplateStringLiteral3/5.kt new file mode 100644 index 00000000000..e8d0ff8941c --- /dev/null +++ b/idea/testData/wordSelection/TemplateStringLiteral3/5.kt @@ -0,0 +1 @@ +val v = "aaa ${x + y} bbb" \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java b/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java index 2e6dbec7760..994cdf4e2e4 100644 --- a/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java @@ -49,6 +49,12 @@ public class WordSelectionTest extends JetLightCodeInsightFixtureTestCase { public void testCommentForStatements() { doTest(); } + public void testSimpleStringLiteral() { doTest(); } + + public void testTemplateStringLiteral1() { doTest(); } + public void testTemplateStringLiteral2() { doTest(); } + public void testTemplateStringLiteral3() { doTest(); } + private void doTest() { String dirName = getTestName(false);