From 903a155faf1fd6b6f23d8f790bfe386d85af3a62 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 22 Nov 2020 15:28:59 -0500 Subject: [PATCH 1/3] Revert "setType to Block(...)" This reverts commit b62ddaa4e982031ef56ea14599b0c3b3ceabe027. --- .../main/scala/sbt/internal/util/appmacro/ContextUtil.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala index c29b0f6ec..1a4658813 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala @@ -321,8 +321,7 @@ final class ContextUtil[C <: blackbox.Context](val ctx: C) { case _ => Some(stat) } } - val expr = super.transform(expr0) - Block(stats, expr).setType(expr.tpe) + Block(stats, super.transform(expr0)) case _ => super.transform(tree) } } From 07f347b0f4b97dbeeec8be5adbc4beb498e1a491 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 22 Nov 2020 15:29:16 -0500 Subject: [PATCH 2/3] Revert "Strip out raw Ident(_) in blocks if it's synthetic" This reverts commit a44aee9ac183d960c8f946a782447fba1f17b0ef. --- .../scala/sbt/internal/util/appmacro/ContextUtil.scala | 10 ---------- .../scala/sbt/internal/util/appmacro/Instance.scala | 4 +++- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala index 1a4658813..4bec6e63d 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala @@ -312,16 +312,6 @@ final class ContextUtil[C <: blackbox.Context](val ctx: C) { case Converted.Failure(p, m) => ctx.abort(p, m) case _: Converted.NotApplicable[_] => super.transform(tree) } - // try to workaround https://github.com/scala/bug/issues/12112 by removing raw Ident(_) in blocks - case Block(stats0, expr0) => - val stats = stats0 flatMap { stat0 => - val stat = super.transform(stat0) - stat match { - case Typed(ident @ Ident(_), _) if ident.symbol.isSynthetic => None - case _ => Some(stat) - } - } - Block(stats, super.transform(expr0)) case _ => super.transform(tree) } } diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala index f077ed5ab..5c15a3346 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala @@ -187,7 +187,9 @@ object Instance { qual.foreach(checkQual) val vd = util.freshValDef(tpe, qual.pos, functionSym) inputs ::= new Input(tpe, qual, vd) - util.refVal(selection, vd) + // try to workaround https://github.com/scala/bug/issues/12112 by calling Predef.identity(...) + val rv = util.refVal(selection, vd) + q"scala.Predef.identity[$tpe]($rv: $tpe)" } def sub(name: String, tpe: Type, qual: Tree, replace: Tree): Converted[c.type] = { val tag = c.WeakTypeTag[T](tpe) From 00265bf91269c79fb761b9fe67baebbda9592a41 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 22 Nov 2020 16:19:27 -0500 Subject: [PATCH 3/3] Work around "a pure expression does nothing" warning, take 2 In https://github.com/sbt/sbt/pull/5981 I tried to work around the spruious post-macro "a pure expression does nothing" warning (https://github.com/scala/bug/issues/12112) by trying to remove some pure-looking expressions out of the tree. This quickly backfired when it was reported that sbt 1.4.3 was not evaluating some code. This backs out the macro-level manipulation, and instead try to silence the warning at the reporter level. This feels safer, and it seems to work just as well. --- .../main/scala/sbt/internal/util/appmacro/Instance.scala | 4 +--- .../scala/sbt/internal/server/BuildServerProtocol.scala | 5 +++-- .../scala/sbt/internal/server/BuildServerReporter.scala | 8 ++++++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala index 5c15a3346..f077ed5ab 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/Instance.scala @@ -187,9 +187,7 @@ object Instance { qual.foreach(checkQual) val vd = util.freshValDef(tpe, qual.pos, functionSym) inputs ::= new Input(tpe, qual, vd) - // try to workaround https://github.com/scala/bug/issues/12112 by calling Predef.identity(...) - val rv = util.refVal(selection, vd) - q"scala.Predef.identity[$tpe]($rv: $tpe)" + util.refVal(selection, vd) } def sub(name: String, tpe: Type, qual: Tree, replace: Tree): Converted[c.type] = { val tag = c.WeakTypeTag[T](tpe) diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index 461005127..6977281f4 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -204,10 +204,11 @@ object BuildServerProtocol { val converter = fileConverter.value val underlying = (Keys.compile / compilerReporter).value val logger = streams.value.log + val meta = isMetaBuild.value if (bspEnabled.value) { - new BuildServerReporterImpl(targetId, converter, logger, underlying) + new BuildServerReporterImpl(targetId, converter, meta, logger, underlying) } else { - new BuildServerForwarder(logger, underlying) + new BuildServerForwarder(meta, logger, underlying) } } ) diff --git a/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala b/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala index 164f03832..41a35ee8e 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala @@ -28,6 +28,9 @@ import scala.collection.mutable sealed trait BuildServerReporter extends Reporter { private final val sigFilesWritten = "[sig files written]" + private final val pureExpression = "a pure expression does nothing in statement position" + + protected def isMetaBuild: Boolean protected def logger: ManagedLogger @@ -52,6 +55,9 @@ sealed trait BuildServerReporter extends Reporter { override def log(problem: Problem): Unit = { if (problem.message == sigFilesWritten) { logger.debug(sigFilesWritten) + } else if (isMetaBuild && problem.message.startsWith(pureExpression)) { + // work around https://github.com/scala/bug/issues/12112 by ignoring it in the reporter + logger.debug(problem.message) } else { publishDiagnostic(problem) underlying.log(problem) @@ -64,6 +70,7 @@ sealed trait BuildServerReporter extends Reporter { final class BuildServerReporterImpl( buildTarget: BuildTargetIdentifier, converter: FileConverter, + protected override val isMetaBuild: Boolean, protected override val logger: ManagedLogger, protected override val underlying: Reporter ) extends BuildServerReporter { @@ -159,6 +166,7 @@ final class BuildServerReporterImpl( } final class BuildServerForwarder( + protected override val isMetaBuild: Boolean, protected override val logger: ManagedLogger, protected override val underlying: Reporter ) extends BuildServerReporter {