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 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) {
def digits(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) =
if (s.isEmpty || !s.head.isDigit) (b.result(), s)
@ -122,18 +122,32 @@ object Version {
else Number(digits0.toInt)
(item, rem)
} else {
assert(s.head.letter)
} else if (s.head.letter) {
def letters(b: StringBuilder, s: Stream[Char]): (String, Stream[Char]) =
if (s.isEmpty || !s.head.letter) (b.result().toLowerCase, s)
else letters(b + s.head, s.tail)
if (s.isEmpty || !s.head.letter)
(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 item =
qualifiersMap.getOrElse(letters0, Literal(letters0))
(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 )
// }
'specialStartChar - {
val items = Version("[1.2.0]").items
val expectedItems = Seq(Version.Literal("["), Version.Number(1), Version.Number(2), Version.Literal("]"))
assert(items == expectedItems)
}
}
}