From aa8c1f484b1f86b3c70f69304dc577d98a347417 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 7 Oct 2018 17:05:18 -0400 Subject: [PATCH] implement SemanticdbPlugin This makes it easier to enable SemanticDB build wide. --- main/src/main/scala/sbt/Defaults.scala | 3 + main/src/main/scala/sbt/Keys.scala | 6 ++ .../scala/sbt/internal/PluginDiscovery.scala | 3 +- .../scala/sbt/plugins/SemanticdbPlugin.scala | 58 +++++++++++++++++++ sbt/src/sbt-test/project/semanticdb/build.sbt | 5 ++ .../semanticdb/src/main/scala/foo/Test.scala | 7 +++ sbt/src/sbt-test/project/semanticdb/test | 2 + 7 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala create mode 100644 sbt/src/sbt-test/project/semanticdb/build.sbt create mode 100644 sbt/src/sbt-test/project/semanticdb/src/main/scala/foo/Test.scala create mode 100644 sbt/src/sbt-test/project/semanticdb/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index f4d329710..e930e558d 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -443,6 +443,7 @@ object Defaults extends BuildCommon { def addBaseSources = FileManagement.appendBaseSources lazy val outputConfigPaths = Seq( classDirectory := crossTarget.value / (prefix(configuration.value.name) + "classes"), + semanticdbTargetRoot := crossTarget.value / (prefix(configuration.value.name) + "meta"), target in doc := crossTarget.value / (prefix(configuration.value.name) + "api") ) @@ -3329,6 +3330,8 @@ object Classpaths { } } +private[sbt] object Build0 extends BuildExtra + trait BuildExtra extends BuildCommon with DefExtra { import Defaults._ diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index fcd817bc3..6e85a8da5 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -243,6 +243,12 @@ object Keys { val scalaArtifacts = settingKey[Seq[String]]("Configures the list of artifacts which should match the Scala binary version").withRank(CSetting) val enableBinaryCompileAnalysis = settingKey[Boolean]("Writes the analysis file in binary format") val crossJavaVersions = settingKey[Seq[String]]("The java versions used during JDK cross testing").withRank(BPlusSetting) + val semanticdbEnabled = settingKey[Boolean]("Enables SemanticDB Scalac plugin").withRank(CSetting) + val semanticdbCompilerPlugin = settingKey[ModuleID]("SemanticDB Scalac plugin").withRank(CSetting) + val semanticdbVersion = settingKey[String]("SemanticDB version").withRank(CSetting) + val semanticdbIncludeInJar = settingKey[Boolean]("Include *.semanticdb files in published artifacts").withRank(CSetting) + val semanticdbTargetRoot = settingKey[File]("The output directory to produce META-INF/semanticdb/**/*.semanticdb files").withRank(CSetting) + val semanticdbOptions = settingKey[Seq[String]]("The Scalac options introduced for SemanticDB").withRank(CSetting) val clean = taskKey[Unit]("Deletes files produced by the build, such as generated sources, compiled classes, and task caches.").withRank(APlusTask) val console = taskKey[Unit]("Starts the Scala interpreter with the project classes on the classpath.").withRank(APlusTask) diff --git a/main/src/main/scala/sbt/internal/PluginDiscovery.scala b/main/src/main/scala/sbt/internal/PluginDiscovery.scala index 291bd4fe9..62d481cac 100644 --- a/main/src/main/scala/sbt/internal/PluginDiscovery.scala +++ b/main/src/main/scala/sbt/internal/PluginDiscovery.scala @@ -49,8 +49,9 @@ object PluginDiscovery { "sbt.plugins.CorePlugin" -> sbt.plugins.CorePlugin, "sbt.ScriptedPlugin" -> sbt.ScriptedPlugin, "sbt.plugins.SbtPlugin" -> sbt.plugins.SbtPlugin, + "sbt.plugins.SemanticdbPlugin" -> sbt.plugins.SemanticdbPlugin, "sbt.plugins.JUnitXmlReportPlugin" -> sbt.plugins.JUnitXmlReportPlugin, - "sbt.plugins.Giter8TemplatePlugin" -> sbt.plugins.Giter8TemplatePlugin + "sbt.plugins.Giter8TemplatePlugin" -> sbt.plugins.Giter8TemplatePlugin, ) val detectedAutoPlugins = discover[AutoPlugin](AutoPlugins) val allAutoPlugins = (defaultAutoPlugins ++ detectedAutoPlugins.modules) map { diff --git a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala new file mode 100644 index 000000000..9e61db07f --- /dev/null +++ b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala @@ -0,0 +1,58 @@ +/* + * sbt + * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt +package plugins + +import Keys._ +import sbt.librarymanagement.syntax._ +import sbt.librarymanagement.CrossVersion +import Project.inConfig + +object SemanticdbPlugin extends AutoPlugin { + override def requires = JvmPlugin + override def trigger = allRequirements + + override lazy val globalSettings = Seq( + semanticdbEnabled := false, + semanticdbIncludeInJar := false, + semanticdbOptions := List("-Yrangepos"), + semanticdbVersion := "4.0.0", + semanticdbCompilerPlugin := { + val v = semanticdbVersion.value + ("org.scalameta" % "semanticdb-scalac" % v).cross(CrossVersion.full) + } + ) + + override lazy val projectSettings = Seq( + allDependencies ++= { + val sdb = semanticdbEnabled.value + val m = semanticdbCompilerPlugin.value + if (sdb) List(Build0.compilerPlugin(m)) + else Nil + } + ) ++ inConfig(Compile)(configurationSettings) ++ inConfig(Test)(configurationSettings) + + lazy val configurationSettings: Seq[Def.Setting[_]] = List( + scalacOptions := { + val old = scalacOptions.value + val sdb = semanticdbEnabled.value + val sdbOptions = semanticdbOptions.value + if (sdb) (old.toVector ++ sdbOptions.toVector).distinct + else old + }, + semanticdbTargetRoot := { + val in = semanticdbIncludeInJar.value + if (in) classDirectory.value + else semanticdbTargetRoot.value + }, + semanticdbOptions ++= { + val tr = semanticdbTargetRoot.value + List(s"-P:semanticdb:targetroot:$tr") + } + ) +} diff --git a/sbt/src/sbt-test/project/semanticdb/build.sbt b/sbt/src/sbt-test/project/semanticdb/build.sbt new file mode 100644 index 000000000..0df9504f9 --- /dev/null +++ b/sbt/src/sbt-test/project/semanticdb/build.sbt @@ -0,0 +1,5 @@ +ThisBuild / scalaVersion := "2.12.7" +ThisBuild / semanticdbEnabled := true +ThisBuild / semanticdbIncludeInJar := true + +lazy val root = (project in file(".")) diff --git a/sbt/src/sbt-test/project/semanticdb/src/main/scala/foo/Test.scala b/sbt/src/sbt-test/project/semanticdb/src/main/scala/foo/Test.scala new file mode 100644 index 000000000..0bf6e4111 --- /dev/null +++ b/sbt/src/sbt-test/project/semanticdb/src/main/scala/foo/Test.scala @@ -0,0 +1,7 @@ +package foo + +object Test { + def main(args: Array[String]): Unit = { + println("hello world") + } +} diff --git a/sbt/src/sbt-test/project/semanticdb/test b/sbt/src/sbt-test/project/semanticdb/test new file mode 100644 index 000000000..e2cc818dc --- /dev/null +++ b/sbt/src/sbt-test/project/semanticdb/test @@ -0,0 +1,2 @@ +> compile +$ exists target/scala-2.12/classes/META-INF/semanticdb/src/main/scala/foo/Test.scala.semanticdb