From b7f5ceba06cbf783a7223440fbc009709bae7435 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Wed, 31 Aug 2016 18:04:10 +0300 Subject: [PATCH] util: extract StringUtil.findStartingLineSeparator --- .../openapi/util/text/StringUtil.java | 21 ++++++++++++++---- .../intellij/util/text/StringUtilTest.java | 22 +++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 60a758a6ae6d..ba678c929ff9 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -3147,10 +3147,23 @@ public class StringUtil extends StringUtilRt { public static LineSeparator detectSeparators(@NotNull CharSequence text) { int index = indexOfAny(text, "\n\r"); if (index == -1) return null; - if (startsWith(text, index, "\r\n")) return LineSeparator.CRLF; - if (text.charAt(index) == '\r') return LineSeparator.CR; - if (text.charAt(index) == '\n') return LineSeparator.LF; - throw new IllegalStateException(); + LineSeparator lineSeparator = findStartingLineSeparator(text, index); + if (lineSeparator == null) { + throw new AssertionError(); + } + return lineSeparator; + } + + @Nullable + public static LineSeparator findStartingLineSeparator(@NotNull CharSequence text, int startIndex) { + if (startIndex < 0 || startIndex >= text.length()) { + return null; + } + char ch = text.charAt(startIndex); + if (ch == '\r') { + return startIndex + 1 < text.length() && text.charAt(startIndex + 1) == '\n' ? LineSeparator.CRLF : LineSeparator.CR; + } + return ch == '\n' ? LineSeparator.LF : null; } @NotNull diff --git a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java index 569734335156..b8791aea3bf8 100644 --- a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java +++ b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java @@ -373,6 +373,28 @@ public class StringUtilTest { assertEquals(LineSeparator.CRLF, StringUtil.detectSeparators("asd\r\nads\n")); } + @Test + public void testFindStartingLineSeparator() { + assertEquals(null, StringUtil.findStartingLineSeparator("", -1)); + assertEquals(null, StringUtil.findStartingLineSeparator("", 0)); + assertEquals(null, StringUtil.findStartingLineSeparator("", 1)); + assertEquals(null, StringUtil.findStartingLineSeparator("\nHello", -1)); + assertEquals(null, StringUtil.findStartingLineSeparator("\nHello", 1)); + assertEquals(null, StringUtil.findStartingLineSeparator("\nH\rel\nlo", 6)); + + assertEquals(LineSeparator.LF, StringUtil.findStartingLineSeparator("\nHello", 0)); + assertEquals(LineSeparator.LF, StringUtil.findStartingLineSeparator("\nH\rel\nlo", 5)); + assertEquals(LineSeparator.LF, StringUtil.findStartingLineSeparator("Hello\n", 5)); + + assertEquals(LineSeparator.CR, StringUtil.findStartingLineSeparator("\rH\r\nello", 0)); + assertEquals(LineSeparator.CR, StringUtil.findStartingLineSeparator("Hello\r", 5)); + assertEquals(LineSeparator.CR, StringUtil.findStartingLineSeparator("Hello\b\r", 6)); + + assertEquals(LineSeparator.CRLF, StringUtil.findStartingLineSeparator("\rH\r\nello", 2)); + assertEquals(LineSeparator.CRLF, StringUtil.findStartingLineSeparator("\r\nH\r\nello", 0)); + assertEquals(LineSeparator.CRLF, StringUtil.findStartingLineSeparator("\r\nH\r\nello\r\n", 9)); + } + @Test public void testFormatFileSize() { assertEquals("0B", StringUtil.formatFileSize(0)); -- 2.23.3