mirror of https://github.com/sbt/sbt.git
Merge remote-tracking branch 'cancel-bug' into 0.13
This commit is contained in:
commit
ab5e81fc23
|
|
@ -22,7 +22,15 @@ object IncrementalCompile
|
||||||
val current = Stamps.initial(Stamp.exists, Stamp.hash, Stamp.lastModified)
|
val current = Stamps.initial(Stamp.exists, Stamp.hash, Stamp.lastModified)
|
||||||
val internalMap = (f: File) => previous.relations.produced(f).headOption
|
val internalMap = (f: File) => previous.relations.produced(f).headOption
|
||||||
val externalAPI = getExternalAPI(entry, forEntry)
|
val externalAPI = getExternalAPI(entry, forEntry)
|
||||||
Incremental.compile(sources, entry, previous, current, forEntry, doCompile(compile, internalMap, externalAPI, current, output, options), log, options)
|
try {
|
||||||
|
Incremental.compile(sources, entry, previous, current, forEntry, doCompile(compile, internalMap, externalAPI, current, output, options), log, options)
|
||||||
|
} catch {
|
||||||
|
case e: xsbti.CompileCancelled =>
|
||||||
|
log.info("Compilation has been cancelled")
|
||||||
|
// in case compilation got cancelled potential partial compilation results (e.g. produced classs files) got rolled back
|
||||||
|
// and we can report back as there was no change (false) and return a previous Analysis which is still up-to-date
|
||||||
|
(false, previous)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
def doCompile(compile: (Set[File], DependencyChanges, xsbti.AnalysisCallback) => Unit, internalMap: File => Option[File], externalAPI: (File, String) => Option[Source], current: ReadStamps, output: Output, options: IncOptions) =
|
def doCompile(compile: (Set[File], DependencyChanges, xsbti.AnalysisCallback) => Unit, internalMap: File => Option[File], externalAPI: (File, String) => Option[Source], current: ReadStamps, output: Output, options: IncOptions) =
|
||||||
(srcs: Set[File], changes: DependencyChanges) => {
|
(srcs: Set[File], changes: DependencyChanges) => {
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,8 @@ sealed abstract class CallbackGlobal(settings: Settings, reporter: reporters.Rep
|
||||||
}
|
}
|
||||||
class InterfaceCompileFailed(val arguments: Array[String], val problems: Array[Problem], override val toString: String) extends xsbti.CompileFailed
|
class InterfaceCompileFailed(val arguments: Array[String], val problems: Array[Problem], override val toString: String) extends xsbti.CompileFailed
|
||||||
|
|
||||||
|
class InterfaceCompileCancelled(val arguments: Array[String], override val toString: String) extends xsbti.CompileCancelled
|
||||||
|
|
||||||
private final class WeakLog(private[this] var log: Logger, private[this] var delegate: Reporter)
|
private final class WeakLog(private[this] var log: Logger, private[this] var delegate: Reporter)
|
||||||
{
|
{
|
||||||
def apply(message: String) {
|
def apply(message: String) {
|
||||||
|
|
@ -124,12 +126,21 @@ private final class CachedCompiler0(args: Array[String], output: Output, initial
|
||||||
}
|
}
|
||||||
dreporter.printSummary()
|
dreporter.printSummary()
|
||||||
if(!noErrors(dreporter)) handleErrors(dreporter, log)
|
if(!noErrors(dreporter)) handleErrors(dreporter, log)
|
||||||
|
// the case where we cancelled compilation _after_ some compilation errors got reported
|
||||||
|
// will be handled by line above so errors still will be reported properly just potentially not
|
||||||
|
// all of them (because we cancelled the compilation)
|
||||||
|
if (dreporter.cancelled) handleCompilationCancellation(dreporter, log)
|
||||||
}
|
}
|
||||||
def handleErrors(dreporter: DelegatingReporter, log: Logger): Nothing =
|
def handleErrors(dreporter: DelegatingReporter, log: Logger): Nothing =
|
||||||
{
|
{
|
||||||
debug(log, "Compilation failed (CompilerInterface)")
|
debug(log, "Compilation failed (CompilerInterface)")
|
||||||
throw new InterfaceCompileFailed(args, dreporter.problems, "Compilation failed")
|
throw new InterfaceCompileFailed(args, dreporter.problems, "Compilation failed")
|
||||||
}
|
}
|
||||||
|
def handleCompilationCancellation(dreporter: DelegatingReporter, log: Logger): Nothing = {
|
||||||
|
assert(dreporter.cancelled, "We should get here only if when compilation got cancelled")
|
||||||
|
debug(log, "Compilation cancelled (CompilerInterface)")
|
||||||
|
throw new InterfaceCompileCancelled(args, "Compilation has been cancelled")
|
||||||
|
}
|
||||||
def processUnreportedWarnings(run: compiler.Run)
|
def processUnreportedWarnings(run: compiler.Run)
|
||||||
{
|
{
|
||||||
// allConditionalWarnings and the ConditionalWarning class are only in 2.10+
|
// allConditionalWarnings and the ConditionalWarning class are only in 2.10+
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package xsbti;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception thrown when compilation cancellation has been requested during
|
||||||
|
* Scala compiler run.
|
||||||
|
*/
|
||||||
|
public abstract class CompileCancelled extends RuntimeException {
|
||||||
|
public abstract String[] arguments();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue