package com.google.jstestdriver.idea.config;
import com.intellij.openapi.editor.DocumentFragment;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
/**
* @author Sergey Simonchik
*/
class UnquotedText {
private final PsiElement myPsiElement;
private final TextRange myUnquotedDocumentTextRange;
public UnquotedText(@NotNull PsiElement psiElement) {
myPsiElement = psiElement;
myUnquotedDocumentTextRange = calcUnquotedDocumentTextRange(psiElement);
}
@NotNull
public PsiElement getPsiElement() {
return myPsiElement;
}
@NotNull
public String getUnquotedText() {
int base = myPsiElement.getTextRange().getStartOffset();
int start = myUnquotedDocumentTextRange.getStartOffset() - base;
int end = myUnquotedDocumentTextRange.getEndOffset() - base;
String text = myPsiElement.getText();
return text.substring(start, end);
}
@NotNull
public TextRange getUnquotedDocumentTextRange() {
return myUnquotedDocumentTextRange;
}
public static DocumentFragment unquoteDocumentFragment(@NotNull DocumentFragment fragment) {
String str = fragment.getDocument().getText(fragment.getTextRange());
TextRange unquoted = calcUnquotedDocumentTextRange(str, fragment.getTextRange());
return new DocumentFragment(fragment.getDocument(), unquoted.getStartOffset(), unquoted.getEndOffset());
}
private static TextRange calcUnquotedDocumentTextRange(@NotNull PsiElement element) {
return calcUnquotedDocumentTextRange(element.getText(), element.getTextRange());
}
private static TextRange calcUnquotedDocumentTextRange(@NotNull String str, @NotNull TextRange textRange) {
String unquotedStr = StringUtil.unquoteString(str);
boolean quoted = !str.equals(unquotedStr);
int startOffset = textRange.getStartOffset();
if (quoted) {
startOffset++;
}
int endOffset = textRange.getEndOffset();
if (quoted) {
endOffset--;
}
return new TextRange(startOffset, endOffset);
}
@Override
public String toString() {
return getUnquotedText();
}
}