diff options
18 files changed, 194 insertions, 146 deletions
diff --git a/.drone.yml b/.drone.yml index 0b927794e..16a5aff49 100644 --- a/.drone.yml +++ b/.drone.yml @@ -5,10 +5,11 @@ pipeline: commands: - ln -s /var/cache/drone/scala-scala scala-scala - ./scripts/update-scala-library - - sbt -Ddotty.drone.mem=4096m -ivy /var/cache/drone/ivy2 "${TEST}" + - sbt -J-Xmx4096m -J-XX:ReservedCodeCacheSize=512m -J-XX:MaxMetaspaceSize=1024m -Ddotty.drone.mem=4096m -ivy /var/cache/drone/ivy2 "${TEST}" matrix: TEST: - test + - ;publishLocal;dotty-bootstrapped/test - partest-only-no-bootstrap --show-diff --verbose - partest-only --show-diff --verbose diff --git a/compiler/src/dotty/tools/dotc/config/JavaPlatform.scala b/compiler/src/dotty/tools/dotc/config/JavaPlatform.scala index b5bfbb39f..59201687a 100644 --- a/compiler/src/dotty/tools/dotc/config/JavaPlatform.scala +++ b/compiler/src/dotty/tools/dotc/config/JavaPlatform.scala @@ -17,8 +17,6 @@ class JavaPlatform extends Platform { if (currentClassPath.isEmpty) currentClassPath = Some(new PathResolver().result) val cp = currentClassPath.get - //println(cp) - //println("------------------") cp } diff --git a/compiler/src/dotty/tools/dotc/config/PathResolver.scala b/compiler/src/dotty/tools/dotc/config/PathResolver.scala index 8df9a8c0e..184b3718a 100644 --- a/compiler/src/dotty/tools/dotc/config/PathResolver.scala +++ b/compiler/src/dotty/tools/dotc/config/PathResolver.scala @@ -255,14 +255,7 @@ class PathResolver(implicit ctx: Context) { def containers = Calculated.containers lazy val result: JavaClassPath = { - // Prioritize `dotty.jar` and `dotty-lib.jar` to shadow others - val (dottyJars, others) = - containers.partition(x => x.name.contains("dotty-lib.jar") || x.name.contains("dotty.jar")) - // Then any jars with `dotty` in the name - putting them before scala-library - val (dottyCp, remaining) = - others.partition(_.name.contains("dotty-")) - - val cp = new JavaClassPath((dottyJars ++ dottyCp ++ remaining).toIndexedSeq, context) + val cp = new JavaClassPath(containers.toIndexedSeq, context) if (settings.Ylogcp.value) { Console.println("Classpath built from " + settings.toConciseString(ctx.sstate)) diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index 134b31519..0aeb28d36 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -319,7 +319,17 @@ class Definitions { def staticsMethodRef(name: PreName) = ScalaStaticsModule.requiredMethodRef(name) def staticsMethod(name: PreName) = ScalaStaticsModule.requiredMethod(name) - lazy val DottyPredefModuleRef = ctx.requiredModuleRef("dotty.DottyPredef") + // Dotty deviation: we cannot use a lazy val here because lazy vals in dotty + // will return "null" when called recursively, see #1856. + def DottyPredefModuleRef = { + if (myDottyPredefModuleRef == null) { + myDottyPredefModuleRef = ctx.requiredModuleRef("dotty.DottyPredef") + assert(myDottyPredefModuleRef != null) + } + myDottyPredefModuleRef + } + private[this] var myDottyPredefModuleRef: TermRef = _ + def DottyPredefModule(implicit ctx: Context) = DottyPredefModuleRef.symbol def Predef_eqAny(implicit ctx: Context) = DottyPredefModule.requiredMethod(nme.eqAny) diff --git a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala index aaae78c57..a3475e14c 100644 --- a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala @@ -45,9 +45,13 @@ trait SymDenotations { this: Context => else { val initial = denot.initial val firstPhaseId = initial.validFor.firstPhaseId.max(ctx.typerPhase.id) - if ((initial ne denot) || ctx.phaseId != firstPhaseId) - ctx.withPhase(firstPhaseId).stillValidInOwner(initial) - else + if ((initial ne denot) || ctx.phaseId != firstPhaseId) { + ctx.withPhase(firstPhaseId).stillValidInOwner(initial) || + // Workaround #1895: A symbol might not be entered into an owner + // until the second phase where it exists + (denot.validFor.containsPhaseId(firstPhaseId + 1)) && + ctx.withPhase(firstPhaseId + 1).stillValidInOwner(initial) + } else stillValidInOwner(denot) } diff --git a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala index 101be167e..b75169792 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala @@ -567,7 +567,8 @@ object Scanners { nextChar() getOperatorRest() } else { - error(f"illegal character '\\u${ch: Int}%04x'") + // FIXME: Dotty deviation: f"" interpolator is not supported (#1814) + error("illegal character '\\u%04x'".format(ch: Int)) nextChar() } } diff --git a/compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala b/compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala index fefa63f6f..c392880c5 100644 --- a/compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala +++ b/compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala @@ -175,7 +175,7 @@ private class ExtractDependenciesCollector(implicit val ctx: Context) extends tp override def traverse(tree: Tree)(implicit ctx: Context): Unit = { tree match { case Import(expr, selectors) => - def lookupImported(name: Name) = expr.tpe.member(name).symbol + def lookupImported(name: Name) = expr.tpe.select(name).typeSymbol def addImported(name: Name) = { // importing a name means importing both a term and a type (if they exist) addDependency(lookupImported(name.toTermName)) diff --git a/compiler/src/dotty/tools/dotc/transform/ElimByName.scala b/compiler/src/dotty/tools/dotc/transform/ElimByName.scala index 2814baf1e..0e187fc2e 100644 --- a/compiler/src/dotty/tools/dotc/transform/ElimByName.scala +++ b/compiler/src/dotty/tools/dotc/transform/ElimByName.scala @@ -81,7 +81,11 @@ class ElimByName extends MiniPhaseTransform with InfoTransformer { thisTransform val inSuper = if (ctx.mode.is(Mode.InSuperCall)) InSuperCall else EmptyFlags val meth = ctx.newSymbol( ctx.owner, nme.ANON_FUN, Synthetic | Method | inSuper, MethodType(Nil, Nil, argType)) - Closure(meth, _ => arg.changeOwner(ctx.owner, meth)) + Closure(meth, _ => + atGroupEnd { implicit ctx: Context => + arg.changeOwner(ctx.owner, meth) + } + ) } ref(defn.dummyApply).appliedToType(argType).appliedTo(argFun) case _ => diff --git a/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala b/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala index 925ec08b2..64474cecd 100644 --- a/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala +++ b/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala @@ -63,8 +63,13 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful // not generate them again. if (!(valueClass is Scala2x)) ctx.atPhase(thisTransformer) { implicit ctx => for (decl <- valueClass.classInfo.decls) { - if (isMethodWithExtension(decl)) - decls1.enter(createExtensionMethod(decl, moduleClassSym.symbol)) + if (isMethodWithExtension(decl)) { + val meth = createExtensionMethod(decl, moduleClassSym.symbol) + decls1.enter(meth) + // Workaround #1895: force denotation of `meth` to be + // at phase where `meth` is entered into the decls of a class + meth.denot(ctx.withPhase(thisTransformer.next)) + } } } diff --git a/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala b/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala index a5657890e..f7efb2ac2 100644 --- a/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala +++ b/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala @@ -30,7 +30,16 @@ object ImportInfo { class ImportInfo(symf: => Symbol, val selectors: List[untpd.Tree], symNameOpt: Option[TermName], val isRootImport: Boolean = false)(implicit ctx: Context) { - lazy val sym = symf + // Dotty deviation: we cannot use a lazy val here for the same reason + // that we cannot use one for `DottyPredefModuleRef`. + def sym = { + if (mySym == null) { + mySym = symf + assert(mySym != null) + } + mySym + } + private[this] var mySym: Symbol = _ /** The (TermRef) type of the qualifier of the import clause */ def site(implicit ctx: Context): Type = { diff --git a/compiler/test/dotc/build.scala b/compiler/test/dotc/build.scala deleted file mode 100644 index b1c8db7c7..000000000 --- a/compiler/test/dotc/build.scala +++ /dev/null @@ -1,40 +0,0 @@ -package dotc - -import java.io.File - -object build extends tests { - - private def deleteFilesInFolder(folder: File, deleteFolder: Boolean = false): Unit = { - val files = folder.listFiles() - if(files != null) { //some JVMs return null for empty dirs - for(f <- files) { - if(f.isDirectory) { - deleteFilesInFolder(f, deleteFolder = true) - } else { - f.delete() - } - } - } - if(deleteFolder) folder.delete() - } - - def clearOutput() = { - deleteFilesInFolder(new File(defaultOutputDir)) // clear previous output - val keepFile = new File(defaultOutputDir + ".keep") - keepFile.createNewFile() - } - - def main(args: Array[String]): Unit = { - println("---------- Building bootstrapped dotty-lib ----------------------------------------------") - clearOutput() - dottyBootedLib - val p1 = Runtime.getRuntime.exec(Array("jar", "cf", "dotty-lib.jar", "-C", "out", ".")) - p1.waitFor() - - println("---------- Building bootstrapped dotty depending on dotty-lib compiled by dotty ----------") - clearOutput() - dottyDependsOnBootedLib - val p2 = Runtime.getRuntime.exec(Array("jar", "cf", "dotty.jar", "-C", "out", ".")) - p2.waitFor() - } -} diff --git a/compiler/test/dotc/tests.scala b/compiler/test/dotc/tests.scala index 608132bca..6ef6bb741 100644 --- a/compiler/test/dotc/tests.scala +++ b/compiler/test/dotc/tests.scala @@ -61,7 +61,7 @@ class tests extends CompilerTest { List("-classpath", paths) } - implicit val defaultOptions = noCheckOptions ++ { + implicit val defaultOptions: List[String] = noCheckOptions ++ { if (isRunByJenkins) List("-Ycheck:tailrec,resolveSuper,mixin,restoreScopes,labelDef") // should be Ycheck:all, but #725 else List("-Ycheck:tailrec,resolveSuper,mixin,restoreScopes,labelDef") } ++ checkOptions ++ classPath diff --git a/compiler/test/dotty/Jars.scala b/compiler/test/dotty/Jars.scala index 6fc9b0fde..f062f8b25 100644 --- a/compiler/test/dotty/Jars.scala +++ b/compiler/test/dotty/Jars.scala @@ -1,20 +1,18 @@ package dotty -/** Jars used when compiling test, defaults to sbt locations */ +/** Jars used when compiling test, normally set from the sbt build */ object Jars { - val dottyLib: String = sys.env.get("DOTTY_LIB") getOrElse { - "../library/target/scala-2.11/dotty-library_2.11-0.1.1-SNAPSHOT.jar" - } + val dottyLib: String = sys.env.get("DOTTY_LIB") + .getOrElse(sys.props("dotty.tests.classes.library")) - val dottyCompiler: String = sys.env.get("DOTTY_COMPILER") getOrElse { - "./target/scala-2.11/dotty-compiler_2.11-0.1.1-SNAPSHOT.jar" - } + val dottyCompiler: String = sys.env.get("DOTTY_COMPILER") + .getOrElse(sys.props("dotty.tests.classes.compiler")) - val dottyInterfaces: String = sys.env.get("DOTTY_INTERFACE") getOrElse { - "../interfaces/target/dotty-interfaces-0.1.1-SNAPSHOT.jar" - } + val dottyInterfaces: String = sys.env.get("DOTTY_INTERFACE") + .getOrElse(sys.props("dotty.tests.classes.interfaces")) - val dottyExtras: List[String] = sys.env.get("DOTTY_EXTRAS") + val dottyExtras: List[String] = Option(sys.env.get("DOTTY_EXTRAS") + .getOrElse(sys.props("dotty.tests.extraclasspath"))) .map(_.split(":").toList).getOrElse(Nil) val dottyReplDeps: List[String] = dottyLib :: dottyExtras diff --git a/compiler/test/dotty/partest/DPConsoleRunner.scala b/compiler/test/dotty/partest/DPConsoleRunner.scala index f418d2c37..7a25af6b7 100644 --- a/compiler/test/dotty/partest/DPConsoleRunner.scala +++ b/compiler/test/dotty/partest/DPConsoleRunner.scala @@ -202,7 +202,7 @@ class DPTestRunner(testFile: File, suiteRunner: DPSuiteRunner) extends nest.Runn import FileManager.joinPaths // compile using command-line javac compiler val args = Seq( - javacCmdPath, + suiteRunner.javacCmdPath, // FIXME: Dotty deviation just writing "javacCmdPath" doesn't work "-d", outDir.getAbsolutePath, "-classpath", @@ -300,11 +300,11 @@ class DPTestRunner(testFile: File, suiteRunner: DPSuiteRunner) extends nest.Runn // Don't get confused, the neg test passes when compilation fails for at // least one round (optionally checking the number of compiler errors and // compiler console output) - case class CompFailed() extends NegTestState + case object CompFailed extends NegTestState // the neg test fails when all rounds return either of these: case class CompFailedButWrongNErr(expected: String, found: String) extends NegTestState - case class CompFailedButWrongDiff() extends NegTestState - case class CompSucceeded() extends NegTestState + case object CompFailedButWrongDiff extends NegTestState + case object CompSucceeded extends NegTestState def nerrIsOk(reason: String) = { val nerrFinder = """compilation failed with (\d+) errors""".r @@ -350,7 +350,7 @@ class DPTestRunner(testFile: File, suiteRunner: DPSuiteRunner) extends nest.Runn if (existsNerr) false else { val existsDiff = failureStates.exists({ - case CompFailedButWrongDiff() => + case CompFailedButWrongDiff => nextTestActionFailing(s"output differs") true case _ => @@ -398,8 +398,13 @@ class DPTestRunner(testFile: File, suiteRunner: DPSuiteRunner) extends nest.Runn override def extraClasspath = suiteRunner.fileManager.asInstanceOf[DottyFileManager].extraJarList ::: super.extraClasspath + + // FIXME: Dotty deviation: error if return type is omitted: + // overriding method cleanup in class Runner of type ()Unit; + // method cleanup of type => Boolean | Unit has incompatible type + // override to keep class files if failed and delete clog if ok - override def cleanup = if (lastState.isOk) { + override def cleanup: Unit = if (lastState.isOk) { logFile.delete cLogFile.delete Directory(outDir).deleteRecursively diff --git a/compiler/test/dotty/tools/dotc/parsing/ModifiersParsingTest.scala b/compiler/test/dotty/tools/dotc/parsing/ModifiersParsingTest.scala index 32f842e92..806e1af46 100644 --- a/compiler/test/dotty/tools/dotc/parsing/ModifiersParsingTest.scala +++ b/compiler/test/dotty/tools/dotc/parsing/ModifiersParsingTest.scala @@ -10,11 +10,11 @@ import ast.untpd._ import ast.{ Trees => d } import Parsers.Parser import util.SourceFile -import core.Contexts.ContextBase +import core.Contexts._ import core.Flags object ModifiersParsingTest { - implicit val ctx = (new ContextBase).initialCtx + implicit val ctx: Context = (new ContextBase).initialCtx implicit def parse(code: String): Tree = { val (_, stats) = new Parser(new SourceFile("<meta>", code.toCharArray)).templateStatSeq() diff --git a/library/test/dotty/ShowTests.scala b/library/test/dotty/ShowTests.scala index 7230106d5..b050ad3ee 100644 --- a/library/test/dotty/ShowTests.scala +++ b/library/test/dotty/ShowTests.scala @@ -35,13 +35,13 @@ class ShowTests { @Test def showCar = { case class Car(model: String, manufacturer: String, year: Int) - implicit val showCar = new Show[Car] { + implicit val showCar: Show[Car] = new Show[Car] { def show(c: Car) = "Car(" + c.model.show + ", " + c.manufacturer.show + ", " + c.year.show + ")" } case class Shop(xs: List[Car], name: String) - implicit val showShop = new Show[Shop] { + implicit val showShop: Show[Shop] = new Show[Shop] { def show(sh: Shop) = "Shop(" + sh.xs.show + ", " + sh.name.show + ")" } diff --git a/project/Build.scala b/project/Build.scala index af862817c..778492624 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -11,8 +11,17 @@ import sbt.Package.ManifestAttributes object DottyBuild extends Build { - val baseVersion = "0.1.1" - val isNightly = sys.env.get("NIGHTLYBUILD") == Some("yes") + val scalacVersion = "2.11.5" + + val dottyOrganization = "ch.epfl.lamp" + val dottyVersion = { + val baseVersion = "0.1.1" + val isNightly = sys.env.get("NIGHTLYBUILD") == Some("yes") + if (isNightly) + baseVersion + "-" + VersionUtil.commitDate + "-" + VersionUtil.gitHash + "-NIGHTLY" + else + baseVersion + "-SNAPSHOT" + } val jenkinsMemLimit = List("-Xmx1500m") @@ -45,14 +54,9 @@ object DottyBuild extends Build { override def settings: Seq[Setting[_]] = { super.settings ++ Seq( - scalaVersion in Global := "2.11.5", - version in Global := { - if (isNightly) - baseVersion + "-" + VersionUtil.commitDate + "-" + VersionUtil.gitHash + "-NIGHTLY" - else - baseVersion + "-SNAPSHOT" - }, - organization in Global := "ch.epfl.lamp", + scalaVersion in Global := scalacVersion, + version in Global := dottyVersion, + organization in Global := dottyOrganization, organizationName in Global := "LAMP/EPFL", organizationHomepage in Global := Some(url("http://lamp.epfl.ch")), homepage in Global := Some(url("https://github.com/lampepfl/dotty")), @@ -82,6 +86,17 @@ object DottyBuild extends Build { resourceDirectory in Compile := baseDirectory.value / "resources" ) + // Settings used by all dotty-compiled projects + lazy val commonBootstrappedSettings = Seq( + scalaOrganization := dottyOrganization, + scalaVersion := dottyVersion, + scalaBinaryVersion := "2.11", + scalaCompilerBridgeSource := + (dottyOrganization % "dotty-sbt-bridge" % scalaVersion.value % "component").sources(), + + // sbt gets very unhappy if two projects use the same target + target := baseDirectory.value / ".." / "out" / name.value + ) /** Projects -------------------------------------------------------------- */ @@ -104,23 +119,20 @@ object DottyBuild extends Build { addCommandAlias("run", "dotty-compiler/run") ++ addCommandAlias( "partest", - ";packageAll" + - ";dotty-compiler/test:runMain dotc.build" + - ";dotty-compiler/lockPartestFile" + - ";dotty-compiler/test:test" + - ";dotty-compiler/runPartestRunner" + ";publishLocal" + // Non-bootstrapped dotty needs to be published first + ";dotty-compiler-bootstrapped/lockPartestFile" + + ";dotty-compiler-bootstrapped/test:test" + + ";dotty-compiler-bootstrapped/runPartestRunner" ) ++ addCommandAlias( "partest-only", - ";packageAll" + - ";dotty-compiler/test:runMain dotc.build" + - ";dotty-compiler/lockPartestFile" + - ";dotty-compiler/test:test-only dotc.tests" + - ";dotty-compiler/runPartestRunner" + ";publishLocal" + // Non-bootstrapped dotty needs to be published first + ";dotty-compiler-bootstrapped/lockPartestFile" + + ";dotty-compiler-bootstrapped/test:test-only dotc.tests" + + ";dotty-compiler-bootstrapped/runPartestRunner" ) ++ addCommandAlias( "partest-only-no-bootstrap", - ";packageAll" + ";dotty-compiler/lockPartestFile" + ";dotty-compiler/test:test-only dotc.tests" + ";dotty-compiler/runPartestRunner" @@ -128,6 +140,12 @@ object DottyBuild extends Build { ). settings(publishing) + // Meta project aggregating all bootstrapped projects + lazy val `dotty-bootstrapped` = project. + aggregate(`dotty-library-bootstrapped`, `dotty-compiler-bootstrapped`). + settings( + publishArtifact := false + ) lazy val `dotty-interfaces` = project.in(file("interfaces")). settings(sourceStructure). @@ -141,25 +159,8 @@ object DottyBuild extends Build { ). settings(publishing) - lazy val `dotty-compiler` = project.in(file("compiler")). - dependsOn(`dotty-interfaces`). - dependsOn(`dotty-library`). - settings(sourceStructure). - settings( - overrideScalaVersionSetting, - - // Disable scaladoc generation, it's way too slow and we'll replace it - // by dottydoc anyway. We still publish an empty -javadoc.jar to make - // sonatype happy. - sources in (Compile, doc) := Seq(), - - // necessary evil: dottydoc currently needs to be included in the dotty - // project, for sbt integration - unmanagedSourceDirectories in Compile := Seq((scalaSource in Compile).value), - unmanagedSourceDirectories in Compile += baseDirectory.value / ".." / "doc-tool" / "src", - unmanagedSourceDirectories in Test := Seq((scalaSource in Test).value), - unmanagedSourceDirectories in Test += baseDirectory.value / ".." / "doc-tool" / "test", - + // Settings shared between dotty-compiler and dotty-compiler-bootstrapped + lazy val dottyCompilerSettings = Seq( // set system in/out for repl connectInput in run := true, outputStrategy := Some(StdoutOutput), @@ -178,28 +179,18 @@ object DottyBuild extends Build { // get libraries onboard partestDeps := Seq(scalaCompiler, - "org.scala-lang" % "scala-reflect" % scalaVersion.value, - "org.scala-lang" % "scala-library" % scalaVersion.value % "test"), + "org.scala-lang" % "scala-reflect" % scalacVersion, + "org.scala-lang" % "scala-library" % scalacVersion % "test"), libraryDependencies ++= partestDeps.value, libraryDependencies ++= Seq("org.scala-lang.modules" %% "scala-xml" % "1.0.1", "org.scala-lang.modules" %% "scala-partest" % "1.0.11" % "test", - "ch.epfl.lamp" % "dottydoc-client" % "0.1.0", + dottyOrganization % "dottydoc-client" % "0.1.0", "com.novocode" % "junit-interface" % "0.11" % "test", "com.github.spullara.mustache.java" % "compiler" % "0.9.3", "com.typesafe.sbt" % "sbt-interface" % sbtVersion.value), // enable improved incremental compilation algorithm incOptions := incOptions.value.withNameHashing(true), - // packageAll packages all and then returns a map with the abs location - packageAll := { - Map( - "dotty-interfaces" -> (packageBin in (`dotty-interfaces`, Compile)).value, - "dotty-compiler" -> (packageBin in Compile).value, - "dotty-library" -> (packageBin in (`dotty-library`, Compile)).value, - "dotty-compiler-test" -> (packageBin in Test).value - ) map { case (k, v) => (k, v.getAbsolutePath) } - }, - // For convenience, change the baseDirectory when running the compiler baseDirectory in (Compile, run) := baseDirectory.value / "..", // .. but not when running partest @@ -274,8 +265,8 @@ object DottyBuild extends Build { val args = Def.spaceDelimited("<arg>").parsed val jars = List( (packageBin in Compile).value.getAbsolutePath, - (packageBin in (`dotty-library`, Compile)).value.getAbsolutePath, - (packageBin in (`dotty-interfaces`, Compile)).value.getAbsolutePath + packageAll.value("dotty-library"), + packageAll.value("dotty-interfaces") ) ++ getJarPaths(partestDeps.value, ivyPaths.value.ivyHome) val dottyJars = s"""-dottyJars ${jars.length + 2} dotty.jar dotty-lib.jar ${jars.mkString(" ")}""" @@ -326,7 +317,7 @@ object DottyBuild extends Build { // http://grokbase.com/t/gg/simple-build-tool/135ke5y90p/sbt-setting-jvm-boot-paramaters-for-scala // packageAll should always be run before tests - javaOptions <++= (dependencyClasspath in Runtime, packageAll) map { (attList, _) => + javaOptions <++= (dependencyClasspath in Runtime, packageAll) map { (attList, pA) => // put needed dependencies on classpath: val path = for { file <- attList.map(_.data) @@ -356,11 +347,67 @@ object DottyBuild extends Build { List("-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1") else List() - ("-DpartestParentID=" + pid) :: tuning ::: agentOptions ::: ci_build ::: path.toList + val jars = List( + "-Ddotty.tests.classes.interfaces=" + pA("dotty-interfaces"), + "-Ddotty.tests.classes.library=" + pA("dotty-library"), + "-Ddotty.tests.classes.compiler=" + pA("dotty-compiler") + ) + + ("-DpartestParentID=" + pid) :: jars ::: tuning ::: agentOptions ::: ci_build ::: path.toList + } + ) + + lazy val `dotty-compiler` = project.in(file("compiler")). + dependsOn(`dotty-interfaces`). + dependsOn(`dotty-library`). + settings(sourceStructure). + settings(dottyCompilerSettings). + settings( + overrideScalaVersionSetting, + + // necessary evil: dottydoc currently needs to be included in the dotty + // project, for sbt integration + // FIXME: note part of dottyCompilerSettings because the doc-tool does not + // compile with dotty + unmanagedSourceDirectories in Compile := Seq((scalaSource in Compile).value), + unmanagedSourceDirectories in Compile += baseDirectory.value / ".." / "doc-tool" / "src", + unmanagedSourceDirectories in Test := Seq((scalaSource in Test).value), + unmanagedSourceDirectories in Test += baseDirectory.value / ".." / "doc-tool" / "test", + + // Disable scaladoc generation, it's way too slow and we'll replace it + // by dottydoc anyway. We still publish an empty -javadoc.jar to make + // sonatype happy. + sources in (Compile, doc) := Seq(), + + // packageAll packages all and then returns a map with the abs location + packageAll := { + Map( + "dotty-interfaces" -> (packageBin in (`dotty-interfaces`, Compile)).value, + "dotty-compiler" -> (packageBin in Compile).value, + "dotty-library" -> (packageBin in (`dotty-library`, Compile)).value, + "dotty-compiler-test" -> (packageBin in Test).value + ) map { case (k, v) => (k, v.getAbsolutePath) } } ). settings(publishing) + lazy val `dotty-compiler-bootstrapped` = project.in(file("compiler")). + dependsOn(`dotty-library-bootstrapped`). + settings(sourceStructure). + settings(commonBootstrappedSettings). + settings(dottyCompilerSettings). + settings( + // Used instead of "dependsOn(`dotty-interfaces`)" because the latter breaks sbt somehow + libraryDependencies += scalaOrganization.value % "dotty-interfaces" % version.value, + + packageAll := { + (packageAll in `dotty-compiler`).value ++ Seq( + ("dotty-compiler" -> (packageBin in Compile).value.getAbsolutePath), + ("dotty-library" -> (packageBin in (`dotty-library-bootstrapped`, Compile)).value.getAbsolutePath) + ) + } + ) + /* Contains unit tests for the scripts */ lazy val `dotty-bin-tests` = project.in(file("bin")). settings(sourceStructure). @@ -371,17 +418,25 @@ object DottyBuild extends Build { "com.novocode" % "junit-interface" % "0.11" % "test" ) - lazy val `dotty-library` = project.in(file("library")). - settings(sourceStructure). - settings( + // Settings shared between dotty-library and dotty-library-bootstrapped + lazy val dottyLibrarySettings = Seq( libraryDependencies ++= Seq( - "org.scala-lang" % "scala-reflect" % scalaVersion.value, - "org.scala-lang" % "scala-library" % scalaVersion.value, + "org.scala-lang" % "scala-reflect" % scalacVersion, + "org.scala-lang" % "scala-library" % scalacVersion, "com.novocode" % "junit-interface" % "0.11" % "test" ) - ). + ) + + lazy val `dotty-library` = project.in(file("library")). + settings(sourceStructure). + settings(dottyLibrarySettings). settings(publishing) + lazy val `dotty-library-bootstrapped` = project.in(file("library")). + settings(sourceStructure). + settings(commonBootstrappedSettings). + settings(dottyLibrarySettings) + // until sbt/sbt#2402 is fixed (https://github.com/sbt/sbt/issues/2402) lazy val cleanSbtBridge = TaskKey[Unit]("cleanSbtBridge", "delete dotty-sbt-bridge cache") diff --git a/tests/repl/vc.check b/tests/repl/vc.check new file mode 100644 index 000000000..e2c9b65fd --- /dev/null +++ b/tests/repl/vc.check @@ -0,0 +1,5 @@ +scala> class Foo(x: Int) extends AnyVal { def hi: Int = 1 } +defined class Foo +scala> new Foo(1).hi +val res0: Int = 1 +scala> :quit |