diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java index 096cbc24970c..fc045412e9e6 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java @@ -454,4 +454,30 @@ public class InjectedLanguageUtil { }); return result.get().booleanValue(); } + + public static String getUnescapedText(PsiFile file, @Nullable final PsiElement startElement, @NotNull final PsiElement endElement) { + final InjectedLanguageManager manager = InjectedLanguageManager.getInstance(file.getProject()); + if (manager.getInjectionHost(file) == null) { + return file.getText().substring(startElement == null? 0 : startElement.getTextRange().getStartOffset(), endElement.getTextRange().getStartOffset()); + } + final StringBuilder sb = new StringBuilder(); + file.accept(new PsiRecursiveElementWalkingVisitor() { + + Boolean myState = startElement == null? Boolean.TRUE : null; + + @Override + public void visitElement(PsiElement element) { + if (element == startElement) myState = Boolean.TRUE; + if (element == endElement) myState = Boolean.FALSE; + if (Boolean.FALSE == myState) return; + if (Boolean.TRUE == myState && element.getFirstChild() == null) { + sb.append(manager.getUnescapedText(element)); + } + else { + super.visitElement(element); + } + } + }); + return sb.toString(); + } }