From 389375da5dd3ed2644121df91afbe1139beef268 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 29 Nov 2017 14:27:27 +0100 Subject: [PATCH] Fix divergence when parsing versions Those starting with neither a letter, nor a digit, nor a known separator --- .../main/scala/coursier/core/Version.scala | 26 ++++++++++++++----- .../scala/coursier/test/VersionTests.scala | 6 +++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/shared/src/main/scala/coursier/core/Version.scala b/core/shared/src/main/scala/coursier/core/Version.scala index de1df7198..c03859d0f 100644 --- a/core/shared/src/main/scala/coursier/core/Version.scala +++ b/core/shared/src/main/scala/coursier/core/Version.scala @@ -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) } } diff --git a/tests/shared/src/test/scala/coursier/test/VersionTests.scala b/tests/shared/src/test/scala/coursier/test/VersionTests.scala index c94225959..74c486f83 100644 --- a/tests/shared/src/test/scala/coursier/test/VersionTests.scala +++ b/tests/shared/src/test/scala/coursier/test/VersionTests.scala @@ -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) + } + } }