semver: get rid of pattern matching
authorSergey Simonchik <sergey.simonchik@jetbrains.com>
Mon, 20 Jul 2015 11:48:16 +0000 (14:48 +0300)
committerSergey Simonchik <sergey.simonchik@jetbrains.com>
Mon, 20 Jul 2015 11:48:16 +0000 (14:48 +0300)
platform/util/src/com/intellij/util/text/SemVer.java
platform/util/testSrc/com/intellij/util/text/SemVerTest.java

index 5a37e1e8caf48ded44027dd16f11f321003bee45..86de4010dfc1da7e427aa2d4a3ffaa62ba408908 100644 (file)
  */
 package com.intellij.util.text;
 
+import com.intellij.openapi.util.text.StringUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.regex.Pattern;
-
 /**
- * See http://semver.org
+ * Holds <a href="http://semver.org">Semantic Version</a>.
  */
 public class SemVer implements Comparable<SemVer> {
+  private final String myRawVersion;
   private final int myMajor;
   private final int myMinor;
   private final int myPatch;
-  private final String myRawVersion;
 
   public SemVer(@NotNull String rawVersion, int major, int minor, int patch) {
     myRawVersion = rawVersion;
@@ -87,34 +86,31 @@ public class SemVer implements Comparable<SemVer> {
 
   @Nullable
   public static SemVer parseFromText(@NotNull String text) {
-    String[] comps = text.split(Pattern.quote("."), 3);
-    if (comps.length != 3) {
+    int majorEndInd = text.indexOf('.');
+    if (majorEndInd < 0) {
       return null;
     }
-    Integer major = toInteger(comps[0]);
-    Integer minor = toInteger(comps[1]);
-    String patchStr = comps[2];
-    int dashInd = patchStr.indexOf('-');
+    int major = StringUtil.parseInt(text.substring(0, majorEndInd), -1);
+    int minorEndInd = text.indexOf('.', majorEndInd + 1);
+    if (minorEndInd < 0) {
+      return null;
+    }
+    int minor = StringUtil.parseInt(text.substring(majorEndInd + 1, minorEndInd), -1);
+    final String patchStr;
+    int dashInd = text.indexOf('-', minorEndInd + 1);
     if (dashInd >= 0) {
-      patchStr = patchStr.substring(0, dashInd);
+      patchStr = text.substring(minorEndInd + 1, dashInd);
+    }
+    else {
+      patchStr = text.substring(minorEndInd + 1);
     }
-    Integer patch = toInteger(patchStr);
-    if (major != null && minor != null && patch != null) {
+    int patch = StringUtil.parseInt(patchStr, -1);
+    if (major >= 0 && minor >= 0 && patch >= 0) {
       return new SemVer(text, major, minor, patch);
     }
     return null;
   }
 
-  private static Integer toInteger(@NotNull String str) {
-    try {
-      return Integer.parseInt(str);
-    }
-    catch (NumberFormatException e) {
-      return null;
-    }
-  }
-
-
   @Override
   public int compareTo(SemVer other) {
     // null is not permitted
index 9d1328d9aca10f7987f903df48d0af07e8a6a050..00f39f14aa737c9569d780dc82cb168f0fd14464 100644 (file)
@@ -20,18 +20,34 @@ import org.jetbrains.annotations.NotNull;
 
 public class SemVerTest extends TestCase {
   public void testParsing() throws Exception {
-    String version = "0.9.2";
-    assertEquals(new SemVer(version, 0, 9, 2), parseNotNull(version));
+    checkParsed("0.9.2", 0, 9, 2);
   }
 
   public void testExtendedVersion() throws Exception {
-    String version = "0.9.2-dart";
-    assertEquals(new SemVer(version, 0, 9, 2), parseNotNull(version));
+    checkParsed("0.9.2-dart", 0, 9, 2);
   }
 
   public void testGulp4Alpha() throws Exception {
-    String version = "4.0.0-alpha.1";
-    assertEquals(new SemVer(version, 4, 0, 0), parseNotNull(version));
+    checkParsed("4.0.0-alpha.1", 4, 0, 0);
+  }
+
+  public void testMisc() throws Exception {
+    checkParsed("0.10.0-rc-1", 0, 10, 0);
+    checkParsed("1.0.0-rc-1", 1, 0, 0);
+    checkParsed("1.0.0-alpha", 1, 0, 0);
+    checkParsed("1.0.0-0.3.7", 1, 0, 0);
+    checkParsed("1.0.0-x.7.z.92", 1, 0, 0);
+    checkNotParsed("1.0.a");
+    checkNotParsed("1.0");
+    checkNotParsed("1..a");
+  }
+
+  private static void checkParsed(@NotNull String version, int expectedMajor, int expectedMinor, int expectedPatch) {
+    assertEquals(new SemVer(version, expectedMajor, expectedMinor, expectedPatch), parseNotNull(version));
+  }
+
+  private static void checkNotParsed(@NotNull String version) {
+    assertNull(SemVer.parseFromText(version));
   }
 
   public void testCompare() throws Exception {