From d0b063a0cff04ef21b6651be48b790a30fd1b681 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 14 Aug 2018 18:34:27 +0900 Subject: [PATCH] Add version-specific source directories in the library And replace Tuple.scala with a Scala 2 implementation and a Scala 3 implementation. The Scala 2 implementaion of Tuple.scala is not strictly necessary but could be useful if non-version-specific library sources end up referencing scala.Tuple. --- .../dotty/tools/dotc/CompilationTests.scala | 5 +++- library/{src => src-scala2}/scala/Tuple.scala | 6 ++--- library/src-scala3/scala/Tuple.scala | 26 +++++++++++++++++++ project/Build.scala | 12 ++++++++- 4 files changed, 44 insertions(+), 5 deletions(-) rename library/{src => src-scala2}/scala/Tuple.scala (53%) create mode 100644 library/src-scala3/scala/Tuple.scala diff --git a/compiler/test/dotty/tools/dotc/CompilationTests.scala b/compiler/test/dotty/tools/dotc/CompilationTests.scala index 74773f407a25..43f94415eaf8 100644 --- a/compiler/test/dotty/tools/dotc/CompilationTests.scala +++ b/compiler/test/dotty/tools/dotc/CompilationTests.scala @@ -206,8 +206,11 @@ class CompilationTests extends ParallelTesting { Array("-Ycheck-reentrant", "-Yemit-tasty-in-class") ) + val libraryDirs = List(Paths.get("library/src"), Paths.get("library/src-scala3")) + val librarySources = libraryDirs.flatMap(d => sources(Files.walk(d))) + val lib = - compileDir("library/src", + compileList("src", librarySources, defaultOptions.and("-Ycheck-reentrant", "-strict", "-priorityclasspath", defaultOutputDir))(libGroup) val compilerDir = Paths.get("compiler/src") diff --git a/library/src/scala/Tuple.scala b/library/src-scala2/scala/Tuple.scala similarity index 53% rename from library/src/scala/Tuple.scala rename to library/src-scala2/scala/Tuple.scala index 1a36e841567e..febee0abd704 100644 --- a/library/src/scala/Tuple.scala +++ b/library/src-scala2/scala/Tuple.scala @@ -5,10 +5,10 @@ sealed trait Tuple extends Any @showAsInfix sealed class *:[+H, +T <: Tuple] extends Tuple { - @`rewrite` def head: H = ??? - @`rewrite` def tail: T = ??? + def head: H = ??? + def tail: T = ??? } object *: { - @`rewrite` def unapply[H, T <: Tuple](x: H *: T) = Some((x.head, x.tail)) + def unapply[H, T <: Tuple](x: H *: T) = Some((x.head, x.tail)) } diff --git a/library/src-scala3/scala/Tuple.scala b/library/src-scala3/scala/Tuple.scala new file mode 100644 index 000000000000..e53926ae4600 --- /dev/null +++ b/library/src-scala3/scala/Tuple.scala @@ -0,0 +1,26 @@ +package scala +import annotation.showAsInfix + +object typelevel { + erased def erasedValue[T]: T = ??? +} + +import typelevel._ + +sealed trait Tuple extends Any + +@showAsInfix +sealed class *:[+H, +T <: Tuple] extends Tuple { + rewrite def head: H = ??? + rewrite def tail: T = ??? + + rewrite private def _size(xs: Tuple): Int = //rewrite + xs match { + case _: Unit => 0 + case _: *:[_, xs1] => _size(erasedValue[xs1]) + 1 + } +} + +object *: { + rewrite def unapply[H, T <: Tuple](x: H *: T) = Some((x.head, x.tail)) +} diff --git a/project/Build.scala b/project/Build.scala index 0b9c74474762..8cbc47480b64 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -740,7 +740,17 @@ object Build { // Settings shared between dotty-library and dotty-library-bootstrapped lazy val dottyLibrarySettings = Seq( - libraryDependencies += "org.scala-lang" % "scala-library" % scalacVersion + libraryDependencies += "org.scala-lang" % "scala-library" % scalacVersion, + // Add version-specific source directories: + // - files in src-scala3 will only be compiled by dotty + // - files in src-scala2 will only be compiled by scalac + unmanagedSourceDirectories in Compile += { + val baseDir = baseDirectory.value + if (isDotty.value) + baseDir / "src-scala3" + else + baseDir / "src-scala2" + } ) lazy val `dotty-library` = project.in(file("library")).asDottyLibrary(NonBootstrapped)