-
Notifications
You must be signed in to change notification settings - Fork 199
/
Compiler.scala
77 lines (67 loc) · 2.8 KB
/
Compiler.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package bloop
import xsbti.compile._
import xsbti.T2
import java.util.Optional
import java.io.File
import bloop.io.{AbsolutePath, Paths}
import bloop.logging.Logger
import sbt.internal.inc.{FreshCompilerCache, Locate, LoggedReporter, ZincUtil}
case class CompileInputs(
scalaInstance: ScalaInstance,
compilerCache: CompilerCache,
sourceDirectories: Array[AbsolutePath],
classpath: Array[AbsolutePath],
classesDir: AbsolutePath,
baseDirectory: AbsolutePath,
scalacOptions: Array[String],
javacOptions: Array[String],
previousResult: PreviousResult,
logger: Logger
)
object Compiler {
private final class ZincClasspathEntryLookup(previousResult: PreviousResult)
extends PerClasspathEntryLookup {
override def analysis(classpathEntry: File): Optional[CompileAnalysis] =
previousResult.analysis
override def definesClass(classpathEntry: File): DefinesClass =
Locate.definesClass(classpathEntry)
}
def compile(compileInputs: CompileInputs): CompileResult = {
def getInputs(compilers: Compilers): Inputs = {
val options = getCompilationOptions(compileInputs)
val setup = getSetup(compileInputs)
Inputs.of(compilers, options, setup, compileInputs.previousResult)
}
def getCompilationOptions(inputs: CompileInputs): CompileOptions = {
val sources = inputs.sourceDirectories.distinct
.flatMap(src => Paths.getAll(src, "glob:**.{scala,java}"))
.distinct
val classesDir = inputs.classesDir.toFile
// TODO(jvican): Figure out why `inputs.scalaInstance.allJars` is required here.
val classpath = Array(classesDir) ++ inputs.classpath.map(_.toFile) ++ inputs.scalaInstance.allJars
CompileOptions
.create()
.withClassesDirectory(classesDir)
.withSources(sources.map(_.toFile))
.withClasspath(classpath)
.withScalacOptions(inputs.scalacOptions)
.withJavacOptions(inputs.javacOptions)
}
def getSetup(compileInputs: CompileInputs): Setup = {
val skip = false
val empty = Array.empty[T2[String, String]]
val lookup = new ZincClasspathEntryLookup(compileInputs.previousResult)
val reporter = new LoggedReporter(100, compileInputs.logger)
val compilerCache = new FreshCompilerCache
val cacheFile = compileInputs.baseDirectory.resolve("cache").toFile
val incOptions = IncOptions.create()
val progress = Optional.empty[CompileProgress]
Setup.create(lookup, skip, cacheFile, compilerCache, incOptions, reporter, progress, empty)
}
val scalaInstance = compileInputs.scalaInstance
val compilers = compileInputs.compilerCache.get(scalaInstance)
val inputs = getInputs(compilers)
val incrementalCompiler = ZincUtil.defaultIncrementalCompiler
incrementalCompiler.compile(inputs, compileInputs.logger)
}
}