in src/org/jetbrains/jps/ProjectBuilder.groovy [320:428]
private def compile(ModuleChunk chunk, boolean tests, Collection<StringCache.S> files, Backend callback, ProjectWrapper pw) {
List<String> chunkSources = filterNonExistingFiles(tests ? chunk.testRoots : chunk.sourceRoots, true)
if (chunkSources.isEmpty()) return
List<String> sourceFiles = []
if (files != null) {
files.each {
sourceFiles << pw.getAbsolutePath(it.value)
}
}
if (!dryRun) {
List<String> chunkClasspath = ProjectPaths.getPathsList(getProjectPaths().getClasspathFiles(chunk, ClasspathKind.compile(tests), files == null))
List sourceRootsWithDependencies = getProjectPaths().getSourcePathsForModuleWithDependents(chunk, tests)
Map<ModuleBuildState, ModuleChunk> states = new HashMap<ModuleBuildState, ModuleChunk>()
def chunkState = new ModuleBuildState(
iterated: false,
loader: null,
formInstrumenter: null,
tests: tests,
projectWrapper: pw,
incremental: files != null,
callback: callback,
sourceFiles: sourceFiles,
sourceRoots: chunkSources,
excludes: computeExcludes(chunk.elements, chunkSources),
classpath: chunkClasspath,
sourceRootsFromModuleWithDependencies: sourceRootsWithDependencies,
)
if (arrangeModuleCyclesOutputs) {
chunk.modules.each {
List<String> sourceRoots = filterNonExistingFiles(tests ? it.testRoots : it.sourceRoots, false)
if (!sourceRoots.isEmpty()) {
def state = new ModuleBuildState(
iterated: false,
loader: null,
formInstrumenter: null,
tests: tests,
projectWrapper: pw,
incremental: chunkState.incremental,
callback: callback,
sourceFiles: sourceFiles,
sourceRoots: sourceRoots,
excludes: computeExcludes([it], sourceRoots),
classpath: chunkClasspath,
targetFolder: createOutputFolder(it.name, it, tests),
sourceRootsFromModuleWithDependencies: sourceRootsWithDependencies
)
states[state] = new ModuleChunk(it)
}
}
if (chunk.modules.size() > 1) {
chunkState.targetFolder = getTempDirectoryPath(chunk.name + (tests ? "_tests" : ""))
binding.ant.mkdir(dir: chunkState.targetFolder)
chunkClasspath.add(0, chunkState.targetFolder)
chunkState.tempRootsToDelete << chunkState.targetFolder
}
}
else {
chunkState.targetFolder = createOutputFolder(chunk.name, chunk.representativeModule(), tests)
states[chunkState] = chunk
}
listeners*.onCompilationStarted(chunk)
try {
builders().each {ModuleBuilder builder ->
listeners*.onModuleBuilderStarted(builder, chunk)
if (arrangeModuleCyclesOutputs && chunk.modules.size() > 1 && builder instanceof ModuleCycleBuilder) {
((ModuleCycleBuilder) builder).preprocessModuleCycle(chunkState, chunk, this)
}
states.keySet().each {
builder.processModule(it, states[it], this)
}
listeners*.onModuleBuilderFinished(builder, chunk)
}
}
catch (Exception e) {
final String reason = e.toString();
if (pw != null) {
chunk.modules.each {
Reporter.reportBuildFailure(it, tests, reason)
}
}
throw e;
}
states.keySet().each {
it.tempRootsToDelete.each {
BuildUtil.deleteDir(this, it)
}
}
chunkState.tempRootsToDelete.each {
BuildUtil.deleteDir(this, it)
}
listeners*.onCompilationFinished(chunk)
}
chunk.modules.each {
if (pw != null) {
Reporter.reportBuildSuccess(it, tests)
}
exportProperty("module.${it.name}.output.${tests ? "test" : "main"}", getModuleOutputFolder(it, tests))
}
}