From bd2e02aeaa156acea5138df219e29eb9d53a9151 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 8 Jun 2016 00:39:04 -0400 Subject: [PATCH] Inform the build user about macro recompilation --- .../src/main/scala/sbt/inc/Incremental.scala | 6 ++++- .../scala/sbt/inc/MemberRefInvalidator.scala | 25 ++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/compile/inc/src/main/scala/sbt/inc/Incremental.scala b/compile/inc/src/main/scala/sbt/inc/Incremental.scala index db2cff86e..83aca50f6 100644 --- a/compile/inc/src/main/scala/sbt/inc/Incremental.scala +++ b/compile/inc/src/main/scala/sbt/inc/Incremental.scala @@ -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) + } } /** diff --git a/compile/inc/src/main/scala/sbt/inc/MemberRefInvalidator.scala b/compile/inc/src/main/scala/sbt/inc/MemberRefInvalidator.scala index 28ac92515..30d5e056b 100644 --- a/compile/inc/src/main/scala/sbt/inc/MemberRefInvalidator.scala +++ b/compile/inc/src/main/scala/sbt/inc/MemberRefInvalidator.scala @@ -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](