invalid psi range diagnostics (EA-49842 - assert: ExtendWordSelectionHandlerBase.select)

This commit is contained in:
peter
2014-05-13 12:43:12 +02:00
parent dd4697d174
commit 1edc667345
3 changed files with 17 additions and 1 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.CharArrayUtil;
@@ -40,7 +41,14 @@ public abstract class ExtendWordSelectionHandlerBase implements ExtendWordSelect
@Override
public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
final TextRange originalRange = e.getTextRange();
LOG.assertTrue(originalRange.getEndOffset() <= editorText.length(), getClass() + "; " + e);
if (originalRange.getEndOffset() > editorText.length()) {
throw new AssertionError("Invalid element range in " + getClass() +
"; element=" + e +
"; range=" + originalRange +
"; length=" + editorText +
"; editor=" + editor +
"; committed=" + PsiDocumentManager.getInstance(e.getProject()).isCommitted(editor.getDocument()));
}
List<TextRange> ranges = expandToWholeLine(editorText, originalRange, true);
@@ -149,6 +149,10 @@ public class SelectWordHandler extends EditorActionHandler {
}
}
if (element != null && element.getTextRange().getEndOffset() > editor.getDocument().getTextLength()) {
throw new AssertionError("Wrong element range " + element + "; committed=" + PsiDocumentManager.getInstance(project).isCommitted(document));
}
final TextRange selectionRange = new TextRange(editor.getSelectionModel().getSelectionStart(), editor.getSelectionModel().getSelectionEnd());
final Ref<TextRange> minimumRange = new Ref<TextRange>(new TextRange(0, editor.getDocument().getTextLength()));
@@ -218,8 +218,12 @@ public class SelectWordUtil {
availableSelectioners.add(selectioner);
}
}
long stamp = editor.getDocument().getModificationStamp();
for (ExtendWordSelectionHandler selectioner : availableSelectioners) {
List<TextRange> ranges = selectioner.select(element, text, cursorOffset, editor);
if (stamp != editor.getDocument().getModificationStamp()) {
throw new AssertionError("Selectioner " + selectioner + " has changed the document");
}
if (ranges == null) continue;
for (TextRange range : ranges) {