From 7e7ee820df7647680d9aaf1ca991fe9718159097 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Wed, 24 Feb 2016 23:53:35 +0100 Subject: Add a `dotty-interfaces` package We introduce a new entry point for the compiler in `dotty.tools.dotc.Driver`: ``` def process(args: Array[String], simple: interfaces.SimpleReporter, callback: interfaces.CompilerCallback): interfaces.ReporterResult ``` Except for `args` which is just an array, the argument types and return type of this method are Java interfaces defined in a new package called `dotty-interfaces` which has a stable ABI. This means that you can programmatically run a compiler with a custom reporter and callbacks without having to recompile it against every version of dotty: you only need to have `dotty-interfaces` present at compile-time and call the `process` method using Java reflection. See `test/test/InterfaceEntryPointTest.scala` for a concrete example. This design is based on discussions with the IntelliJ IDEA Scala plugin team. Thanks to Nikolay Tropin for the discussions and his PR proposal (see #1011). --- project/Build.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'project') diff --git a/project/Build.scala b/project/Build.scala index 980c7ccb0..8b7238a09 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -35,7 +35,16 @@ object DottyBuild extends Build { ) } + lazy val `dotty-interfaces` = project.in(file("interfaces")). + settings( + // Do not append Scala versions to the generated artifacts + crossPaths := false, + // Do not depend on the Scala library + autoScalaLibrary := false + ) + lazy val dotty = project.in(file(".")). + dependsOn(`dotty-interfaces`). settings( // set sources to src/, tests to test/ and resources to resources/ scalaSource in Compile := baseDirectory.value / "src", @@ -105,7 +114,7 @@ object DottyBuild extends Build { parallelExecution in Test := false, // http://grokbase.com/t/gg/simple-build-tool/135ke5y90p/sbt-setting-jvm-boot-paramaters-for-scala - javaOptions <++= (managedClasspath in Runtime, packageBin in Compile) map { (attList, bin) => + javaOptions <++= (dependencyClasspath in Runtime, packageBin in Compile) map { (attList, bin) => // put the Scala {library, reflect} in the classpath val path = for { file <- attList.map(_.data) -- cgit v1.2.3