KT-5896 Select Word should always have step for selecting the content of string literal

#KT-5896 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-12-15 21:04:27 -07:00
parent 01b70cfe8e
commit 7893b1d83f
23 changed files with 77 additions and 3 deletions
+1
View File
@@ -321,6 +321,7 @@
<extendWordSelectionHandler implementation="org.jetbrains.jet.plugin.editor.wordSelection.KotlinDocCommentSelectioner"/>
<extendWordSelectionHandler implementation="org.jetbrains.jet.plugin.editor.wordSelection.KotlinDeclarationSelectioner"/>
<extendWordSelectionHandler implementation="org.jetbrains.jet.plugin.editor.wordSelection.KotlinListSelectioner"/>
<extendWordSelectionHandler implementation="org.jetbrains.jet.plugin.editor.wordSelection.KotlinStringLiteralSelectioner"/>
<basicWordSelectionFilter implementation="org.jetbrains.jet.plugin.editor.wordSelection.KotlinWordSelectionFilter"/>
<typedHandler implementation="org.jetbrains.jet.plugin.editor.KotlinTypedHandler"/>
@@ -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<TextRange>? {
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))
}
}
@@ -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<PsiElement>{
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
}
}
}
@@ -0,0 +1 @@
val v = "aaa <caret>bbb"
@@ -0,0 +1 @@
val v = "aaa <selection><caret>bbb</selection>"
@@ -0,0 +1 @@
val v = "<selection>aaa <caret>bbb</selection>"
@@ -0,0 +1 @@
val v = <selection>"aaa <caret>bbb"</selection>
@@ -0,0 +1 @@
val v = "aaa $x <caret>bbb"
@@ -0,0 +1 @@
val v = "aaa $x <selection><caret>bbb</selection>"
@@ -0,0 +1 @@
val v = "<selection>aaa $x <caret>bbb</selection>"
@@ -0,0 +1 @@
val v = <selection>"aaa $x <caret>bbb"</selection>
@@ -0,0 +1 @@
val v = "aaa $<caret>x bbb"
@@ -0,0 +1 @@
val v = "aaa $<selection><caret>x</selection> bbb"
@@ -0,0 +1 @@
val v = "aaa <selection>$<caret>x</selection> bbb"
@@ -0,0 +1 @@
val v = "<selection>aaa $<caret>x bbb</selection>"
@@ -0,0 +1 @@
val v = <selection>"aaa $<caret>x bbb"</selection>
@@ -0,0 +1 @@
val v = "aaa ${<caret>x + y} bbb"
@@ -0,0 +1 @@
val v = "aaa ${<selection><caret>x</selection> + y} bbb"
@@ -0,0 +1 @@
val v = "aaa ${<selection><caret>x + y</selection>} bbb"
@@ -0,0 +1 @@
val v = "aaa <selection>${<caret>x + y}</selection> bbb"
@@ -0,0 +1 @@
val v = "<selection>aaa ${<caret>x + y} bbb</selection>"
@@ -0,0 +1 @@
val v = <selection>"aaa ${<caret>x + y} bbb"</selection>
@@ -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);