Java/Scala compilation order support

This commit is contained in:
Mark Harrah 2011-04-03 21:15:35 -04:00
parent a5f3e1b839
commit a750c1563f
5 changed files with 32 additions and 26 deletions

View File

@ -2,9 +2,8 @@
* Copyright 2010 Mark Harrah
*/
package sbt
package inc
import java.io.File
import java.io.File
object CompileOrder extends Enumeration
{

View File

@ -12,6 +12,7 @@ import inc._
import xsbti.api.Source
import xsbti.AnalysisCallback
import CompileSetup._
import CompileOrder.{JavaThenScala, Mixed, ScalaThenJava}
import sbinary.DefaultProtocol.{ immutableMapFormat, immutableSetFormat, StringFormat }
final class CompileConfiguration(val sources: Seq[File], val classpath: Seq[File],
@ -20,9 +21,9 @@ final class CompileConfiguration(val sources: Seq[File], val classpath: Seq[File
class AggressiveCompile(cacheDirectory: File)
{
def apply(compiler: AnalyzingCompiler, javac: JavaCompiler, sources: Seq[File], classpath: Seq[File], outputDirectory: File, options: Seq[String] = Nil, javacOptions: Seq[String] = Nil, analysisMap: Map[File, Analysis] = Map.empty, maxErrors: Int = 100)(implicit log: Logger): Analysis =
def apply(compiler: AnalyzingCompiler, javac: JavaCompiler, sources: Seq[File], classpath: Seq[File], outputDirectory: File, options: Seq[String] = Nil, javacOptions: Seq[String] = Nil, analysisMap: Map[File, Analysis] = Map.empty, maxErrors: Int = 100, compileOrder: CompileOrder.Value = Mixed)(implicit log: Logger): Analysis =
{
val setup = new CompileSetup(outputDirectory, new CompileOptions(options, javacOptions), compiler.scalaInstance.actualVersion, CompileOrder.Mixed)
val setup = new CompileSetup(outputDirectory, new CompileOptions(options, javacOptions), compiler.scalaInstance.actualVersion, compileOrder)
compile1(sources, classpath, setup, store, analysisMap, compiler, javac, maxErrors)
}
@ -57,20 +58,24 @@ class AggressiveCompile(cacheDirectory: File)
val incSrc = sources.filter(include)
val (javaSrcs, scalaSrcs) = incSrc partition javaOnly
println("Compiling:\n\t" + incSrc.mkString("\n\t"))
if(!scalaSrcs.isEmpty)
{
val arguments = cArgs(incSrc, absClasspath, outputDirectory, options.options)
compiler.compile(arguments, callback, maxErrors, log)
}
if(!javaSrcs.isEmpty)
{
import Path._
val loader = ClasspathUtilities.toLoader(absClasspath, compiler.scalaInstance.loader)
def readAPI(source: File, classes: Seq[Class[_]]) { callback.api(source, ClassToAPI(classes)) }
Analyze(outputDirectory, javaSrcs, log)(callback, loader, readAPI) {
javac(javaSrcs, absClasspath, outputDirectory, options.javacOptions)
def compileScala() =
if(!scalaSrcs.isEmpty)
{
val sources = if(order == Mixed) incSrc else scalaSrcs
val arguments = cArgs(sources, absClasspath, outputDirectory, options.options)
compiler.compile(arguments, callback, maxErrors, log)
}
}
def compileJava() =
if(!javaSrcs.isEmpty)
{
import Path._
val loader = ClasspathUtilities.toLoader(absClasspath, compiler.scalaInstance.loader)
def readAPI(source: File, classes: Seq[Class[_]]) { callback.api(source, ClassToAPI(classes)) }
Analyze(outputDirectory, javaSrcs, log)(callback, loader, readAPI) {
javac(javaSrcs, absClasspath, outputDirectory, options.javacOptions)
}
}
if(order == ScalaThenJava) { compileScala(); compileJava() } else { compileJava(); compileScala() }
}
val sourcesSet = sources.toSet

View File

@ -23,22 +23,22 @@ object Compiler
}
final class Inputs(val compilers: Compilers, val config: Options, val incSetup: IncSetup)
final class Options(val classpath: Seq[File], val sources: Seq[File], val classesDirectory: File, val options: Seq[String], val javacOptions: Seq[String], val maxErrors: Int)
final class Options(val classpath: Seq[File], val sources: Seq[File], val classesDirectory: File, val options: Seq[String], val javacOptions: Seq[String], val maxErrors: Int, val order: CompileOrder.Value)
final class IncSetup(val analysisMap: Map[File, Analysis], val cacheDirectory: File)
final class Compilers(val scalac: AnalyzingCompiler, val javac: JavaCompiler)
def inputs(classpath: Seq[File], sources: Seq[File], outputDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int)(implicit compilers: Compilers, log: Logger): Inputs =
def inputs(classpath: Seq[File], sources: Seq[File], outputDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder.Value)(implicit compilers: Compilers, log: Logger): Inputs =
{
import Path._
val classesDirectory = outputDirectory / "classes"
val cacheDirectory = outputDirectory / "cache"
val augClasspath = classesDirectory.asFile +: classpath
inputs(augClasspath, sources, classesDirectory, options, javacOptions, Map.empty, cacheDirectory, maxErrors)
inputs(augClasspath, sources, classesDirectory, options, javacOptions, Map.empty, cacheDirectory, maxErrors, order)
}
def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], analysisMap: Map[File, Analysis], cacheDirectory: File, maxErrors: Int)(implicit compilers: Compilers, log: Logger): Inputs =
def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], analysisMap: Map[File, Analysis], cacheDirectory: File, maxErrors: Int, order: CompileOrder.Value)(implicit compilers: Compilers, log: Logger): Inputs =
new Inputs(
compilers,
new Options(classpath, sources, classesDirectory, options, javacOptions, maxErrors),
new Options(classpath, sources, classesDirectory, options, javacOptions, maxErrors, order),
new IncSetup(analysisMap, cacheDirectory)
)
@ -98,6 +98,6 @@ object Compiler
import in.incSetup._
val agg = new AggressiveCompile(cacheDirectory)
agg(scalac, javac, sources, classpath, classesDirectory, options, javacOptions, analysisMap, maxErrors)(log)
agg(scalac, javac, sources, classpath, classesDirectory, options, javacOptions, analysisMap, maxErrors, order)(log)
}
}

