package com.haskforce.psi.impl;
import com.haskforce.psi.HaskellQqblob;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.AbstractElementManipulator;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Pattern;
public class HaskellQqblobManipulator extends AbstractElementManipulator<HaskellQqblob> {
@Override
public HaskellQqblob handleContentChange(@NotNull HaskellQqblob psi, @NotNull TextRange range, String newContent) throws IncorrectOperationException {
final String oldText = psi.getText();
final String newText = oldText.substring(0, range.getStartOffset()) + newContent + oldText.substring(range.getEndOffset());
return psi.updateText(newText);
}
public static final Pattern LEADING_SLASH_ESCAPE_REGEX = Pattern.compile("\\\\\\s.*");
@NotNull
public TextRange getRangeInElement(@NotNull HaskellQqblob psi) {
return pairToTextRange(getRangeForText(psi.getText()));
}
private static Pair<Integer, Integer> getRangeForText(String text) {
final int start = LEADING_SLASH_ESCAPE_REGEX.matcher(text).matches() ? 2 : 1;
final int end = text.length() - start;
return Pair.create(start, end);
}
private static TextRange pairToTextRange(Pair<Integer, Integer> pair) {
final int start = Math.max(pair.first, 0);
final int end = Math.max(pair.second, start);
return TextRange.from(start, end);
}
}