diff --git a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala index f0e478542..8fcd295ed 100644 --- a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala +++ b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala @@ -18,6 +18,7 @@ import sbt.librarymanagement.{ Configuration, CrossVersion } import ProjectExtra.inConfig import sbt.internal.inc.ScalaInstance import sbt.ScopeFilter.Make.* +import sbt.util.CacheImplicits.given object SemanticdbPlugin extends AutoPlugin { override def requires = JvmPlugin @@ -54,6 +55,10 @@ object SemanticdbPlugin extends AutoPlugin { inConfig(Test)(configurationSettings) lazy val configurationSettings: Seq[Def.Setting[?]] = List( + compileIncremental := Def.taskIf { + if (semanticdbIncludeInJar.value || !semanticdbEnabled.value) compileIncremental.value + else compileIncAndCacheSemanticdbTargetRootTask.value + }.value, semanticdbTargetRoot := { val converter = fileConverter.value val in = semanticdbIncludeInJar.value @@ -93,6 +98,16 @@ object SemanticdbPlugin extends AutoPlugin { } } + private val compileIncAndCacheSemanticdbTargetRootTask = Def.cachedTask { + val prev = compileIncremental.value + val converter = fileConverter.value + val targetRoot = semanticdbTargetRoot.value + + val vfTargetRoot = converter.toVirtualFile(targetRoot.toPath) + Def.declareOutputDirectory(vfTargetRoot) + prev + } + private def ancestorConfigs(config: Configuration) = { def ancestors(configs: Vector[Configuration]): Vector[Configuration] = configs ++ configs.flatMap(conf => ancestors(conf.extendsConfigs)) diff --git a/sbt-app/src/sbt-test/actions/compile-time-only/build.sbt b/sbt-app/src/sbt-test/actions/compile-time-only/build.sbt index e4ebcd167..99ce64624 100644 --- a/sbt-app/src/sbt-test/actions/compile-time-only/build.sbt +++ b/sbt-app/src/sbt-test/actions/compile-time-only/build.sbt @@ -5,7 +5,7 @@ lazy val expectErrorNotCrash = taskKey[Unit]("Ensures that sbt properly set type expectErrorNotCrash := { val fail = (Compile / compileIncremental).failure.value - fail.directCause match + Incomplete.allExceptions(fail).headOption match case Some(x: xsbti.CompileFailed) => () case _ => sys.error("Compiler crashed instead of providing a compile-time-only exception.") } diff --git a/sbt-app/src/sbt-test/project/semanticdbEnabled/build.sbt b/sbt-app/src/sbt-test/project/semanticdbEnabled/build.sbt new file mode 100644 index 000000000..3bd26a503 --- /dev/null +++ b/sbt-app/src/sbt-test/project/semanticdbEnabled/build.sbt @@ -0,0 +1,10 @@ +semanticdbEnabled := true + +val matrix = projectMatrix + .defaultAxes(VirtualAxis.jvm) + .jvmPlatform(scalaVersions = + Seq( + "2.12.20", // semanticdb support via semanticdb-scalac + "3.6.4" // built-in semanticdb support + ) + ) diff --git a/sbt-app/src/sbt-test/project/semanticdbEnabled/matrix/src/main/scala/foo/Compile.scala b/sbt-app/src/sbt-test/project/semanticdbEnabled/matrix/src/main/scala/foo/Compile.scala new file mode 100644 index 000000000..fdd81fb04 --- /dev/null +++ b/sbt-app/src/sbt-test/project/semanticdbEnabled/matrix/src/main/scala/foo/Compile.scala @@ -0,0 +1,7 @@ +package foo + +object Compile { + def main(args: Array[String]): Unit = { + println("hello world") + } +} diff --git a/sbt-app/src/sbt-test/project/semanticdbEnabled/test b/sbt-app/src/sbt-test/project/semanticdbEnabled/test new file mode 100644 index 000000000..d397c7b1d --- /dev/null +++ b/sbt-app/src/sbt-test/project/semanticdbEnabled/test @@ -0,0 +1,25 @@ +> compile +$ exists target/**/scala-2.12*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +$ exists target/**/scala-3*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb + +> clean +-$ exists target/**/scala-2.12*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +-$ exists target/**/scala-3*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +> compile +$ exists target/**/scala-2.12*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +$ exists target/**/scala-3*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb + +> set LocalProject("matrix2_12") / Compile / semanticdbTargetRoot := (LocalProject("matrix2_12") / Compile / target).value / "custom212" +> set LocalProject("matrix3") / Compile / semanticdbTargetRoot := (LocalProject("matrix3") / Compile / target).value / "custom3" + +> compile +$ exists target/**/scala-2.12*/**/custom212/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +$ exists target/**/scala-3*/**/custom3/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb + +> clean +> compile +-$ exists target/**/scala-2.12*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +-$ exists target/**/scala-3*/**/meta/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +$ exists target/**/scala-2.12*/**/custom212/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +$ exists target/**/scala-3*/**/custom3/META-INF/semanticdb/matrix/src/main/scala/foo/Compile.scala.semanticdb +