View File

@ -119,6 +119,7 @@ object Defaults
def compileBase = Seq(
classpathOptions in GlobalScope :== ClasspathOptions.auto,
compileOrder in GlobalScope :== CompileOrder.Mixed,
compilers <<= (scalaInstance, appConfiguration, streams, classpathOptions, javaHome) map { (si, app, s, co, jh) => Compiler.compilers(si, co, jh)(app, s.log) },
javacOptions in GlobalScope :== Nil,
scalacOptions in GlobalScope :== Nil,
@ -327,12 +328,12 @@ object Defaults
def compileTask = (compileInputs, streams) map { (i,s) => Compiler(i,s.log) }
def compileInputsTask =
(dependencyClasspath, sources, compilers, javacOptions, scalacOptions, cacheDirectory, classDirectory, streams) map {
(cp, srcs, cs, javacOpts, scalacOpts, cacheDir, classes, s) =>
(dependencyClasspath, sources, compilers, javacOptions, scalacOptions, cacheDirectory, classDirectory, compileOrder, streams) map {
(cp, srcs, cs, javacOpts, scalacOpts, cacheDir, classes, order, s) =>
val classpath = classes +: data(cp)
val analysis = analysisMap(cp)
val cache = cacheDir / "compile"
Compiler.inputs(classpath, srcs, classes, scalacOpts, javacOpts, analysis, cache, 100)(cs, s.log)
Compiler.inputs(classpath, srcs, classes, scalacOpts, javacOpts, analysis, cache, 100, order)(cs, s.log)
}
def writePluginsDescriptor(plugins: Set[String], dir: File): List[File] =

View File

@ -68,6 +68,7 @@ object Keys
val scaladocOptions = SettingKey[Seq[String]]("scaladoc-options")
val scalacOptions = SettingKey[Seq[String]]("scalac-options")
val javacOptions = SettingKey[Seq[String]]("javac-options")
val compileOrder = SettingKey[CompileOrder.Value]("compile-order")
val initialCommands = SettingKey[String]("initial-commands")
val compileInputs = TaskKey[Compiler.Inputs]("compile-inputs")
val scalaHome = SettingKey[Option[File]]("scala-home")