Skip to content

Commit 36d61e6

Browse files
committed
add Dotty to build
including adding Scala 3 version of ShouldNotTypecheck
1 parent 24732bd commit 36d61e6

File tree

8 files changed

+204
-68
lines changed

8 files changed

+204
-68
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ language: scala
66

77
scala:
88
- 2.13.3
9+
- 0.27.0-RC1
910

1011
env:
1112
- ADOPTOPENJDK=8

build.sbt

+34-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
Global / cancelable := true
22
publish / skip := true // in root
33

4+
Global / scalacOptions ++= (
5+
if (isDotty.value) Seq("-language:implicitConversions") // TODO check again on 3.0.0-M1
6+
else Seq()
7+
)
8+
49
lazy val commonSettings: Seq[Setting[_]] =
510
ScalaModulePlugin.scalaModuleSettings ++ Seq(
6-
Compile / compile / scalacOptions += "-Werror"
11+
Compile / compile / scalacOptions --= (if (isDotty.value) Seq("-Xlint")
12+
else Seq()),
13+
Compile / compile / scalacOptions ++= (if (isDotty.value) Seq()
14+
else Seq("-Werror")),
715
)
816

917
lazy val core = project.in(file("core"))
1018
.settings(commonSettings)
1119
.settings(
12-
name := "scala-parallel-collections"
20+
name := "scala-parallel-collections",
21+
// don't run Dottydoc, it errors and isn't needed anyway
22+
Compile / doc / sources := (if (isDotty.value) Seq() else (Compile / doc/ sources).value),
23+
Compile / packageDoc / publishArtifact := !isDotty.value,
1324
)
1425

1526
lazy val junit = project.in(file("junit"))
@@ -20,13 +31,22 @@ lazy val junit = project.in(file("junit"))
2031
libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1" % Test,
2132
testOptions += Tests.Argument(TestFrameworks.JUnit, "-a", "-v"),
2233
Test / fork := true,
23-
publish / skip := true
34+
publish / skip := true,
35+
// https://github.com/sbt/sbt/pull/5919 adds this to sbt itself,
36+
// so we should revisit once sbt 1.4.1 is available
37+
Test / unmanagedSourceDirectories += {
38+
val major = CrossVersion.partialVersion(scalaVersion.value) match {
39+
case Some((0 | 3, _)) => "3"
40+
case _ => "2"
41+
}
42+
baseDirectory.value / "src" / "test" / s"scala-$major"
43+
},
2444
).dependsOn(testmacros, core)
2545

