diff --git a/main-settings/src/main/scala/sbt/Def.scala b/main-settings/src/main/scala/sbt/Def.scala index 57d5ca174c..30206a8d49 100644 --- a/main-settings/src/main/scala/sbt/Def.scala +++ b/main-settings/src/main/scala/sbt/Def.scala @@ -29,8 +29,32 @@ import xsbti.{ HashedVirtualFileRef, VirtualFile, VirtualFileRef } import sjsonnew.JsonFormat import scala.reflect.ClassTag +trait BuildSyntax: + inline def settingKey[A1](inline description: String): SettingKey[A1] = + ${ std.KeyMacro.settingKeyImpl[A1]('description) } + + inline def taskKey[A1](inline description: String): TaskKey[A1] = + ${ std.KeyMacro.taskKeyImpl[A1]('description) } + + inline def inputKey[A1](inline description: String): InputKey[A1] = + ${ std.KeyMacro.inputKeyImpl[A1]('description) } + + import sbt.std.ParserInput + extension [A1](inline in: Task[A1]) + inline def value: A1 = std.InputWrapper.`wrapTask_\u2603\u2603`[A1](in) + + // implicit def macroValueIn[T](@deprecated("unused", "") in: InputTask[T]): std.InputEvaluated[T] = + // ??? + + extension [A1](inline in: Parser[A1]) + inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](Def.toSParser(in)) + + extension [A1](inline in: State => Parser[A1]) + inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](in) +end BuildSyntax + /** A concrete settings system that uses `sbt.Scope` for the scope type. */ -object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits: +object Def extends BuildSyntax with Init[Scope] with InitializeImplicits: type Classpath = Seq[Attributed[HashedVirtualFileRef]] def settings(ss: SettingsDefinition*): Seq[Setting[_]] = ss.flatMap(_.settings) @@ -404,15 +428,6 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits: ) ) - inline def settingKey[A1](inline description: String): SettingKey[A1] = - ${ std.KeyMacro.settingKeyImpl[A1]('description) } - - inline def taskKey[A1](inline description: String): TaskKey[A1] = - ${ std.KeyMacro.taskKeyImpl[A1]('description) } - - inline def inputKey[A1](inline description: String): InputKey[A1] = - ${ std.KeyMacro.inputKeyImpl[A1]('description) } - class InitOps[T](private val x: Initialize[T]) extends AnyVal { def toTaskable: Taskable[T] = x } @@ -449,28 +464,9 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits: t.info.attributes.get(isDummyTask) getOrElse false end Def -// these need to be mixed into the sbt package object -// because the target doesn't involve Initialize or anything in Def -trait TaskMacroExtra: - import sbt.std.ParserInput - extension [A1](inline in: Task[A1]) - inline def value: A1 = std.InputWrapper.`wrapTask_\u2603\u2603`[A1](in) - - // implicit def macroValueIn[T](@deprecated("unused", "") in: InputTask[T]): std.InputEvaluated[T] = - // ??? - - extension [A1](inline in: Parser[A1]) - inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](Def.toSParser(in)) - - extension [A1](inline in: State => Parser[A1]) - inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](in) -end TaskMacroExtra - -sealed trait InitializeImplicits0 { self: Def.type => +sealed trait InitializeImplicits { self: Def.type => implicit def initOps[T](x: Def.Initialize[T]): Def.InitOps[T] = new Def.InitOps(x) -} -sealed trait InitializeImplicits extends InitializeImplicits0 { self: Def.type => implicit def initTaskOps[T](x: Def.Initialize[Task[T]]): Def.InitTaskOps[T] = new Def.InitTaskOps(x) } diff --git a/main-settings/src/main/scala/sbt/Structure.scala b/main-settings/src/main/scala/sbt/Structure.scala index f03f127b38..bce97a0354 100644 --- a/main-settings/src/main/scala/sbt/Structure.scala +++ b/main-settings/src/main/scala/sbt/Structure.scala @@ -382,6 +382,8 @@ object Scoped: protected def onTask[A2](f: Task[A1] => Task[A2]): Initialize[Task[A2]] = init.apply(f) + def dependsOn(tasks: Initialize[? <: Task[?]]*): Initialize[Task[A1]] = + init.zipWith(tasks.asInstanceOf[Seq[Initialize[Task[?]]]].join)(_.dependsOn(_*)) def flatMapTaskValue[T](f: A1 => Task[T]): Initialize[Task[T]] = onTask(_.result flatMap (f compose successM)) def map[A2](f: A1 => A2): Initialize[Task[A2]] = diff --git a/main/src/main/scala/sbt/BareBuildSyntax.scala b/main/src/main/scala/sbt/BareBuildSyntax.scala new file mode 100644 index 0000000000..4396e82349 --- /dev/null +++ b/main/src/main/scala/sbt/BareBuildSyntax.scala @@ -0,0 +1,23 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt + +import sbt.internal.DslEntry +import sbt.librarymanagement.Configuration + +trait BareBuildSyntax: + def enablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslEnablePlugins(ps) + def disablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslDisablePlugins(ps) + def configs(cs: Configuration*): DslEntry = DslEntry.DslConfigs(cs) + def dependsOn(deps: ClasspathDep[ProjectReference]*): DslEntry = DslEntry.DslDependsOn(deps) + // avoid conflict with `sbt.Keys.aggregate` + def aggregateProjects(refs: ProjectReference*): DslEntry = DslEntry.DslAggregate(refs) +end BareBuildSyntax + +object BareBuildSyntax extends BareBuildSyntax diff --git a/main/src/main/scala/sbt/BuildSyntax.scala b/main/src/main/scala/sbt/BuildSyntax.scala deleted file mode 100644 index ad08255026..0000000000 --- a/main/src/main/scala/sbt/BuildSyntax.scala +++ /dev/null @@ -1,41 +0,0 @@ -/* - * sbt - * Copyright 2023, Scala center - * Copyright 2011 - 2022, Lightbend, Inc. - * Copyright 2008 - 2010, Mark Harrah - * Licensed under Apache License 2.0 (see LICENSE) - */ - -package sbt - -import sbt.internal.DslEntry -import sbt.librarymanagement.Configuration - -private[sbt] trait BuildSyntax: - import scala.language.experimental.macros - - /** - * Creates a new Project. This is a macro that expects to be assigned directly to a val. - * The name of the val is used as the project ID and the name of the base directory of the project. - */ - inline def project: Project = ${ std.KeyMacro.projectImpl } - inline def projectMatrix: ProjectMatrix = ${ ProjectMatrix.projectMatrixImpl } - inline def settingKey[A1](inline description: String): SettingKey[A1] = - ${ std.KeyMacro.settingKeyImpl[A1]('description) } - inline def taskKey[A1](inline description: String): TaskKey[A1] = - ${ std.KeyMacro.taskKeyImpl[A1]('description) } - inline def inputKey[A1](inline description: String): InputKey[A1] = - ${ std.KeyMacro.inputKeyImpl[A1]('description) } - - def enablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslEnablePlugins(ps) - def disablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslDisablePlugins(ps) - def configs(cs: Configuration*): DslEntry = DslEntry.DslConfigs(cs) - def dependsOn(deps: ClasspathDep[ProjectReference]*): DslEntry = DslEntry.DslDependsOn(deps) - // avoid conflict with `sbt.Keys.aggregate` - def aggregateProjects(refs: ProjectReference*): DslEntry = DslEntry.DslAggregate(refs) - - implicit def sbtStateToUpperStateOps(s: State): UpperStateOps = - new UpperStateOps.UpperStateOpsImpl(s) -end BuildSyntax - -private[sbt] object BuildSyntax extends BuildSyntax diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 5b60e6aa4e..8d3d1eb0ec 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2899,6 +2899,9 @@ object Classpaths { import Defaults._ import Keys._ + def analyzed[A](data: A, analysisFile: VirtualFile): Attributed[A] = + Attributed.blank(data).put(Keys.analysis, analysisFile.id) + def concatDistinct[A]( a: Taskable[Seq[A]], b: Taskable[Seq[A]] @@ -4773,11 +4776,18 @@ object Classpaths { } } -private[sbt] object Build0 extends BuildExtra +private[sbt] object BuildExtra extends BuildExtra trait BuildExtra extends BuildCommon with DefExtra { import Defaults._ + /** + * Creates a new Project. This is a macro that expects to be assigned directly to a val. + * The name of the val is used as the project ID and the name of the base directory of the project. + */ + inline def project: Project = ${ std.KeyMacro.projectImpl } + inline def projectMatrix: ProjectMatrix = ${ ProjectMatrix.projectMatrixImpl } + /** * Defines an alias given by `name` that expands to `value`. * This alias is defined globally after projects are loaded. @@ -5048,6 +5058,9 @@ trait BuildExtra extends BuildCommon with DefExtra { f: ScopedKey[_] => Boolean ): Seq[Setting[_]] = ss filter (s => f(s.key) && (!transitive || s.dependencies.forall(f))) + + implicit def sbtStateToUpperStateOps(s: State): UpperStateOps = + new UpperStateOps.UpperStateOpsImpl(s) } trait DefExtra { diff --git a/main/src/main/scala/sbt/EvaluateTask.scala b/main/src/main/scala/sbt/EvaluateTask.scala index 3e1dabea61..3eb37c2b7a 100644 --- a/main/src/main/scala/sbt/EvaluateTask.scala +++ b/main/src/main/scala/sbt/EvaluateTask.scala @@ -13,6 +13,7 @@ import java.util.concurrent.atomic.AtomicReference import sbt.Def.{ ScopedKey, Setting, dummyState } import sbt.Keys.{ TaskProgress => _, name => _, _ } +import sbt.BuildExtra.* import sbt.ProjectExtra.* import sbt.Scope.Global import sbt.SlashSyntax0._ @@ -24,7 +25,6 @@ import sbt.internal.util.{ Terminal => ITerminal, _ } import sbt.librarymanagement.{ Resolver, UpdateReport } import sbt.std.Transform.DummyTaskMap import sbt.util.{ Logger, Show } -import sbt.BuildSyntax._ import sbt.internal.bsp.BuildTargetIdentifier import scala.annotation.nowarn diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index e602d450ef..610faebb1a 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -16,8 +16,7 @@ import lmcoursier.{ CoursierConfiguration, FallbackDependency } import org.apache.ivy.core.module.descriptor.ModuleDescriptor import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.logging.log4j.core.{ Appender => XAppender } -import sbt.BuildSyntax._ -import sbt.Def.ScopedKey +import sbt.Def.* import sbt.KeyRanks._ import sbt.internal.InMemoryCacheStore.CacheStoreFactoryFactory import sbt.internal._ diff --git a/main/src/main/scala/sbt/internal/BuildUtil.scala b/main/src/main/scala/sbt/internal/BuildUtil.scala index 30344b0a1f..1cbab6e241 100644 --- a/main/src/main/scala/sbt/internal/BuildUtil.scala +++ b/main/src/main/scala/sbt/internal/BuildUtil.scala @@ -94,6 +94,7 @@ object BuildUtil { ("import _root_.scala.xml.{TopScope=>$scope}" :: "import _root_.sbt.*" :: "import _root_.sbt.given" + :: "import _root_.sbt.BareBuildSyntax.*" :: "import _root_.sbt.Keys.*" :: "import _root_.sbt.nio.Keys.*" :: Nil) diff --git a/main/src/main/scala/sbt/internal/ClasspathImpl.scala b/main/src/main/scala/sbt/internal/ClasspathImpl.scala index 5fbd145e93..74b5f066d9 100644 --- a/main/src/main/scala/sbt/internal/ClasspathImpl.scala +++ b/main/src/main/scala/sbt/internal/ClasspathImpl.scala @@ -43,7 +43,7 @@ private[sbt] object ClasspathImpl { val xs = products.map(_ -> analysis) for (f, analysis) <- xs yield APIMappings - .store(analyzed(f, analysisFile), apiURL.value) + .store(Classpaths.analyzed(f, analysisFile), apiURL.value) .put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module)) .put(Keys.configurationStr, config.name) else exportedProducts.value @@ -57,7 +57,7 @@ private[sbt] object ClasspathImpl { val config = configuration.value for (f, analysis) <- trackedExportedProductsImplTask(track).value yield APIMappings - .store(analyzed(f, analysis), apiURL.value) + .store(Classpaths.analyzed(f, analysis), apiURL.value) .put(Keys.artifactStr, RemoteCache.artifactToStr(art)) .put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module)) .put(Keys.configurationStr, config.name) @@ -71,7 +71,7 @@ private[sbt] object ClasspathImpl { val config = configuration.value for (f, analysis) <- trackedJarProductsImplTask(track).value yield APIMappings - .store(analyzed(f, analysis), apiURL.value) + .store(Classpaths.analyzed(f, analysis), apiURL.value) .put(Keys.artifactStr, RemoteCache.artifactToStr(art)) .put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module)) .put(Keys.configurationStr, config.name) @@ -344,9 +344,6 @@ private[sbt] object ClasspathImpl { (tasks.toSeq.join).map(_.flatten.distinct) } - def analyzed[A](data: A, analysisFile: VirtualFile): Attributed[A] = - Attributed.blank(data).put(Keys.analysis, analysisFile.id) - def interSort( projectRef: ProjectRef, conf: Configuration, diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index fffa06be92..df65d95a2a 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -11,8 +11,8 @@ package internal package server import java.net.URI +import sbt.BuildExtra.* import sbt.BuildPaths.{ configurationSources, projectStandard } -import sbt.BuildSyntax._ import sbt.Def._ import sbt.Keys._ import sbt.Project._ diff --git a/main/src/main/scala/sbt/nio/Keys.scala b/main/src/main/scala/sbt/nio/Keys.scala index a851448ca2..168996fa92 100644 --- a/main/src/main/scala/sbt/nio/Keys.scala +++ b/main/src/main/scala/sbt/nio/Keys.scala @@ -12,7 +12,7 @@ import java.io.InputStream import java.nio.file.Path import java.util.concurrent.atomic.AtomicBoolean -import sbt.BuildSyntax.{ settingKey, taskKey } +import sbt.Def.{ settingKey, taskKey } import sbt.KeyRanks.{ BMinusSetting, DSetting, Invisible } import sbt.internal.DynamicInput import sbt.internal.nio.FileTreeRepository diff --git a/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala b/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala index 71ea74c5cb..c010c85dfa 100644 --- a/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala +++ b/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala @@ -12,7 +12,7 @@ package plugins import java.io.File import java.net.URI import sbt.internal.graph._ -import sbt.BuildSyntax._ +import sbt.Def._ import sbt.librarymanagement.{ ModuleID, UpdateReport } trait MiniDependencyTreeKeys { diff --git a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala index 453754a0ad..f9d8548cb9 100644 --- a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala +++ b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala @@ -39,7 +39,7 @@ object SemanticdbPlugin extends AutoPlugin { val sdb = semanticdbEnabled.value val m = semanticdbCompilerPlugin.value val sv = scalaVersion.value - if (sdb && !ScalaInstance.isDotty(sv)) List(Build0.compilerPlugin(m)) + if (sdb && !ScalaInstance.isDotty(sv)) List(BuildExtra.compilerPlugin(m)) else Nil }, semanticdbOptions += { diff --git a/main/src/test/scala/ProjectMacro.scala b/main/src/test/scala/ProjectMacro.scala index 0c35b7e356..3f47153c05 100644 --- a/main/src/test/scala/ProjectMacro.scala +++ b/main/src/test/scala/ProjectMacro.scala @@ -11,7 +11,7 @@ package sbt import scala.util.control.NonFatal import org.scalacheck._ import Prop._ -import sbt.BuildSyntax.project +import sbt.BuildExtra.project import java.io.File class ProjectDefs { diff --git a/sbt-app/src/main/scala/package.scala b/sbt-app/src/main/scala/package.scala index c7c25051ad..2408e465b3 100644 --- a/sbt-app/src/main/scala/package.scala +++ b/sbt-app/src/main/scala/package.scala @@ -23,9 +23,8 @@ package object sbt with sbt.librarymanagement.DependencyFilterExtra with sbt.librarymanagement.LibraryManagementSyntax with sbt.BuildExtra - with sbt.TaskMacroExtra - with sbt.ScopeFilter.Make with sbt.BuildSyntax + with sbt.ScopeFilter.Make with sbt.OptionSyntax with sbt.SlashSyntax with sbt.Import: diff --git a/sbt-app/src/main/scala/sbt/Import.scala b/sbt-app/src/main/scala/sbt/Import.scala index bd0d4d0f48..669732047e 100644 --- a/sbt-app/src/main/scala/sbt/Import.scala +++ b/sbt-app/src/main/scala/sbt/Import.scala @@ -29,7 +29,10 @@ trait Import { val CustomOutput = sbt.OutputStrategy.CustomOutput val AllRequirements = sbt.PluginTrigger.AllRequirements val NoTrigger = sbt.PluginTrigger.NoTrigger - + val ClasspathDependency = ClasspathDep.ClasspathDependency + type ClasspathDependency = ClasspathDep.ClasspathDependency + val ResolvedClasspathDependency = ClasspathDep.ResolvedClasspathDependency + type ResolvedClasspathDependency = ClasspathDep.ResolvedClasspathDependency // sbt.testing type TestResult = sbt.protocol.testing.TestResult val TestResult = sbt.protocol.testing.TestResult @@ -197,6 +200,8 @@ trait Import { type SimpleReader = sbt.internal.util.SimpleReader type SourcePosition = sbt.internal.util.SourcePosition val StackTrace = sbt.internal.util.StackTrace + val StringAttributeKey = sbt.internal.util.StringAttributeKey + type StringAttributeKey = sbt.internal.util.StringAttributeKey type SuppressedTraceContext = sbt.internal.util.SuppressedTraceContext type TranslatedException = sbt.internal.util.TranslatedException type TranslatedIOException = sbt.internal.util.TranslatedIOException