diff --git a/build.sbt b/build.sbt index 0b709dbe..61cdd133 100644 --- a/build.sbt +++ b/build.sbt @@ -1,10 +1,4 @@ -import com.typesafe.tools.mima.plugin.{MimaPlugin, MimaKeys} - -scalaModuleSettings - -name := "scala-parser-combinators" - -version := "1.0.5-SNAPSHOT" +scalaVersion in ThisBuild := crossScalaVersions.value.head crossScalaVersions in ThisBuild := { val javaVersion = System.getProperty("java.version") @@ -16,16 +10,45 @@ crossScalaVersions in ThisBuild := { Seq("2.11.7", "2.12.0-M3") } -// important!! must come here (why?) -scalaModuleOsgiSettings - -OsgiKeys.exportPackage := Seq(s"scala.util.parsing.*;version=${version.value}") - -// needed to fix classloader issues (see scala-xml#20) -fork in Test := true - -libraryDependencies += "junit" % "junit" % "4.11" % "test" - -libraryDependencies += "com.novocode" % "junit-interface" % "0.10" % "test" - -mimaPreviousVersion := Some("1.0.2") +lazy val `scala-parser-combinators` = crossProject.in(file(".")). + settings(scalaModuleSettings: _*). + settings( + name := "scala-parser-combinators-root" + ). + jvmSettings( + // Mima uses the name of the jvm project in the artifactId + // when resolving previous versions (so no "-jvm" project) + name := "scala-parser-combinators" + ). + jsSettings( + name := "scala-parser-combinators-js" + ). + settings( + moduleName := "scala-parser-combinators", + version := "1.0.5-SNAPSHOT" + ). + jvmSettings( + // important!! must come here (why?) + scalaModuleOsgiSettings: _* + ). + jvmSettings( + OsgiKeys.exportPackage := Seq(s"scala.util.parsing.*;version=${version.value}"), + + // needed to fix classloader issues (see scala-xml#20) + fork in Test := true + ). + jsSettings( + // Scala.js cannot run forked tests + fork in Test := false + ). + jsConfigure(_.enablePlugins(ScalaJSJUnitPlugin)). + jvmSettings( + libraryDependencies += "junit" % "junit" % "4.11" % "test", + libraryDependencies += "com.novocode" % "junit-interface" % "0.10" % "test" + ). + jvmSettings( + mimaPreviousVersion := Some("1.0.4") + ) + +lazy val `scala-parser-combinatorsJVM` = `scala-parser-combinators`.jvm +lazy val `scala-parser-combinatorsJS` = `scala-parser-combinators`.js diff --git a/js/src/main/scala/scala/util/parsing/input/PositionCache.scala b/js/src/main/scala/scala/util/parsing/input/PositionCache.scala new file mode 100644 index 00000000..ff9f144f --- /dev/null +++ b/js/src/main/scala/scala/util/parsing/input/PositionCache.scala @@ -0,0 +1,14 @@ +package scala.util.parsing.input + +import java.lang.CharSequence +import java.util.{AbstractMap, Collections} + +private[input] trait PositionCache { + private[input] lazy val indexCache: java.util.Map[CharSequence,Array[Int]] = new AbstractMap[CharSequence, Array[Int]] { + + override def entrySet() = Collections.emptySet() + + // the /dev/null of Maps + override def put(ch: CharSequence, a: Array[Int]) = null + } +} diff --git a/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala b/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala new file mode 100644 index 00000000..84b1edfb --- /dev/null +++ b/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala @@ -0,0 +1,17 @@ +package scala.util.parsing.input + +import java.lang.{CharSequence, ThreadLocal} +import java.util.WeakHashMap + +/** + * @author Tomáš Janoušek + */ +private[input] trait PositionCache { + private lazy val indexCacheTL = + // not DynamicVariable as that would share the map from parent to child :-( + new ThreadLocal[java.util.Map[CharSequence, Array[Int]]] { + override def initialValue = new WeakHashMap[CharSequence, Array[Int]] + } + + private[input] def indexCache = indexCacheTL.get +} diff --git a/src/test/scala/scala/util/parsing/combinator/t4929.scala b/jvm/src/test/scala/scala/util/parsing/combinator/t4929.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t4929.scala rename to jvm/src/test/scala/scala/util/parsing/combinator/t4929.scala diff --git a/src/test/scala/scala/util/parsing/combinator/t9010.scala b/jvm/src/test/scala/scala/util/parsing/combinator/t9010.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t9010.scala rename to jvm/src/test/scala/scala/util/parsing/combinator/t9010.scala diff --git a/project/plugins.sbt b/project/plugins.sbt index 65dea32c..8fef081e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1,3 @@ addSbtPlugin("org.scala-lang.modules" % "scala-module-plugin" % "1.0.4") + +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.6") diff --git a/src/main/scala/scala/util/parsing/combinator/ImplicitConversions.scala b/shared/src/main/scala/scala/util/parsing/combinator/ImplicitConversions.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/ImplicitConversions.scala rename to shared/src/main/scala/scala/util/parsing/combinator/ImplicitConversions.scala diff --git a/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala similarity index 88% rename from src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala index 1e6b1624..12bb4838 100644 --- a/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala @@ -26,8 +26,12 @@ trait JavaTokenParsers extends RegexParsers { * The Java Language Spec. * Generally, this means a letter, followed by zero or more letters or numbers. */ - def ident: Parser[String] = - """\p{javaJavaIdentifierStart}\p{javaJavaIdentifierPart}*""".r + def ident: Parser[String] = ( + "" ~> // handle whitespace + rep1(acceptIf(Character.isJavaIdentifierStart)("identifier expected but `" + _ + "' found"), + elem("identifier part", Character.isJavaIdentifierPart(_: Char))) ^^ (_.mkString) + ) + /** An integer, without sign or with a negative sign. */ def wholeNumber: Parser[String] = """-?\d+""".r @@ -49,7 +53,7 @@ trait JavaTokenParsers extends RegexParsers { */ @migration("`stringLiteral` allows escaping single and double quotes, but not forward slashes any longer.", "2.10.0") def stringLiteral: Parser[String] = - ("\""+"""([^"\p{Cntrl}\\]|\\[\\'"bfnrt]|\\u[a-fA-F0-9]{4})*+"""+"\"").r + ("\""+"""([^"\x00-\x1F\x7F\\]|\\[\\'"bfnrt]|\\u[a-fA-F0-9]{4})*"""+"\"").r /** A number following the rules of `decimalNumber`, with the following * optional additions: * diff --git a/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/PackratParsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala diff --git a/src/main/scala/scala/util/parsing/combinator/Parsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/Parsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala diff --git a/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/RegexParsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala diff --git a/src/main/scala/scala/util/parsing/combinator/SubSequence.scala b/shared/src/main/scala/scala/util/parsing/combinator/SubSequence.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/SubSequence.scala rename to shared/src/main/scala/scala/util/parsing/combinator/SubSequence.scala diff --git a/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala b/shared/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala rename to shared/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala diff --git a/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala b/shared/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala rename to shared/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala diff --git a/src/main/scala/scala/util/parsing/combinator/lexical/StdLexical.scala b/shared/src/main/scala/scala/util/parsing/combinator/lexical/StdLexical.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/lexical/StdLexical.scala rename to shared/src/main/scala/scala/util/parsing/combinator/lexical/StdLexical.scala diff --git a/src/main/scala/scala/util/parsing/combinator/syntactical/StandardTokenParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/syntactical/StandardTokenParsers.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/syntactical/StandardTokenParsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/syntactical/StandardTokenParsers.scala diff --git a/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala diff --git a/src/main/scala/scala/util/parsing/combinator/syntactical/TokenParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/syntactical/TokenParsers.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/syntactical/TokenParsers.scala rename to shared/src/main/scala/scala/util/parsing/combinator/syntactical/TokenParsers.scala diff --git a/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala b/shared/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala rename to shared/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala diff --git a/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala b/shared/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala similarity index 100% rename from src/main/scala/scala/util/parsing/combinator/token/Tokens.scala rename to shared/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala diff --git a/src/main/scala/scala/util/parsing/input/CharArrayReader.scala b/shared/src/main/scala/scala/util/parsing/input/CharArrayReader.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/CharArrayReader.scala rename to shared/src/main/scala/scala/util/parsing/input/CharArrayReader.scala diff --git a/src/main/scala/scala/util/parsing/input/CharSequenceReader.scala b/shared/src/main/scala/scala/util/parsing/input/CharSequenceReader.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/CharSequenceReader.scala rename to shared/src/main/scala/scala/util/parsing/input/CharSequenceReader.scala diff --git a/src/main/scala/scala/util/parsing/input/NoPosition.scala b/shared/src/main/scala/scala/util/parsing/input/NoPosition.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/NoPosition.scala rename to shared/src/main/scala/scala/util/parsing/input/NoPosition.scala diff --git a/src/main/scala/scala/util/parsing/input/OffsetPosition.scala b/shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala similarity index 89% rename from src/main/scala/scala/util/parsing/input/OffsetPosition.scala rename to shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala index bbaa5e00..c69fc4d9 100644 --- a/src/main/scala/scala/util/parsing/input/OffsetPosition.scala +++ b/shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala @@ -91,15 +91,5 @@ case class OffsetPosition(source: CharSequence, offset: Int) extends Position { } /** An object holding the index cache. - * - * @author Tomáš Janoušek */ -object OffsetPosition extends scala.runtime.AbstractFunction2[CharSequence,Int,OffsetPosition] { - private lazy val indexCacheTL = - // not DynamicVariable as that would share the map from parent to child :-( - new ThreadLocal[java.util.Map[CharSequence, Array[Int]]] { - override def initialValue = new WeakHashMap[CharSequence, Array[Int]] - } - - private def indexCache = indexCacheTL.get -} +object OffsetPosition extends scala.runtime.AbstractFunction2[CharSequence,Int,OffsetPosition] with PositionCache diff --git a/src/main/scala/scala/util/parsing/input/PagedSeqReader.scala b/shared/src/main/scala/scala/util/parsing/input/PagedSeqReader.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/PagedSeqReader.scala rename to shared/src/main/scala/scala/util/parsing/input/PagedSeqReader.scala diff --git a/src/main/scala/scala/util/parsing/input/Position.scala b/shared/src/main/scala/scala/util/parsing/input/Position.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/Position.scala rename to shared/src/main/scala/scala/util/parsing/input/Position.scala diff --git a/src/main/scala/scala/util/parsing/input/Positional.scala b/shared/src/main/scala/scala/util/parsing/input/Positional.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/Positional.scala rename to shared/src/main/scala/scala/util/parsing/input/Positional.scala diff --git a/src/main/scala/scala/util/parsing/input/Reader.scala b/shared/src/main/scala/scala/util/parsing/input/Reader.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/Reader.scala rename to shared/src/main/scala/scala/util/parsing/input/Reader.scala diff --git a/src/main/scala/scala/util/parsing/input/StreamReader.scala b/shared/src/main/scala/scala/util/parsing/input/StreamReader.scala similarity index 100% rename from src/main/scala/scala/util/parsing/input/StreamReader.scala rename to shared/src/main/scala/scala/util/parsing/input/StreamReader.scala diff --git a/src/main/scala/scala/util/parsing/json/JSON.scala b/shared/src/main/scala/scala/util/parsing/json/JSON.scala similarity index 100% rename from src/main/scala/scala/util/parsing/json/JSON.scala rename to shared/src/main/scala/scala/util/parsing/json/JSON.scala diff --git a/src/main/scala/scala/util/parsing/json/Lexer.scala b/shared/src/main/scala/scala/util/parsing/json/Lexer.scala similarity index 100% rename from src/main/scala/scala/util/parsing/json/Lexer.scala rename to shared/src/main/scala/scala/util/parsing/json/Lexer.scala diff --git a/src/main/scala/scala/util/parsing/json/Parser.scala b/shared/src/main/scala/scala/util/parsing/json/Parser.scala similarity index 100% rename from src/main/scala/scala/util/parsing/json/Parser.scala rename to shared/src/main/scala/scala/util/parsing/json/Parser.scala diff --git a/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala b/shared/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala similarity index 96% rename from src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala rename to shared/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala index 28cf1ba7..9527feea 100644 --- a/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala +++ b/shared/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala @@ -97,7 +97,7 @@ class JavaTokenParsersTest { case Failure(message, next) => assertEquals(next.pos.line, 1) assertEquals(next.pos.column, 1) - assert(message.endsWith(s"regex `\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*' expected but `-' found")) + assert(message.endsWith(s"identifier expected but `-' found")) case _ => sys.error(parseResult.toString) } diff --git a/src/test/scala/scala/util/parsing/combinator/JsonTest.scala b/shared/src/test/scala/scala/util/parsing/combinator/JsonTest.scala similarity index 98% rename from src/test/scala/scala/util/parsing/combinator/JsonTest.scala rename to shared/src/test/scala/scala/util/parsing/combinator/JsonTest.scala index cb24a334..84e15bfb 100644 --- a/src/test/scala/scala/util/parsing/combinator/JsonTest.scala +++ b/shared/src/test/scala/scala/util/parsing/combinator/JsonTest.scala @@ -120,7 +120,10 @@ class JsonTest { assertEquals("{\"name\" : {\"name1\" : \"va1ue1\", \"name2\" : \"va1ue2\"}}", JSONObject(Map("name" -> JSONObject(TreeMap("name1" -> "va1ue1", "name2" -> "va1ue2")))).toString()) - assertEquals("[4.0, 1.0, 3.0, 2.0, 6.0, 5.0, 8.0, 7.0]", JSONArray(List[Double](4,1,3,2,6,5,8,7)).toString()) + val expected = + if (1.0.toString == "1") "[4, 1, 3, 2, 6, 5, 8, 7]" + else "[4.0, 1.0, 3.0, 2.0, 6.0, 5.0, 8.0, 7.0]" + assertEquals(expected, JSONArray(List[Double](4,1,3,2,6,5,8,7)).toString()) } // A test method that escapes all characters in strings diff --git a/src/test/scala/scala/util/parsing/combinator/PackratParsersTest.scala b/shared/src/test/scala/scala/util/parsing/combinator/PackratParsersTest.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/PackratParsersTest.scala rename to shared/src/test/scala/scala/util/parsing/combinator/PackratParsersTest.scala diff --git a/src/test/scala/scala/util/parsing/combinator/RegexParsersTest.scala b/shared/src/test/scala/scala/util/parsing/combinator/RegexParsersTest.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/RegexParsersTest.scala rename to shared/src/test/scala/scala/util/parsing/combinator/RegexParsersTest.scala diff --git a/src/test/scala/scala/util/parsing/combinator/UnitTestIO.scala b/shared/src/test/scala/scala/util/parsing/combinator/UnitTestIO.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/UnitTestIO.scala rename to shared/src/test/scala/scala/util/parsing/combinator/UnitTestIO.scala diff --git a/src/test/scala/scala/util/parsing/combinator/gh45.scala b/shared/src/test/scala/scala/util/parsing/combinator/gh45.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/gh45.scala rename to shared/src/test/scala/scala/util/parsing/combinator/gh45.scala diff --git a/src/test/scala/scala/util/parsing/combinator/gh56.scala b/shared/src/test/scala/scala/util/parsing/combinator/gh56.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/gh56.scala rename to shared/src/test/scala/scala/util/parsing/combinator/gh56.scala diff --git a/src/test/scala/scala/util/parsing/combinator/t0700.scala b/shared/src/test/scala/scala/util/parsing/combinator/t0700.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t0700.scala rename to shared/src/test/scala/scala/util/parsing/combinator/t0700.scala diff --git a/src/test/scala/scala/util/parsing/combinator/t1100.scala b/shared/src/test/scala/scala/util/parsing/combinator/t1100.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t1100.scala rename to shared/src/test/scala/scala/util/parsing/combinator/t1100.scala diff --git a/src/test/scala/scala/util/parsing/combinator/t4138.scala b/shared/src/test/scala/scala/util/parsing/combinator/t4138.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t4138.scala rename to shared/src/test/scala/scala/util/parsing/combinator/t4138.scala diff --git a/src/test/scala/scala/util/parsing/combinator/t5514.scala b/shared/src/test/scala/scala/util/parsing/combinator/t5514.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t5514.scala rename to shared/src/test/scala/scala/util/parsing/combinator/t5514.scala diff --git a/src/test/scala/scala/util/parsing/combinator/t8879.scala b/shared/src/test/scala/scala/util/parsing/combinator/t8879.scala similarity index 100% rename from src/test/scala/scala/util/parsing/combinator/t8879.scala rename to shared/src/test/scala/scala/util/parsing/combinator/t8879.scala