convenience method Segment.contains

GitOrigin-RevId: e2ded31d577c1aaa627482dcef557bce2fcaaefc
This commit is contained in:
Alexey Kudravtsev
2025-05-26 19:22:34 +00:00
committed by intellij-monorepo-bot
parent 3fa289a400
commit 71082f6f3c
21 changed files with 40 additions and 36 deletions
@@ -93,7 +93,7 @@ final class JavaDeclarationMover extends LineMover {
}
private static boolean contains(RangeMarker rangeMarker, int index) {
return rangeMarker.getStartOffset() <= index && rangeMarker.getEndOffset() >= index;
return rangeMarker.getTextRange().containsInclusive(index);
}
@Override
@@ -35,7 +35,7 @@ public final class FieldFromParameterUtils {
PsiParameter[] parameters = parameterList.getParameters();
for (PsiParameter parameter : parameters) {
TextRange range = parameter.getTextRange();
if (range.getStartOffset() <= offset && offset <= range.getEndOffset()) return parameter;
if (range.containsInclusive(offset)) return parameter;
}
return null;
}
@@ -234,7 +234,7 @@ public class IndexPatternSearcher extends QueryExecutorBase<IndexPatternOccurren
int start = fitToRange(matcher.start(), commentPrefixLength, suffixStartOffset) + commentStart - commentPrefixLength;
int end = fitToRange(matcher.end(), commentPrefixLength, suffixStartOffset) + commentStart - commentPrefixLength;
if (start != end) {
if ((range == null || range.getStartOffset() <= start && end <= range.getEndOffset()) && !matches.contains(start)) {
if ((range == null || range.containsRange(start, end)) && !matches.contains(start)) {
List<TextRange> additionalRanges = multiLine ? findContinuation(start, chars, allIndexPatterns, commentRanges, commentNum)
: Collections.emptyList();
if (range != null && !additionalRanges.isEmpty() &&
@@ -171,7 +171,7 @@ class IdentifierHighlightingManagerImpl(private val myProject: Project) : Identi
// true if this Result is valid when the caret is at offset
private fun containsTargetOffset(result: IdentifierHighlightingResult, offset: Int): Boolean {
return result.targets.any { t -> t.getStartOffset() <= offset && offset <= t.getEndOffset() }
return result.targets.any { t -> t.containsInclusive(offset) }
}
companion object {
@@ -185,7 +185,7 @@ final class MoverWrapper {
private static FoldRegion findTopLevelRegionInRange(Editor editor, RangeMarker range) {
FoldRegion result = null;
for (FoldRegion foldRegion : editor.getFoldingModel().getAllFoldRegions()) {
if (foldRegion.isValid() && contains(range, foldRegion) && !contains(result, foldRegion)) {
if (foldRegion.isValid() && contains(range, foldRegion) && (result==null||!contains(result, foldRegion))) {
result = foldRegion;
}
}
@@ -201,21 +201,7 @@ final class MoverWrapper {
* of the given fold region; {@code false} otherwise
*/
private static boolean contains(@NotNull RangeMarker rangeMarker, @NotNull FoldRegion foldRegion) {
return rangeMarker.getStartOffset() <= foldRegion.getStartOffset() && rangeMarker.getEndOffset() >= foldRegion.getEndOffset();
}
/**
* Allows to check if given {@code 'region2'} is nested to {@code 'region1'}
*
* @param region1 'outer' region candidate
* @param region2 'inner' region candidate
* @return {@code true} if 'region2' is nested to 'region1'; {@code false} otherwise
*/
private static boolean contains(@Nullable FoldRegion region1, @NotNull FoldRegion region2) {
if (region1 == null) {
return false;
}
return region1.getStartOffset() <= region2.getStartOffset() && region1.getEndOffset() >= region2.getEndOffset();
return rangeMarker.getTextRange().contains(foldRegion.getTextRange());
}
private static void indentLinesIn(final Editor editor, final PsiFile file, final Document document, final Project project, RangeMarker range) {
@@ -83,7 +83,7 @@ public final class SaveAsTemplateAction extends AnAction {
for (RangeMarker m1 : rangeToText.keySet()) {
boolean nested = false;
for (RangeMarker m2 : rangeToText.keySet()) {
if (m1 != m2 && m2.getStartOffset() <= m1.getStartOffset() && m1.getEndOffset() <= m2.getEndOffset()) {
if (m1 != m2 && m2.getTextRange().contains(m1.getTextRange())) {
nested = true;
break;
}
@@ -41,7 +41,7 @@ public class SelectAllHandler extends EditorActionHandler {
if (templateState != null && !templateState.isFinished()) {
final TextRange range = templateState.getCurrentVariableRange();
final int caretOffset = editor.getCaretModel().getOffset();
if (range != null && range.getStartOffset() <= caretOffset && caretOffset <= range.getEndOffset()) {
if (range != null && range.containsInclusive(caretOffset)) {
editor.getSelectionModel().setSelection(range.getStartOffset(), range.getEndOffset());
return;
}
@@ -116,7 +116,9 @@ public final class ConsoleTokenUtil {
RangeMarker[] marker = new RangeMarker[1];
MarkupModelEx model = (MarkupModelEx)DocumentMarkupModel.forDocument(editor.getDocument(), project, true);
model.processRangeHighlightersOverlappingWith(offset, offset, m->{
if (getTokenType(m) == null || m.getStartOffset() > offset || offset + 1 > m.getEndOffset()) return true;
if (getTokenType(m) == null || !m.getTextRange().contains(offset)) {
return true;
}
marker[0] = m;
return false;
});
@@ -852,7 +852,7 @@ public final class ShowUsagesAction extends AnAction implements PopupAction, Hin
for (UsageInfo info : adapter.getMergedInfos()) {
Segment range = doIfNotNull(info.getPsiFileRange(), it -> ReadAction.compute(it::getRange));
if (range != null && range.getStartOffset() <= offset && offset <= range.getEndOffset()) {
if (range != null && range.containsInclusive(offset)) {
return true;
}
}
@@ -978,7 +978,7 @@ public abstract class InplaceRefactoring {
range = myRenameOffset.getTextRange();
}
myBeforeRevert =
range != null && range.getEndOffset() >= currentOffset && range.getStartOffset() <= currentOffset
range != null && range.containsInclusive(currentOffset)
? myEditor.getDocument().createRangeMarker(range.getStartOffset(), currentOffset)
: null;
if (myBeforeRevert != null) {
@@ -262,7 +262,7 @@ public class VariableInplaceRenamer extends InplaceRefactoring {
static int restoreCaretOffset(@NotNull RangeMarker caretRangeMarker, int offset) {
if (caretRangeMarker.isValid()) {
if (caretRangeMarker.getStartOffset() <= offset && caretRangeMarker.getEndOffset() >= offset) {
if (caretRangeMarker.getTextRange().containsInclusive(offset)) {
return offset;
}
return caretRangeMarker.getEndOffset();
@@ -43,7 +43,7 @@ public final class FoldingUtil {
List<FoldRegion> list = new ArrayList<>();
FoldRegion[] allRegions = editor.getFoldingModel().getAllFoldRegions();
for (FoldRegion region : allRegions) {
if (region.getStartOffset() <= offset && offset <= region.getEndOffset()) {
if (region.getTextRange().containsInclusive(offset)) {
list.add(region);
}
}
@@ -4094,7 +4094,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
p.x = x - p.x;
p.y = y - p.y;
int pos = logicalPositionToOffset(xyToLogicalPosition(p));
if (composedRangeMarker.getStartOffset() <= pos && pos <= composedRangeMarker.getEndOffset()) {
if (composedRangeMarker.getTextRange().containsInclusive(pos)) {
return TextHitInfo.leading(pos - composedRangeMarker.getStartOffset());
}
}
@@ -5386,7 +5386,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
int caretOffset = editor.getCaretModel().getOffset();
if (editor.myDraggedRange != null
&& editor.myDraggedRange.getStartOffset() <= caretOffset && caretOffset < editor.myDraggedRange.getEndOffset()) {
&& editor.myDraggedRange.getTextRange().contains(caretOffset)) {
return false;
}
@@ -170,7 +170,7 @@ public class InvokeCompletion extends ActionOnFile {
Editor hostEditor = InjectedLanguageEditorUtil.getTopLevelEditor(editor);
List<HighlightInfo> infos = InvokeIntention.highlightErrors(getProject(), hostEditor);
int caretOffset = hostEditor.getCaretModel().getOffset();
boolean hasErrors = ContainerUtil.exists(infos, i -> i.getStartOffset() <= caretOffset && caretOffset <= i.getEndOffset());
boolean hasErrors = ContainerUtil.exists(infos, i -> i.containsInclusive(caretOffset));
if (hasErrors) {
env.logMessage("Found syntax errors at the completion point, skipping expected completion check for '" + expectedVariant + "'");
return false;
+2
View File
@@ -20,6 +20,8 @@ c:com.intellij.openapi.progress.ProcessCanceledException
com.intellij.openapi.util.Segment
- sf:BY_START_OFFSET_THEN_END_OFFSET:java.util.Comparator
- sf:EMPTY_ARRAY:com.intellij.openapi.util.Segment[]
- contains(I):Z
- containsInclusive(I):Z
- a:getEndOffset():I
- a:getStartOffset():I
c:com.intellij.openapi.util.TextRange
@@ -20,4 +20,19 @@ public interface Segment {
if (result == 0) result = r1.getEndOffset() - r2.getEndOffset();
return result;
};
/**
* @return true if {@link #getStartOffset()} {@code <= offset && offset < } {@link #getEndOffset()}
*/
@Contract(pure = true)
default boolean contains(int offset) {
return getStartOffset() <= offset && offset < getEndOffset();
}
/**
* @return true if {@link #getStartOffset()} {@code <= offset && offset <= } {@link #getEndOffset()}
*/
@Contract(pure = true)
default boolean containsInclusive(int offset) {
return getStartOffset() <= offset && offset <= getEndOffset();
}
}
@@ -67,7 +67,7 @@ class RestoreCaret<T : PsiElement>(beforeElement: T, val editor: Editor?) {
if (singleCaret != null) {
val caretOffset = singleCaret.offset
val textRange = element.textRange
if (textRange.startOffset <= caretOffset && caretOffset <= textRange.endOffset) {
if (textRange.containsInclusive(caretOffset)) {
val relative = caretOffset - element.startOffset
if (relative >= 0) {
return relative
@@ -419,7 +419,7 @@ abstract class AbstractQuickFixTest : KotlinLightCodeInsightFixtureTestCase(), Q
val editor = myFixture.editor
//DaemonCodeAnalyzerImpl.waitForUnresolvedReferencesQuickFixesUnderCaret(file, editor)
for (highlight in highlightInfos) {
if (highlight.startOffset <= caretOffset && caretOffset <= highlight.endOffset) {
if (highlight.containsInclusive(caretOffset)) {
val group = highlight.problemGroup
if (group is SuppressableProblemGroup) {
val at = file.findElementAt(highlight.actualStartOffset) ?: continue
@@ -41,7 +41,7 @@ internal class TerminalTextHighlighterTest {
for (documentOffset in 0 until outputManager.document.textLength) {
val iterator = outputManager.terminalOutputHighlighter.createIterator(documentOffset)
Assert.assertTrue(!iterator.atEnd())
val expectedTextRange = ranges.find { it.startOffset <= documentOffset && documentOffset < it.endOffset }
val expectedTextRange = ranges.find { it.contains(documentOffset) }
Assert.assertNotNull(expectedTextRange)
Assert.assertEquals(expectedTextRange, TextRange(iterator.start, iterator.end))
}
@@ -86,7 +86,7 @@ public class XmlParameterInfoHandler implements ParameterInfoHandler<XmlTag,XmlE
for (PsiElement child : children) {
final TextRange range = child.getTextRange();
if (range.getStartOffset() <= offset && range.getEndOffset() > offset) return tag;
if (range.contains(offset)) return tag;
if (child instanceof XmlToken token) {
if (token.getTokenType() == XmlTokenType.XML_TAG_END) return null;
@@ -247,8 +247,7 @@ public class XmlTagBlock extends AbstractXmlBlock {
result.add(reg);
i++;
}
else if (injRange.getStartOffset() <= regRange.getStartOffset()
&& regRange.getEndOffset() <= injRange.getEndOffset()) {
else if (injRange.contains(regRange)) {
// Regular block completely within injected - skip
i++;
}