sbt/main/actions/Compiler.scala

82 lines
3.8 KiB
Scala
Raw Normal View History

2010-09-04 14:46:36 +02:00
/* sbt -- Simple Build Tool
* Copyright 2010 Mark Harrah
*/
package sbt
import xsbti.{Logger => _,_}
import xsbti.compile.{CompileOrder,GlobalsCache}
2012-01-09 14:00:35 +01:00
import CompileOrder.{JavaThenScala, Mixed, ScalaThenJava}
2011-03-02 12:46:28 +01:00
import compiler._
2010-09-04 14:46:36 +02:00
import inc._
import Locate.DefinesClass
2010-09-04 14:46:36 +02:00
import java.io.File
object Compiler
2010-09-04 14:46:36 +02:00
{
2010-09-05 17:12:44 +02:00
val DefaultMaxErrors = 100
2011-04-12 04:12:03 +02:00
final case class Inputs(compilers: Compilers, config: Options, incSetup: IncSetup)
2012-01-09 14:00:35 +01:00
final case class Options(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder)
final case class IncSetup(analysisMap: File => Option[Analysis], definesClass: DefinesClass, skip: Boolean, cacheFile: File, cache: GlobalsCache)
2012-01-09 14:00:35 +01:00
final case class Compilers(scalac: AnalyzingCompiler, javac: JavaTool)
2010-09-04 14:46:36 +02:00
@deprecated("Use the other inputs variant.", "0.12.0")
2012-01-09 14:00:35 +01:00
def inputs(classpath: Seq[File], sources: Seq[File], outputDirectory: File, options: Seq[String], javacOptions: Seq[String], definesClass: DefinesClass, maxErrors: Int, order: CompileOrder)(implicit compilers: Compilers, log: Logger): Inputs =
2010-09-04 14:46:36 +02:00
{
import Path._
2010-09-04 14:46:36 +02:00
val classesDirectory = outputDirectory / "classes"
val cacheFile = outputDirectory / "cache_old_style"
2010-09-04 14:46:36 +02:00
val augClasspath = classesDirectory.asFile +: classpath
val incSetup = IncSetup(Map.empty, definesClass, false, cacheFile, CompilerCache.fresh)
inputs(augClasspath, sources, classesDirectory, options, javacOptions, maxErrors, order)(compilers, incSetup, log)
2010-09-04 14:46:36 +02:00
}
2012-01-09 14:00:35 +01:00
def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder)(implicit compilers: Compilers, incSetup: IncSetup, log: Logger): Inputs =
2010-09-04 14:46:36 +02:00
new Inputs(
compilers,
2011-04-04 03:15:35 +02:00
new Options(classpath, sources, classesDirectory, options, javacOptions, maxErrors, order),
incSetup
2010-09-04 14:46:36 +02:00
)
2010-09-05 17:12:44 +02:00
2011-05-26 04:44:22 +02:00
def compilers(cpOptions: ClasspathOptions)(implicit app: AppConfiguration, log: Logger): Compilers =
2010-09-05 17:12:44 +02:00
{
val scalaProvider = app.provider.scalaProvider
2011-05-26 04:44:22 +02:00
compilers(ScalaInstance(scalaProvider.version, scalaProvider.launcher), cpOptions)
2010-09-05 17:12:44 +02:00
}
2011-05-26 04:44:22 +02:00
def compilers(instance: ScalaInstance, cpOptions: ClasspathOptions)(implicit app: AppConfiguration, log: Logger): Compilers =
compilers(instance, cpOptions, None)
2010-09-04 14:46:36 +02:00
def compilers(instance: ScalaInstance, cpOptions: ClasspathOptions, javaHome: Option[File])(implicit app: AppConfiguration, log: Logger): Compilers =
2010-09-04 14:46:36 +02:00
{
2012-04-18 14:07:53 +02:00
val javac = AggressiveCompile.directOrFork(instance, cpOptions, javaHome)
2010-09-04 14:46:36 +02:00
compilers(instance, cpOptions, javac)
}
def compilers(instance: ScalaInstance, cpOptions: ClasspathOptions, javac: JavaCompiler.Fork)(implicit app: AppConfiguration, log: Logger): Compilers =
2010-09-04 14:46:36 +02:00
{
val javaCompiler = JavaCompiler.fork(cpOptions, instance)(javac)
compilers(instance, cpOptions, javaCompiler)
}
2012-01-09 14:00:35 +01:00
def compilers(instance: ScalaInstance, cpOptions: ClasspathOptions, javac: JavaTool)(implicit app: AppConfiguration, log: Logger): Compilers =
2010-09-04 14:46:36 +02:00
{
val scalac = scalaCompiler(instance, cpOptions)
new Compilers(scalac, javac)
}
def scalaCompiler(instance: ScalaInstance, cpOptions: ClasspathOptions)(implicit app: AppConfiguration, log: Logger): AnalyzingCompiler =
{
val launcher = app.provider.scalaProvider.launcher
val componentManager = new ComponentManager(launcher.globalLock, app.provider.components, Option(launcher.ivyHome), log)
2012-04-18 14:07:53 +02:00
val provider = ComponentCompiler.interfaceProvider(componentManager)
new AnalyzingCompiler(instance, provider, cpOptions, log)
}
2010-09-04 14:46:36 +02:00
def apply(in: Inputs, log: Logger): Analysis =
2010-09-04 14:46:36 +02:00
{
import in.compilers._
import in.config._
import in.incSetup._
val agg = new AggressiveCompile(cacheFile)
agg(scalac, javac, sources, classpath, CompileOutput(classesDirectory), cache, None, options, javacOptions, analysisMap, definesClass, new LoggerReporter(maxErrors, log), order, skip)(log)
2010-09-04 14:46:36 +02:00
}
}