Inform the build user about macro recompilation

This commit is contained in:
Eugene Yokota 2016-06-08 00:39:04 -04:00
parent 9dcc852c33
commit bd2e02aeaa
2 changed files with 24 additions and 7 deletions

View File

@ -23,7 +23,11 @@ object Incremental {
class PrefixingLogger(val prefix: String)(orig: Logger) extends Logger {
def trace(t: => Throwable): Unit = orig.trace(t)
def success(message: => String): Unit = orig.success(message)
def log(level: sbt.Level.Value, message: => String): Unit = orig.log(level, message.replaceAll("(?m)^", prefix))
def log(level: sbt.Level.Value, message: => String): Unit =
level match {
case Level.Debug => orig.log(level, message.replaceAll("(?m)^", prefix))
case _ => orig.log(level, message)
}
}
/**

View File

@ -53,7 +53,7 @@ import xsbt.api.APIUtil
private[inc] class MemberRefInvalidator(log: Logger) {
def get[T](memberRef: Relation[File, T], usedNames: Relation[File, String], apiChange: APIChange[_]): T => Set[File] = apiChange match {
case _: APIChangeDueToMacroDefinition[_] =>
new InvalidateUnconditionally(memberRef)
new InvalidateDueToMacroDefinition(memberRef)
case NamesChange(_, modifiedNames) if modifiedNames.implicitNames.nonEmpty =>
new InvalidateUnconditionally(memberRef)
case NamesChange(modifiedSrcFile, modifiedNames) =>
@ -79,18 +79,31 @@ private[inc] class MemberRefInvalidator(log: Logger) {
"MemberReferenceInvalidator.get should be called when name hashing is enabled " +
"and in that case we shouldn't have SourceAPIChange as an api change."
private class InvalidateDueToMacroDefinition[T](memberRef: Relation[File, T]) extends (T => Set[File]) {
def apply(from: T): Set[File] = {
val invalidated = memberRef.reverse(from)
if (invalidated.nonEmpty) {
log.info(s"Because $from contains a macro definition, the following dependencies are invalidated unconditionally:\n" +
formatInvalidated(invalidated))
}
invalidated
}
}
private class InvalidateUnconditionally[T](memberRef: Relation[File, T]) extends (T => Set[File]) {
def apply(from: T): Set[File] = {
val invalidated = memberRef.reverse(from)
if (invalidated.nonEmpty)
if (invalidated.nonEmpty) {
log.debug(s"The following member ref dependencies of $from are invalidated:\n" +
formatInvalidated(invalidated))
}
invalidated
}
private def formatInvalidated(invalidated: Set[File]): String = {
val sortedFiles = invalidated.toSeq.sortBy(_.getAbsolutePath)
sortedFiles.map(file => "\t" + file).mkString("\n")
}
}
private def formatInvalidated(invalidated: Set[File]): String = {
val sortedFiles = invalidated.toSeq.sortBy(_.getAbsolutePath)
sortedFiles.map(file => "\t" + file).mkString("\n")
}
private class NameHashFilteredInvalidator[T](