package com.jetbrains.lang.dart.ide.editor;
import com.intellij.codeInsight.editorActions.wordSelection.AbstractWordSelectioner;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.jetbrains.lang.dart.DartLanguage;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class DartWordSelectionHandler extends AbstractWordSelectioner {
public boolean canSelect(final PsiElement e) {
return e.getLanguage() == DartLanguage.INSTANCE;
}
@Override
public List<TextRange> select(@NotNull final PsiElement psiElement,
@NotNull final CharSequence editorText,
final int cursorOffset,
@NotNull final Editor editor) {
final List<TextRange> ranges = super.select(psiElement, editorText, cursorOffset, editor);
final PsiElement semicolon = DartSelectionFilter.getSiblingSemicolonIfExpression(psiElement);
if (semicolon != null) {
includeSemicolonInRanges(ranges, psiElement.getTextRange(), semicolon.getTextRange().getEndOffset());
}
return ranges;
}
private static void includeSemicolonInRanges(@NotNull final List<TextRange> ranges,
@NotNull final TextRange elementWithoutSemicolonRange,
final int semicolonEndOffset) {
for (int i = 0; i < ranges.size(); i++) {
final TextRange range = ranges.get(i);
if (range.getStartOffset() <= elementWithoutSemicolonRange.getStartOffset() &&
range.getEndOffset() == elementWithoutSemicolonRange.getEndOffset()) {
ranges.set(i, TextRange.create(range.getStartOffset(), semicolonEndOffset));
}
}
}
}