Merge pull request #702 from coursier/topic/fix-version-parsing-divergence

Fix divergence when parsing versions
This commit is contained in:
Alexandre Archambault 2017-11-30 14:05:20 +01:00 committed by GitHub
commit 217940d0ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 6 deletions

View File

@ -110,7 +110,7 @@ object Version {
def apply(s: String): (Item, Stream[(Separator, Item)]) = { def apply(s: String): (Item, Stream[(Separator, Item)]) = {
def parseItem(s: Stream[Char]): (Item, Stream[Char]) = { def parseItem(s: Stream[Char]): (Item, Stream[Char]) = {
if (s.isEmpty || !s.head.letterOrDigit) (empty, s) if (s.isEmpty) (empty, s)
else if (s.head.isDigit) { else if (s.head.isDigit) {
def digits(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) = def digits(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) =
if (s.isEmpty || !s.head.isDigit) (b.result(), s) if (s.isEmpty || !s.head.isDigit) (b.result(), s)
@ -122,18 +122,32 @@ object Version {
else Number(digits0.toInt) else Number(digits0.toInt)
(item, rem) (item, rem)
} else { } else if (s.head.letter) {
assert(s.head.letter)
def letters(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) = def letters(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) =
if (s.isEmpty || !s.head.letter) (b.result().toLowerCase, s) if (s.isEmpty || !s.head.letter)
else letters(b + s.head, s.tail) (b.result().toLowerCase, s) // not specifying a Locale (error with scala js)
else
letters(b + s.head, s.tail)
val (letters0, rem) = letters(new StringBuilder, s) val (letters0, rem) = letters(new StringBuilder, s)
val item = val item =
qualifiersMap.getOrElse(letters0, Literal(letters0)) qualifiersMap.getOrElse(letters0, Literal(letters0))
(item, rem) (item, rem)
} else {
val (sep, _) = parseSeparator(s)
if (sep == None) {
def other(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) =
if (s.isEmpty || s.head.isLetterOrDigit || parseSeparator(s)._1 != None)
(b.result().toLowerCase, s) // not specifying a Locale (error with scala js)
else
other(b + s.head, s.tail)
val (item, rem0) = other(new StringBuilder, s)
(Literal(item), rem0)
} else
(empty, s)
} }
} }

View File

@ -362,6 +362,12 @@ object VersionTests extends TestSuite {
// finally Locale.setDefault( orig ) // finally Locale.setDefault( orig )
// } // }
'specialStartChar - {
val items = Version("[1.2.0]").items
val expectedItems = Seq(Version.Literal("["), Version.Number(1), Version.Number(2), Version.Literal("]"))
assert(items == expectedItems)
}
} }
} }