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);