2646
lazy val scalacheck = project.in(file("scalacheck"))
2747
.settings(commonSettings)
2848
.settings(
29-
libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.14.3",
49+
libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.15.0-M1" withDottyCompat(scalaVersion.value),
3050
Test / fork := true,
3151
Test / testOptions += Tests.Argument(TestFrameworks.ScalaCheck, "-workers", "1", "-minSize", "0", "-maxSize", "4000", "-minSuccessfulTests", "5"),
3252
publish / skip := true
@@ -36,5 +56,14 @@ lazy val testmacros = project.in(file("testmacros"))
3656
.settings(commonSettings)
3757
.settings(
3858
libraryDependencies += scalaOrganization.value % "scala-compiler" % scalaVersion.value,
39-
publish / skip := true
59+
publish / skip := true,
60+
// https://github.com/sbt/sbt/pull/5919 adds this to sbt itself,
61+
// so we should revisit once sbt 1.4.1 is available
62+
Compile / unmanagedSourceDirectories += {
63+
val major = CrossVersion.partialVersion(scalaVersion.value) match {
64+
case Some((0 | 3, _)) => "3"
65+
case _ => "2"
66+
}
67+
baseDirectory.value / "src" / "main" / s"scala-$major"
68+
},
4069
)

junit/src/test/scala/scala/SerializationStabilityTest.scala renamed to junit/src/test/scala-2/scala/SerializationStabilityTest.scala

+3-63
Original file line numberDiff line numberDiff line change
@@ -18,72 +18,12 @@ import org.junit.Test
1818

1919
// This test is self-modifying when run as follows:
2020
//
21-
// junit/testOnly scala.SerializationStabilityTest -- -Doverwrite.source=src/test/scala/scala/SerializationStabilityTest.scala
21+
// junit/testOnly scala.SerializationStabilityTest -- -Doverwrite.source=src/test/scala-2/scala/SerializationStabilityTest.scala
2222
//
2323
// Use this to re-establish a baseline for serialization compatibility.
2424

2525
// based on run/t8549.scala partest
26-
object SerializationStability extends App {
27-
28-
val overwrite: Option[Path] =
29-
sys.props.get("overwrite.source")
30-
.map(s => Paths.get(s).toAbsolutePath)
31-
32-
def serialize(o: AnyRef): String = {
33-
val bos = new java.io.ByteArrayOutputStream()
34-
val out = new java.io.ObjectOutputStream(bos)
35-
out.writeObject(o)
36-
out.flush()
37-
printBase64Binary(bos.toByteArray())
38-
}
39-
40-
def amend(path: Path)(f: String => String): Unit = {
41-
val old = new String(java.nio.file.Files.readAllBytes(path))
42-
Files.write(path, f(old).getBytes)
43-
}
44-
45-
def quote(s: String) = List("\"", s, "\"").mkString
46-
47-
def patch(path: Path, line: Int, prevResult: String, result: String): Unit = {
48-
amend(path) {
49-
content =>
50-
content.linesIterator.toList.zipWithIndex.map {
51-
case (content, i) if i == line - 1 =>
52-
val newContent = content.replace(quote(prevResult), quote(result))
53-
if (newContent != content)
54-
println(s"- $content\n+ $newContent\n")
55-
newContent
56-
case (content, _) => content
57-
}.mkString("\n")
58-
}
59-
}
60-
61-
def updateComment(path: Path): Unit = {
62-
val timestamp = {
63-
import java.text.SimpleDateFormat
64-
val sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss")
65-
sdf.format(new java.util.Date)
66-
}
67-
val newComment = s" // Generated on $timestamp with Scala ${scala.util.Properties.versionString})"
68-
amend(path) {
69-
content =>
70-
content.linesIterator.toList.map {
71-
f => f.replaceAll("""^ +// Generated on.*""", newComment)
72-
}.mkString("\n")
73-
}
74-
}
75-
76-
def deserialize(string: String): AnyRef = {
77-
val bis = new java.io.ByteArrayInputStream(parseBase64Binary(string))
78-
val in = new java.io.ObjectInputStream(bis)
79-
in.readObject()
80-
}
81-
82-
def checkRoundTrip[T <: AnyRef](instance: T)(f: T => AnyRef): Unit = {
83-
val result = serialize(instance)
84-
val reconstituted = deserialize(result).asInstanceOf[T]
85-
assert(f(instance) == f(reconstituted), (f(instance), f(reconstituted)))
86-
}
26+
object SerializationStability extends App with SerializationStabilityBase {
8727

8828
def check[T <: AnyRef](instance: => T)(prevResult: String, f: T => AnyRef = (x: T) => x): Unit = {
8929
val result = serialize(instance)
@@ -98,7 +38,7 @@ object SerializationStability extends App {
9838
}
9939
}
10040

101-
// Generated on 20190328-12:57:02 with Scala version 2.13.0-pre-59975bb)
41+
// Generated on 20201015-13:14:45 with Scala version 2.13.3)
10242
overwrite.foreach(updateComment)
10343

10444
// check(new collection.concurrent.TrieMap[Any, Any]())( "rO0ABXNyACNzY2FsYS5jb2xsZWN0aW9uLmNvbmN1cnJlbnQuVHJpZU1hcKckxpgOIYHPAwAETAALZXF1YWxpdHlvYmp0ABJMc2NhbGEvbWF0aC9FcXVpdjtMAApoYXNoaW5nb2JqdAAcTHNjYWxhL3V0aWwvaGFzaGluZy9IYXNoaW5nO0wABHJvb3R0ABJMamF2YS9sYW5nL09iamVjdDtMAAtyb290dXBkYXRlcnQAOUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyO3hwc3IAMnNjYWxhLmNvbGxlY3Rpb24uY29uY3VycmVudC5UcmllTWFwJE1hbmdsZWRIYXNoaW5nhTBoJQ/mgb0CAAB4cHNyABhzY2FsYS5tYXRoLkVxdWl2JCRhbm9uJDLBbyx4dy/qGwIAAHhwc3IANHNjYWxhLmNvbGxlY3Rpb24uY29uY3VycmVudC5UcmllTWFwU2VyaWFsaXphdGlvbkVuZCSbjdgbbGCt2gIAAHhweA==")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Scala (https://www.scala-lang.org)
3+
*
4+
* Copyright EPFL and Lightbend, Inc.
5+
*
6+
* Licensed under Apache License 2.0
7+
* (http://www.apache.org/licenses/LICENSE-2.0).
8+
*
9+
* See the NOTICE file distributed with this work for
10+
* additional information regarding copyright ownership.
11+
*/
12+
13+
package scala
14+
15+
import javax.xml.bind.DatatypeConverter._
16+
import java.nio.file.{ Path, Paths, Files }
17+
import org.junit.Test
18+
19+
// This test is self-modifying when run as follows:
20+
//
21+
// junit/testOnly scala.SerializationStabilityTest -- -Doverwrite.source=src/test/scala-3/scala/SerializationStabilityTest.scala
22+
//
23+
// Use this to re-establish a baseline for serialization compatibility.
24+
25+
// based on run/t8549.scala partest
26+
object SerializationStability extends App with SerializationStabilityBase {
27+
28+
def check[T <: AnyRef](instance: => T)(prevResult: String, f: T => AnyRef = (x: T) => x): Unit = {
29+
val result = serialize(instance)
30+
overwrite match {
31+
case Some(f) =>
32+
val lineNumberOfLiteralString = Thread.currentThread.getStackTrace.apply(2).getLineNumber
33+
patch(f, lineNumberOfLiteralString, prevResult, result)
34+
case None =>
35+
checkRoundTrip(instance)(f)
36+
assert(f(deserialize(prevResult).asInstanceOf[T]) == f(instance), s"$instance != f(deserialize(prevResult))")
37+
assert(prevResult == result, s"instance = $instance : ${instance.getClass}\n serialization unstable: ${prevResult}\n found: ${result}")
38+
}
39+
}
40+
41+
// Generated on 20201015-13:11:40 with Scala version 2.13.3)
42+
overwrite.foreach(updateComment)
43+
44+
// check(new collection.concurrent.TrieMap[Any, Any]())( "rO0ABXNyACNzY2FsYS5jb2xsZWN0aW9uLmNvbmN1cnJlbnQuVHJpZU1hcKckxpgOIYHPAwAETAALZXF1YWxpdHlvYmp0ABJMc2NhbGEvbWF0aC9FcXVpdjtMAApoYXNoaW5nb2JqdAAcTHNjYWxhL3V0aWwvaGFzaGluZy9IYXNoaW5nO0wABHJvb3R0ABJMamF2YS9sYW5nL09iamVjdDtMAAtyb290dXBkYXRlcnQAOUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyO3hwc3IAMnNjYWxhLmNvbGxlY3Rpb24uY29uY3VycmVudC5UcmllTWFwJE1hbmdsZWRIYXNoaW5nhTBoJQ/mgb0CAAB4cHNyABhzY2FsYS5tYXRoLkVxdWl2JCRhbm9uJDLBbyx4dy/qGwIAAHhwc3IANHNjYWxhLmNvbGxlY3Rpb24uY29uY3VycmVudC5UcmllTWFwU2VyaWFsaXphdGlvbkVuZCSbjdgbbGCt2gIAAHhweA==")
45+
// not sure why this one needs stable serialization.
46+
47+
import collection.parallel
48+
check(parallel.immutable.ParHashMap(1 -> 2))( "rO0ABXNyAC5zY2FsYS5jb2xsZWN0aW9uLnBhcmFsbGVsLmltbXV0YWJsZS5QYXJIYXNoTWFwAAAAAAAAAAMCAARKAAkwYml0bWFwJDFMAA1TY2FuTGVhZiRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5MZWFmJDtMAA1TY2FuTm9kZSRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5Ob2RlJDtMAAR0cmlldAAnTHNjYWxhL2NvbGxlY3Rpb24vaW1tdXRhYmxlL09sZEhhc2hNYXA7eHAAAAAAAAAAAHBwc3IAMXNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLk9sZEhhc2hNYXAkT2xkSGFzaE1hcDEu846aGc5HjAIABEkABGhhc2hMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAAJrdnQADkxzY2FsYS9UdXBsZTI7TAAFdmFsdWVxAH4ABnhyACVzY2FsYS5jb2xsZWN0aW9uLmltbXV0YWJsZS5PbGRIYXNoTWFwGzyZ5OayDwECAAB4cP+DzudzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAXNyAAxzY2FsYS5UdXBsZTIB+93NIuc0egIAAkwAAl8xcQB+AAZMAAJfMnEAfgAGeHBxAH4ADHNxAH4ACgAAAAJxAH4ADw==")
49+
check(parallel.immutable.ParHashSet(1, 2, 3))( "rO0ABXNyAC5zY2FsYS5jb2xsZWN0aW9uLnBhcmFsbGVsLmltbXV0YWJsZS5QYXJIYXNoU2V0AAAAAAAAAAECAARKAAkwYml0bWFwJDFMAA1TY2FuTGVhZiRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5MZWFmJDtMAA1TY2FuTm9kZSRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5Ob2RlJDtMAAR0cmlldAAnTHNjYWxhL2NvbGxlY3Rpb24vaW1tdXRhYmxlL09sZEhhc2hTZXQ7eHAAAAAAAAAAAHBwc3IAMXNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLk9sZEhhc2hTZXQkSGFzaFRyaWVTZXTiTcUmrrCZogIAA0kABmJpdG1hcEkABXNpemUwWwAFZWxlbXN0AChbTHNjYWxhL2NvbGxlY3Rpb24vaW1tdXRhYmxlL09sZEhhc2hTZXQ7eHIAJXNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLk9sZEhhc2hTZXRY25CS1TvmFgIAAHhwABBAgAAAAAN1cgAoW0xzY2FsYS5jb2xsZWN0aW9uLmltbXV0YWJsZS5PbGRIYXNoU2V0OwgA+jL9wEgOAgAAeHAAAAADc3IAMXNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLk9sZEhhc2hTZXQkT2xkSGFzaFNldDEdQIAs6u3ODgIAAkkABGhhc2hMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDt4cgA0c2NhbGEuY29sbGVjdGlvbi5pbW11dGFibGUuT2xkSGFzaFNldCRMZWFmT2xkSGFzaFNldF2Et+1jWqbdAgAAeHEAfgAH/4PO53NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3EAfgAL/4OsznNxAH4ADwAAAAJzcQB+AAv/g4rUc3EAfgAPAAAAAw==")
50+
// TODO SI-8576 Uninitialized field under -Xcheckinit
51+
// check(new parallel.immutable.ParRange(new Range(0, 1, 2)))( "rO0ABXNyACxzY2FsYS5jb2xsZWN0aW9uLnBhcmFsbGVsLmltbXV0YWJsZS5QYXJSYW5nZQAAAAAAAAABAgAETAAXUGFyUmFuZ2VJdGVyYXRvciRtb2R1bGV0AEBMc2NhbGEvY29sbGVjdGlvbi9wYXJhbGxlbC9pbW11dGFibGUvUGFyUmFuZ2UkUGFyUmFuZ2VJdGVyYXRvciQ7TAAPU2NhbkxlYWYkbW9kdWxldAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5MZWFmJDtMAA9TY2FuTm9kZSRtb2R1bGV0ADVMc2NhbGEvY29sbGVjdGlvbi9wYXJhbGxlbC9QYXJJdGVyYWJsZUxpa2UkU2Nhbk5vZGUkO0wABXJhbmdldAAiTHNjYWxhL2NvbGxlY3Rpb24vaW1tdXRhYmxlL1JhbmdlO3hwcHBwc3IAIHNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLlJhbmdlabujVKsVMg0CAAdJAANlbmRaAAdpc0VtcHR5SQALbGFzdEVsZW1lbnRJABBudW1SYW5nZUVsZW1lbnRzSQAFc3RhcnRJAARzdGVwSQAPdGVybWluYWxFbGVtZW50eHAAAAABAAAAAAAAAAABAAAAAAAAAAIAAAAC")
52+
// TODO SI-8576 unstable under -Xcheckinit
53+
// check(parallel.mutable.ParArray(1, 2, 3))( "rO0ABXNyACpzY2FsYS5jb2xsZWN0aW9uLnBhcmFsbGVsLm11dGFibGUuUGFyQXJyYXkAAAAAAAAAAQMABEwAF1BhckFycmF5SXRlcmF0b3IkbW9kdWxldAA+THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvbXV0YWJsZS9QYXJBcnJheSRQYXJBcnJheUl0ZXJhdG9yJDtMAA9TY2FuTGVhZiRtb2R1bGV0ADVMc2NhbGEvY29sbGVjdGlvbi9wYXJhbGxlbC9QYXJJdGVyYWJsZUxpa2UkU2NhbkxlYWYkO0wAD1NjYW5Ob2RlJG1vZHVsZXQANUxzY2FsYS9jb2xsZWN0aW9uL3BhcmFsbGVsL1Bhckl0ZXJhYmxlTGlrZSRTY2FuTm9kZSQ7TAAIYXJyYXlzZXF0ACNMc2NhbGEvY29sbGVjdGlvbi9tdXRhYmxlL0FycmF5U2VxO3hwcHBwc3IAMXNjYWxhLmNvbGxlY3Rpb24ucGFyYWxsZWwubXV0YWJsZS5FeHBvc2VkQXJyYXlTZXGx2OTefAodSQIAAkkABmxlbmd0aFsABWFycmF5dAATW0xqYXZhL2xhbmcvT2JqZWN0O3hyACFzY2FsYS5jb2xsZWN0aW9uLm11dGFibGUuQXJyYXlTZXEVPD3SKEkOcwIAAkkABmxlbmd0aFsABWFycmF5cQB+AAd4cAAAAAN1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAADcHBwAAAAA3VxAH4ACgAAABBzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAXNxAH4ADQAAAAJzcQB+AA0AAAADcHBwcHBwcHBwcHBwcHg=")
54+
check(parallel.mutable.ParHashMap(1 -> 2))( "rO0ABXNyACxzY2FsYS5jb2xsZWN0aW9uLnBhcmFsbGVsLm11dGFibGUuUGFySGFzaE1hcAAAAAAAAAADAwAJSgAJMGJpdG1hcCQxSQALX2xvYWRGYWN0b3JJAAlzZWVkdmFsdWVJAAl0YWJsZVNpemVJAAl0aHJlc2hvbGRMAA1TY2FuTGVhZiRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5MZWFmJDtMAA1TY2FuTm9kZSRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5Ob2RlJDtbAAdzaXplbWFwdAACW0lbAAV0YWJsZXQAJVtMc2NhbGEvY29sbGVjdGlvbi9tdXRhYmxlL0hhc2hFbnRyeTt4cHcNAAAC7gAAAAEAAAAEAXNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3EAfgAGAAAAAng=")
55+
check(parallel.mutable.ParHashSet(1, 2, 3))( "rO0ABXNyACxzY2FsYS5jb2xsZWN0aW9uLnBhcmFsbGVsLm11dGFibGUuUGFySGFzaFNldAAAAAAAAAABAwAJSgAJMGJpdG1hcCQxSQALX2xvYWRGYWN0b3JJAAlzZWVkdmFsdWVJAAl0YWJsZVNpemVJAAl0aHJlc2hvbGRMAA1TY2FuTGVhZiRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5MZWFmJDtMAA1TY2FuTm9kZSRsenkxdAA1THNjYWxhL2NvbGxlY3Rpb24vcGFyYWxsZWwvUGFySXRlcmFibGVMaWtlJFNjYW5Ob2RlJDtbAAdzaXplbWFwdAACW0lbAAV0YWJsZXQAE1tMamF2YS9sYW5nL09iamVjdDt4cHcNAAABwgAAAAMAAAAbAXNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3EAfgAGAAAAAnNxAH4ABgAAAAN4")
56+
}
57+
58+
class SerializationStabilityTest {
59+
@Test
60+
def testAll: Unit = SerializationStability.main(new Array[String](0))
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Scala (https://www.scala-lang.org)
3+
*
4+
* Copyright EPFL and Lightbend, Inc.
5+
*
6+
* Licensed under Apache License 2.0
7+
* (http://www.apache.org/licenses/LICENSE-2.0).
8+
*
9+
* See the NOTICE file distributed with this work for
10+
* additional information regarding copyright ownership.
11+
*/
12+
13+
package scala
14+
15+
import javax.xml.bind.DatatypeConverter._
16+
import java.nio.file.{ Path, Paths, Files }
17+
import org.junit.Test
18+
19+
trait SerializationStabilityBase {
20+
21+
val overwrite: Option[Path] =
22+
sys.props.get("overwrite.source")
23+
.map(s => Paths.get(s).toAbsolutePath)
24+
25+
def serialize(o: AnyRef): String = {
26+
val bos = new java.io.ByteArrayOutputStream()
27+
val out = new java.io.ObjectOutputStream(bos)
28+
out.writeObject(o)
29+
out.flush()
30+
printBase64Binary(bos.toByteArray())
31+
}
32+
33+
def amend(path: Path)(f: String => String): Unit = {
34+
val old = new String(java.nio.file.Files.readAllBytes(path))
35+
Files.write(path, f(old).getBytes)
36+
}
37+
38+
def quote(s: String) = List("\"", s, "\"").mkString
39+
40+
def patch(path: Path, line: Int, prevResult: String, result: String): Unit = {
41+
amend(path) {
42+
content =>
43+
content.linesIterator.toList.zipWithIndex.map {
44+
case (content, i) if i == line - 1 =>
45+
val newContent = content.replace(quote(prevResult), quote(result))
46+
if (newContent != content)
47+
println(s"- $content\n+ $newContent\n")
48+
newContent
49+
case (content, _) => content
50+
}.mkString("\n")
51+
}
52+
}
53+
54+
def updateComment(path: Path): Unit = {
55+
val timestamp = {
56+
import java.text.SimpleDateFormat
57+
val sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss")
58+
sdf.format(new java.util.Date)
59+
}
60+
val newComment = s" // Generated on $timestamp with Scala ${scala.util.Properties.versionString})"
61+
amend(path) {
62+
content =>
63+
content.linesIterator.toList.map {
64+
f => f.replaceAll("""^ +// Generated on.*""", newComment)
65+
}.mkString("\n")
66+
}
67+
}
68+
69+
def deserialize(string: String): AnyRef = {
70+
val bis = new java.io.ByteArrayInputStream(parseBase64Binary(string))
71+
val in = new java.io.ObjectInputStream(bis)
72+
in.readObject()
73+
}
74+
75+
def checkRoundTrip[T <: AnyRef](instance: T)(f: T => AnyRef): Unit = {
76+
val result = serialize(instance)
77+
val reconstituted = deserialize(result).asInstanceOf[T]
78+
assert(f(instance) == f(reconstituted), (f(instance), f(reconstituted)))
79+
}
80+
81+
}

project/plugins.sbt

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
addSbtPlugin("org.scala-lang.modules" % "sbt-scala-module" % "2.2.2")
2+
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.2")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Scala (https://www.scala-lang.org)
3+
*
4+
* Copyright EPFL and Lightbend, Inc.
5+
*
6+
* Licensed under Apache License 2.0
7+
* (http://www.apache.org/licenses/LICENSE-2.0).
8+
*
9+
* See the NOTICE file distributed with this work for
10+
* additional information regarding copyright ownership.
11+
*/
12+
13+
package testutil
14+
15+
import scala.compiletime.testing._
16+
17+
/**
18+
* Ensures that a code snippet does not typecheck.
19+
*/
20+
object ShouldNotTypecheck {
21+
inline def apply(code: String): Unit = assert(!typeChecks(code))
22+
inline def apply(code: String, expected: String): Unit = apply(code)
23+
}

0 commit comments

Comments
 (0)