util: extract StringUtil.findStartingLineSeparator
authorSergey Simonchik <sergey.simonchik@jetbrains.com>
Wed, 31 Aug 2016 15:04:10 +0000 (18:04 +0300)
committerSergey Simonchik <sergey.simonchik@jetbrains.com>
Wed, 31 Aug 2016 15:05:32 +0000 (18:05 +0300)
platform/util/src/com/intellij/openapi/util/text/StringUtil.java
platform/util/testSrc/com/intellij/util/text/StringUtilTest.java

index 60a758a6ae6d4590b70e0368aa8f6e5269ea4168..ba678c929ff9728ae3f45771a16b2b19e1dfafac 100644 (file)
@@ -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
index 569734335156dbc7a4703e42c39b11719f73a77b..b8791aea3bf85714155bcbd8852f5d6507162aae 100644 (file)
@@ -374,6 +374,28 @@ public class StringUtilTest {
   }
 
   @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));
     assertEquals("1B", StringUtil.formatFileSize(1));