Skip to content

Commit b54b19b

Browse files
committed
chore: first draft of the stdlib
1 parent f7e5df5 commit b54b19b

10 files changed

+3454
-78
lines changed

project/Build.scala

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import sbt.Package.ManifestAttributes
2020
import sbt.PublishBinPlugin.autoImport._
2121
import dotty.tools.sbtplugin.RepublishPlugin
2222
import dotty.tools.sbtplugin.RepublishPlugin.autoImport._
23+
import dotty.tools.sbtplugin.ScalaLibraryPlugin
24+
2325
import sbt.plugins.SbtPlugin
2426
import sbt.ScriptedPlugin.autoImport._
2527
import xerial.sbt.Sonatype.autoImport._
@@ -32,6 +34,8 @@ import sbtbuildinfo.BuildInfoPlugin.autoImport._
3234
import sbttastymima.TastyMiMaPlugin
3335
import sbttastymima.TastyMiMaPlugin.autoImport._
3436

37+
import scala.jdk.CollectionConverters._
38+
3539
import scala.util.Properties.isJavaAtLeast
3640

3741
import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._
@@ -1205,9 +1209,9 @@ object Build {
12051209
* This version of the library is not (yet) TASTy/binary compatible with the Scala 2 compiled library.
12061210
*/
12071211
lazy val `scala2-library-bootstrapped` = project.in(file("scala2-library-bootstrapped")).
1212+
enablePlugins(ScalaLibraryPlugin).
12081213
withCommonSettings(Bootstrapped).
12091214
dependsOn(dottyCompiler(Bootstrapped) % "provided; compile->runtime; test->test").
1210-
settings(commonBootstrappedSettings).
12111215
settings(scala2LibraryBootstrappedSettings).
12121216
settings(moduleName := "scala2-library")
12131217
// -Ycheck:all is set in project/scripts/scala2-library-tasty-mima.sh
@@ -1219,7 +1223,6 @@ object Build {
12191223
lazy val `scala2-library-cc` = project.in(file("scala2-library-cc")).
12201224
withCommonSettings(Bootstrapped).
12211225
dependsOn(dottyCompiler(Bootstrapped) % "provided; compile->runtime; test->test").
1222-
settings(commonBootstrappedSettings).
12231226
settings(scala2LibraryBootstrappedSettings).
12241227
settings(
12251228
moduleName := "scala2-library-cc",

project/Scala2LibraryBootstrappedMiMaFilters.scala

+29-76
Original file line numberDiff line numberDiff line change
@@ -4,82 +4,35 @@ import com.typesafe.tools.mima.core._
44
object Scala2LibraryBootstrappedMiMaFilters {
55

66
val BackwardsBreakingChanges: Map[String, Seq[ProblemFilter]] = Map(
7-
Build.stdlibBootstrappedVersion -> {
8-
Seq(
9-
// Files that are not compiled in the bootstrapped library
10-
ProblemFilters.exclude[MissingClassProblem]("scala.AnyVal"),
11-
12-
// Scala language features
13-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.language.<clinit>"),
14-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.language#experimental.<clinit>"),
15-
ProblemFilters.exclude[FinalClassProblem]("scala.language$experimental$"),
16-
ProblemFilters.exclude[FinalClassProblem]("scala.languageFeature$*$"),
17-
18-
// trait $init$
19-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*.$init$"),
20-
21-
// Value class extension methods
22-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*$extension"),
23-
24-
// Companion module class
25-
ProblemFilters.exclude[FinalClassProblem]("scala.*$"),
26-
27-
// Scala 2 intrinsic macros
28-
ProblemFilters.exclude[FinalMethodProblem]("scala.StringContext.s"),
29-
30-
// Specialization?
31-
ProblemFilters.exclude[MissingFieldProblem]("scala.Tuple1._1"), // field _1 in class scala.Tuple1 does not have a correspondent in current version
32-
ProblemFilters.exclude[MissingFieldProblem]("scala.Tuple2._1"), // field _1 in class scala.Tuple2 does not have a correspondent in current version
33-
ProblemFilters.exclude[MissingFieldProblem]("scala.Tuple2._2"), // field _2 in class scala.Tuple2 does not have a correspondent in current version
34-
35-
// Scala 2 specialization
36-
ProblemFilters.exclude[MissingClassProblem]("scala.*$sp"),
37-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*$sp"),
38-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*#*#sp.$init$"),
39-
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.DoubleStepper"),
40-
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.immutable.DoubleVectorStepper"),
41-
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.immutable.IntVectorStepper"),
42-
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.immutable.LongVectorStepper"),
43-
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.IntStepper"),
44-
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.LongStepper"),
45-
ProblemFilters.exclude[MissingTypesProblem]("scala.jdk.DoubleAccumulator"),
46-
ProblemFilters.exclude[MissingTypesProblem]("scala.jdk.FunctionWrappers$*"),
47-
ProblemFilters.exclude[MissingTypesProblem]("scala.jdk.IntAccumulator"),
48-
ProblemFilters.exclude[MissingTypesProblem]("scala.jdk.LongAccumulator"),
49-
ProblemFilters.exclude[FinalClassProblem]("scala.collection.ArrayOps$ReverseIterator"),
50-
ProblemFilters.exclude[FinalClassProblem]("scala.Tuple1"),
51-
ProblemFilters.exclude[FinalClassProblem]("scala.Tuple2"),
52-
53-
// other
54-
ProblemFilters.exclude[FinalMethodProblem]("scala.Enumeration.ValueOrdering"),
55-
ProblemFilters.exclude[FinalMethodProblem]("scala.Enumeration.ValueSet"),
56-
ProblemFilters.exclude[FinalMethodProblem]("scala.io.Source.NoPositioner"),
57-
ProblemFilters.exclude[FinalMethodProblem]("scala.io.Source.RelaxedPosition"),
58-
ProblemFilters.exclude[FinalMethodProblem]("scala.io.Source.RelaxedPositioner"),
59-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.SortedMapOps.coll"),
60-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.TreeMap.empty"),
61-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.TreeMap.fromSpecific"),
62-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.mutable.ArrayBuilder#ofUnit.addAll"),
63-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.mutable.TreeMap.empty"),
64-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.mutable.TreeMap.fromSpecific"),
65-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.reflect.ManifestFactory#NothingManifest.newArray"),
66-
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.reflect.ManifestFactory#NullManifest.newArray"),
67-
ProblemFilters.exclude[MissingFieldProblem]("scala.collection.ArrayOps#ReverseIterator.xs"),
68-
ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.NonLocalReturnControl.value"),
69-
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.collection.immutable.SortedMapOps.coll"),
70-
) ++
71-
Seq( // DirectMissingMethodProblem
72-
"scala.collection.LinearSeqIterator#LazyCell.this",
73-
"scala.collection.mutable.PriorityQueue#ResizableArrayAccess.this",
74-
"scala.concurrent.BatchingExecutor#AbstractBatch.this",
75-
"scala.concurrent.Channel#LinkedList.this",
76-
"scala.Enumeration#ValueOrdering.this",
77-
"scala.io.Source#RelaxedPosition.this",
78-
"scala.collection.IterableOnceOps#Maximized.this", // New in 2.13.11: private inner class
79-
"scala.util.Properties.<clinit>",
80-
"scala.util.Sorting.scala$util$Sorting$$mergeSort$default$5",
81-
).map(ProblemFilters.exclude[DirectMissingMethodProblem])
82-
}
7+
Build.stdlibBootstrappedVersion -> Seq(
8+
// Scala language features (not really a problem)
9+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.language.<clinit>"),
10+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.language#experimental.<clinit>"),
11+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.util.Properties.<clinit>"),
12+
13+
// Companion module class (not really a problem)
14+
ProblemFilters.exclude[FinalClassProblem]("scala.*$"),
15+
ProblemFilters.exclude[FinalMethodProblem]("scala.io.Source.NoPositioner"),
16+
ProblemFilters.exclude[FinalMethodProblem]("scala.io.Source.RelaxedPosition"),
17+
ProblemFilters.exclude[FinalMethodProblem]("scala.io.Source.RelaxedPositioner"),
18+
ProblemFilters.exclude[FinalMethodProblem]("scala.Enumeration.ValueOrdering"),
19+
ProblemFilters.exclude[FinalMethodProblem]("scala.Enumeration.ValueSet"),
20+
ProblemFilters.exclude[FinalMethodProblem]("scala.StringContext.s"),
21+
22+
// Need to be fixed
23+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*.$init$"),
24+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*$extension"),
25+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.SortedMapOps.coll"),
26+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.TreeMap.empty"),
27+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.TreeMap.fromSpecific"),
28+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.mutable.ArrayBuilder#ofUnit.addAll"),
29+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.mutable.TreeMap.empty"),
30+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.mutable.TreeMap.fromSpecific"),
31+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.reflect.ManifestFactory#NothingManifest.newArray"),
32+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.reflect.ManifestFactory#NullManifest.newArray"),
33+
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.collection.immutable.SortedMapOps.coll"),
34+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.util.Sorting.scala$util$Sorting$$mergeSort$default$5")
35+
)
8336
)
8437

8538
val ForwardsBreakingChanges: Map[String, Seq[ProblemFilter]] = Map(

project/ScalaLibraryPlugin.scala

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package dotty.tools.sbtplugin
2+
3+
import sbt.*
4+
import sbt.Keys.*
5+
import scala.jdk.CollectionConverters.*
6+
import java.nio.file.Files
7+
8+
object ScalaLibraryPlugin extends AutoPlugin {
9+
10+
override def trigger = noTrigger
11+
12+
val fetchScala2ClassFiles = taskKey[(Set[File], File)]("Fetch the files to use that were compiled with Scala 2")
13+
//val scala2LibraryVersion = settingKey[String]("Version of the Scala 2 Standard Library")
14+
15+
override def projectSettings = Seq (
16+
fetchScala2ClassFiles := {
17+
val stream = streams.value
18+
val cache = stream.cacheDirectory
19+
val target = cache / "scala-library-classes"
20+
val report = update.value
21+
22+
val scalaLibraryBinaryJar = report.select(
23+
configuration = configurationFilter(),
24+
module = (_: ModuleID).name == "scala-library",
25+
artifact = artifactFilter(`type` = "jar")).headOption.getOrElse {
26+
sys.error(s"Could not fetch scala-library binary JAR")
27+
}
28+
29+
if (!target.exists()) {
30+
IO.createDirectory(target)
31+
}
32+
33+
(FileFunction.cached(cache / "fetch-scala-library-classes", FilesInfo.lastModified, FilesInfo.exists) { _ =>
34+
stream.log.info(s"Unpacking scala-library binaries to persistent directory: ${target.getAbsolutePath}")
35+
IO.unzip(scalaLibraryBinaryJar, target)
36+
(target ** "*.class").get.toSet
37+
} (Set(scalaLibraryBinaryJar)), target)
38+
39+
},
40+
(Compile / compile) := {
41+
val stream = streams.value
42+
val target = (Compile / classDirectory).value
43+
val (files, reference) = fetchScala2ClassFiles.value;
44+
val analysis = (Compile / compile).value
45+
stream.log.info(s"Copying files from Scala 2 Standard Library to $target")
46+
for (file <- files; id <- file.relativeTo(reference).map(_.toString())) {
47+
if (filesToCopy(id)) {
48+
stream.log.debug(s"Copying file '${id}' to ${target / id}")
49+
IO.copyFile(file, target / id)
50+
}
51+
}
52+
53+
val overwrittenBinaries = Files.walk((Compile / classDirectory).value.toPath())
54+
.iterator()
55+
.asScala
56+
.map(_.toFile)
57+
.map(_.relativeTo((Compile / classDirectory).value).get)
58+
.toSet
59+
val diff = files.filterNot(_.relativeTo(reference).exists(overwrittenBinaries))
60+
61+
IO.copy(diff.map { file =>
62+
file -> (Compile / classDirectory).value / file.relativeTo(reference).get.getPath
63+
})
64+
65+
analysis
66+
}
67+
)
68+
69+
private lazy val filesToCopy = Set(
70+
"scala/Tuple1.class",
71+
"scala/Tuple2.class",
72+
"scala/collection/DoubleStepper.class",
73+
"scala/collection/IntStepper.class",
74+
"scala/collection/LongStepper.class",
75+
"scala/collection/immutable/DoubleVectorStepper.class",
76+
"scala/collection/immutable/IntVectorStepper.class",
77+
"scala/collection/immutable/LongVectorStepper.class",
78+
"scala/jdk/DoubleAccumulator.class",
79+
"scala/jdk/IntAccumulator.class",
80+
"scala/jdk/LongAccumulator.class",
81+
"scala/jdk/FunctionWrappers$FromJavaDoubleBinaryOperator.class",
82+
"scala/jdk/FunctionWrappers$FromJavaBooleanSupplier.class",
83+
"scala/jdk/FunctionWrappers$FromJavaDoubleConsumer.class",
84+
"scala/jdk/FunctionWrappers$FromJavaDoublePredicate.class",
85+
"scala/jdk/FunctionWrappers$FromJavaDoubleSupplier.class",
86+
"scala/jdk/FunctionWrappers$FromJavaDoubleToIntFunction.class",
87+
"scala/jdk/FunctionWrappers$FromJavaDoubleToLongFunction.class",
88+
"scala/jdk/FunctionWrappers$FromJavaIntBinaryOperator.class",
89+
"scala/jdk/FunctionWrappers$FromJavaDoubleUnaryOperator.class",
90+
"scala/jdk/FunctionWrappers$FromJavaIntPredicate.class",
91+
"scala/jdk/FunctionWrappers$FromJavaIntConsumer.class",
92+
"scala/jdk/FunctionWrappers$FromJavaIntSupplier.class",
93+
"scala/jdk/FunctionWrappers$FromJavaIntToDoubleFunction.class",
94+
"scala/jdk/FunctionWrappers$FromJavaIntToLongFunction.class",
95+
"scala/jdk/FunctionWrappers$FromJavaIntUnaryOperator.class",
96+
"scala/jdk/FunctionWrappers$FromJavaLongBinaryOperator.class",
97+
"scala/jdk/FunctionWrappers$FromJavaLongConsumer.class",
98+
"scala/jdk/FunctionWrappers$FromJavaLongPredicate.class",
99+
"scala/jdk/FunctionWrappers$FromJavaLongSupplier.class",
100+
"scala/jdk/FunctionWrappers$FromJavaLongToDoubleFunction.class",
101+
"scala/jdk/FunctionWrappers$FromJavaLongToIntFunction.class",
102+
"scala/jdk/FunctionWrappers$FromJavaLongUnaryOperator.class",
103+
"scala/collection/ArrayOps$ReverseIterator.class",
104+
"scala/runtime/NonLocalReturnControl.class",
105+
)
106+
107+
}

0 commit comments

Comments
 (0)