diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/LiteralSelectioner.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/LiteralSelectioner.java index 988f7ff4c4a8..1c51da143810 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/LiteralSelectioner.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/LiteralSelectioner.java @@ -22,7 +22,6 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.JavaTokenType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLiteralExpression; -import com.intellij.psi.StringEscapesTokenTypes; import java.util.List; @@ -44,25 +43,9 @@ public class LiteralSelectioner extends BasicSelectioner { List result = super.select(e, editorText, cursorOffset, editor); TextRange range = e.getTextRange(); - final StringLiteralLexer lexer = new StringLiteralLexer('\"', JavaTokenType.STRING_LITERAL); - lexer.start(editorText, range.getStartOffset(), range.getEndOffset()); - - while (lexer.getTokenType() != null) { - if (lexer.getTokenStart() <= cursorOffset && cursorOffset < lexer.getTokenEnd()) { - if (StringEscapesTokenTypes.STRING_LITERAL_ESCAPES.contains(lexer.getTokenType())) { - result.add(new TextRange(lexer.getTokenStart(), lexer.getTokenEnd())); - } - else { - TextRange word = SelectWordUtil.getWordSelectionRange(editorText, cursorOffset); - if (word != null) { - result.add(new TextRange(Math.max(word.getStartOffset(), lexer.getTokenStart()), - Math.min(word.getEndOffset(), lexer.getTokenEnd()))); - } - } - break; - } - lexer.advance(); - } + SelectWordUtil.addWordHonoringEscapeSequences(editorText, range, cursorOffset, + new StringLiteralLexer('\"', JavaTokenType.STRING_LITERAL), + result); result.add(new TextRange(range.getStartOffset() + 1, range.getEndOffset() - 1)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordUtil.java index 10d4fe85dc32..d727a5c5c011 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordUtil.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.editorActions; import com.intellij.lang.ASTNode; import com.intellij.lang.FileASTNode; +import com.intellij.lexer.Lexer; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actions.EditorActionUtil; import com.intellij.openapi.extensions.Extensions; @@ -25,6 +26,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.StringEscapesTokenTypes; import com.intellij.util.ArrayUtil; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; @@ -205,4 +207,28 @@ public class SelectWordUtil { return stop; } + public static void addWordHonoringEscapeSequences(CharSequence editorText, + TextRange literalTextRange, + int cursorOffset, + Lexer lexer, + List result) { + lexer.start(editorText, literalTextRange.getStartOffset(), literalTextRange.getEndOffset()); + + while (lexer.getTokenType() != null) { + if (lexer.getTokenStart() <= cursorOffset && cursorOffset < lexer.getTokenEnd()) { + if (StringEscapesTokenTypes.STRING_LITERAL_ESCAPES.contains(lexer.getTokenType())) { + result.add(new TextRange(lexer.getTokenStart(), lexer.getTokenEnd())); + } + else { + TextRange word = getWordSelectionRange(editorText, cursorOffset); + if (word != null) { + result.add(new TextRange(Math.max(word.getStartOffset(), lexer.getTokenStart()), + Math.min(word.getEndOffset(), lexer.getTokenEnd()))); + } + } + break; + } + lexer.advance(); + } + } }