From 96ddcdc387347c6f38e1adb6d49f57b38d097a20 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Tue, 15 Nov 2011 20:48:14 +0400 Subject: [PATCH] injection in case of string literal with slash before line feed --- .../tree/injected/StringLiteralEscaper.java | 12 ++++------ .../tree/java/PsiLiteralExpressionImpl.java | 14 +---------- .../literals/GrLiteralEscaper.java | 23 +++++++++++++++++-- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper.java index 5c5313abe9a2..cced55af1d3c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper.java @@ -15,11 +15,11 @@ */ package com.intellij.psi.impl.source.tree.injected; +import com.intellij.openapi.util.ProperTextRange; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.LiteralTextEscaper; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl; -import com.intellij.psi.LiteralTextEscaper; -import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.ProperTextRange; import org.jetbrains.annotations.NotNull; /** @@ -37,11 +37,7 @@ public class StringLiteralEscaper extends Li ProperTextRange.assertProperRange(rangeInsideHost); String subText = rangeInsideHost.substring(myHost.getText()); outSourceOffsets = new int[subText.length()+1]; - return PsiLiteralExpressionImpl.parseStringCharacters(subText, outChars, outSourceOffsets, isStrictBackSlash()); - } - - protected boolean isStrictBackSlash() { - return true; + return PsiLiteralExpressionImpl.parseStringCharacters(subText, outChars, outSourceOffsets); } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java index 85215f080f9f..297e1b97eab0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java @@ -229,16 +229,7 @@ public class PsiLiteralExpressionImpl return success ? outChars.toString() : null; } - public static boolean parseStringCharacters(@NotNull String chars, - @NotNull StringBuilder outChars, - @Nullable int[] sourceOffsets) { - return parseStringCharacters(chars, outChars, sourceOffsets, true); - } - - public static boolean parseStringCharacters(@NotNull String chars, - @NotNull StringBuilder outChars, - @Nullable int[] sourceOffsets, - final boolean strictBackSlash) { + public static boolean parseStringCharacters(@NotNull String chars, @NotNull StringBuilder outChars, @Nullable int[] sourceOffsets) { assert sourceOffsets == null || sourceOffsets.length == chars.length()+1; if (chars.indexOf('\\') < 0) { outChars.append(chars); @@ -354,9 +345,6 @@ public class PsiLiteralExpressionImpl break; default: - if (!strictBackSlash) { - break; - } return false; } if (sourceOffsets != null) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java index 18492faec0a6..fde2e7039376 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/literals/GrLiteralEscaper.java @@ -16,17 +16,36 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.literals; +import com.intellij.openapi.util.ProperTextRange; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.LiteralTextEscaper; import com.intellij.psi.PsiElement; -import com.intellij.psi.impl.source.tree.injected.StringLiteralEscaper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; +import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; -public class GrLiteralEscaper extends StringLiteralEscaper { +public class GrLiteralEscaper extends LiteralTextEscaper { + private int[] outSourceOffsets; public GrLiteralEscaper(final GrLiteralImpl literal) { super(literal); } @Override + public boolean decode(@NotNull TextRange rangeInsideHost, @NotNull StringBuilder outChars) { + ProperTextRange.assertProperRange(rangeInsideHost); + String subText = rangeInsideHost.substring(myHost.getText()); + outSourceOffsets = new int[subText.length() + 1]; + return GrStringUtil.parseStringCharacters(subText, outChars, outSourceOffsets, isStrictBackSlash()); + } + + @Override + public int getOffsetInHost(int offsetInDecoded, @NotNull final TextRange rangeInsideHost) { + int result = offsetInDecoded < outSourceOffsets.length ? outSourceOffsets[offsetInDecoded] : -1; + if (result == -1) return -1; + return (result <= rangeInsideHost.getLength() ? result : rangeInsideHost.getLength()) + rangeInsideHost.getStartOffset(); + } + protected boolean isStrictBackSlash() { PsiElement child = myHost.getFirstChild(); return child == null || child.getNode().getElementType() != GroovyTokenTypes.mREGEX_LITERAL;