mirror of https://github.com/sbt/sbt.git
Merge pull request #702 from coursier/topic/fix-version-parsing-divergence
Fix divergence when parsing versions
This commit is contained in:
commit
217940d0ef
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue