diff --git a/platform/core-impl/src/com/intellij/util/DocumentUtil.java b/platform/core-impl/src/com/intellij/util/DocumentUtil.java index a4a83a15be9d..e2c78be69a3e 100644 --- a/platform/core-impl/src/com/intellij/util/DocumentUtil.java +++ b/platform/core-impl/src/com/intellij/util/DocumentUtil.java @@ -65,4 +65,21 @@ public final class DocumentUtil { } }); } + + public static int getFirstNonSpaceCharOffset(@NotNull Document document, int line) { + int startOffset = document.getLineStartOffset(line); + int endOffset = document.getLineEndOffset(line); + return getFirstNonSpaceCharOffset(document, startOffset, endOffset); + } + + public static int getFirstNonSpaceCharOffset(@NotNull Document document, int startOffset, int endOffset) { + CharSequence text = document.getImmutableCharSequence(); + for (int i = startOffset; i < endOffset; i++) { + char c = text.charAt(i); + if (c != ' ' && c != '\t') { + return i; + } + } + return startOffset; + } } diff --git a/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java b/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java index 34a7cdc0af36..d5cba3342906 100644 --- a/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java +++ b/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java @@ -37,6 +37,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.util.CommonProcessors; import com.intellij.util.Consumer; +import com.intellij.util.DocumentUtil; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -70,7 +71,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx throw new IndexOutOfBoundsException("lineNumber:" + lineNumber + ". Must be in [0, " + (getDocument().getLineCount() - 1) + "]"); } - int offset = getFirstNonSpaceCharOffset(getDocument(), lineNumber); + int offset = DocumentUtil.getFirstNonSpaceCharOffset(getDocument(), lineNumber); return addRangeHighlighter(offset, offset, layer, textAttributes, HighlighterTargetArea.LINES_IN_RANGE); } @@ -81,7 +82,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx return null; } - int offset = getFirstNonSpaceCharOffset(getDocument(), lineNumber); + int offset = DocumentUtil.getFirstNonSpaceCharOffset(getDocument(), lineNumber); return addRangeHighlighter(PersistentRangeHighlighterImpl.create(this, offset, layer, HighlighterTargetArea.LINES_IN_RANGE, textAttributes, false), null); } @@ -89,27 +90,6 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx return lineNumber >= getDocument().getLineCount() || lineNumber < 0; } - // The rationale why we don't bind to the line start offset here is that following: suppose particular breakpoint is hit - // during debugging. We may want to type at the active line indent and highlighted string will be moved one line - // down as well then. - // IDEA-46403 - public static int getFirstNonSpaceCharOffset(@NotNull Document document, int line) { - int startOffset = document.getLineStartOffset(line); - int endOffset = document.getLineEndOffset(line); - return getFirstNonSpaceCharOffset(document, startOffset, endOffset); - } - - public static int getFirstNonSpaceCharOffset(@NotNull Document document, int startOffset, int endOffset) { - CharSequence text = document.getImmutableCharSequence(); - for (int i = startOffset; i < endOffset; i++) { - char c = text.charAt(i); - if (c != ' ' && c != '\t') { - return i; - } - } - return startOffset; - } - // NB: Can return invalid highlighters @Override @NotNull diff --git a/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/PersistentRangeHighlighterImpl.java b/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/PersistentRangeHighlighterImpl.java index 50affc1c6d27..77dd53e653f4 100644 --- a/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/PersistentRangeHighlighterImpl.java +++ b/platform/editor-ui-ex/src/com/intellij/openapi/editor/impl/PersistentRangeHighlighterImpl.java @@ -22,6 +22,7 @@ import com.intellij.openapi.editor.impl.event.DocumentEventImpl; import com.intellij.openapi.editor.markup.HighlighterTargetArea; import com.intellij.openapi.editor.markup.MarkupModel; import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.util.DocumentUtil; import com.intellij.util.diff.FilesTooBigForDiffException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -73,7 +74,7 @@ class PersistentRangeHighlighterImpl extends RangeHighlighterImpl implements Ran } } if (isValid() && getTargetArea() == HighlighterTargetArea.LINES_IN_RANGE) { - setIntervalStart(MarkupModelImpl.getFirstNonSpaceCharOffset(getDocument(), getLine())); + setIntervalStart(DocumentUtil.getFirstNonSpaceCharOffset(getDocument(), getLine())); setIntervalEnd(getDocument().getLineEndOffset(getLine())); } } diff --git a/python/src/com/jetbrains/python/editor/PyEmacsHandler.java b/python/src/com/jetbrains/python/editor/PyEmacsHandler.java index 3bdf925d7ac9..7ac39f60f5b0 100644 --- a/python/src/com/jetbrains/python/editor/PyEmacsHandler.java +++ b/python/src/com/jetbrains/python/editor/PyEmacsHandler.java @@ -28,6 +28,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.tree.TokenSet; +import com.intellij.util.DocumentUtil; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyTokenTypes; import org.jetbrains.annotations.NotNull; @@ -212,7 +213,7 @@ public class PyEmacsHandler implements EmacsProcessingHandler { int caretOffset = context.editor.getCaretModel().getOffset(); String newIndentString = new IndentInfo(0, newIndent, 0).generateNewWhiteSpace(context.getIndentOptions()); int start = context.document.getLineStartOffset(context.targetLine); - int end = getFirstNonWsSymbolOffset(context.document, context.targetLine); + int end = DocumentUtil.getFirstNonSpaceCharOffset(context.document, context.targetLine); context.editor.getDocument().replaceString(start, end, newIndentString); if (caretOffset > start && caretOffset < end) { context.editor.getCaretModel().moveToOffset(start + newIndentString.length()); @@ -308,19 +309,6 @@ public class PyEmacsHandler implements EmacsProcessingHandler { return result; } - private static int getFirstNonWsSymbolOffset(@NotNull Document document, int line) { - int start = document.getLineStartOffset(line); - int end = document.getLineEndOffset(line); - CharSequence text = document.getCharsSequence(); - for (int i = start; i < end; i++) { - char c = text.charAt(i); - if (c != ' ' && c != '\t') { - return i; - } - } - return end; - } - private static class LineInfo { public final int line;