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 { class PrefixingLogger(val prefix: String)(orig: Logger) extends Logger {
def trace(t: => Throwable): Unit = orig.trace(t) def trace(t: => Throwable): Unit = orig.trace(t)
def success(message: => String): Unit = orig.success(message) 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) { private[inc] class MemberRefInvalidator(log: Logger) {
def get[T](memberRef: Relation[File, T], usedNames: Relation[File, String], apiChange: APIChange[_]): T => Set[File] = apiChange match { def get[T](memberRef: Relation[File, T], usedNames: Relation[File, String], apiChange: APIChange[_]): T => Set[File] = apiChange match {
case _: APIChangeDueToMacroDefinition[_] => case _: APIChangeDueToMacroDefinition[_] =>
new InvalidateUnconditionally(memberRef) new InvalidateDueToMacroDefinition(memberRef)
case NamesChange(_, modifiedNames) if modifiedNames.implicitNames.nonEmpty => case NamesChange(_, modifiedNames) if modifiedNames.implicitNames.nonEmpty =>
new InvalidateUnconditionally(memberRef) new InvalidateUnconditionally(memberRef)
case NamesChange(modifiedSrcFile, modifiedNames) => case NamesChange(modifiedSrcFile, modifiedNames) =>
@ -79,18 +79,31 @@ private[inc] class MemberRefInvalidator(log: Logger) {
"MemberReferenceInvalidator.get should be called when name hashing is enabled " + "MemberReferenceInvalidator.get should be called when name hashing is enabled " +
"and in that case we shouldn't have SourceAPIChange as an api change." "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]) { private class InvalidateUnconditionally[T](memberRef: Relation[File, T]) extends (T => Set[File]) {
def apply(from: T): Set[File] = { def apply(from: T): Set[File] = {
val invalidated = memberRef.reverse(from) val invalidated = memberRef.reverse(from)
if (invalidated.nonEmpty) if (invalidated.nonEmpty) {
log.debug(s"The following member ref dependencies of $from are invalidated:\n" + log.debug(s"The following member ref dependencies of $from are invalidated:\n" +
formatInvalidated(invalidated)) formatInvalidated(invalidated))
}
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]( private class NameHashFilteredInvalidator[T](