Merge pull request #7697 from adpi2/2.x-source-compat

[2.x] Improve backward source compat
This commit is contained in:
adpi2 2024-09-26 09:28:26 +02:00 committed by GitHub
commit 1a4cdf4862
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 83 additions and 89 deletions

View File

@ -29,8 +29,32 @@ import xsbti.{ HashedVirtualFileRef, VirtualFile, VirtualFileRef }
import sjsonnew.JsonFormat import sjsonnew.JsonFormat
import scala.reflect.ClassTag 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. */ /** 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]] type Classpath = Seq[Attributed[HashedVirtualFileRef]]
def settings(ss: SettingsDefinition*): Seq[Setting[_]] = ss.flatMap(_.settings) 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 { class InitOps[T](private val x: Initialize[T]) extends AnyVal {
def toTaskable: Taskable[T] = x 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 t.info.attributes.get(isDummyTask) getOrElse false
end Def end Def
// these need to be mixed into the sbt package object sealed trait InitializeImplicits { self: Def.type =>
// 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 =>
implicit def initOps[T](x: Def.Initialize[T]): Def.InitOps[T] = new Def.InitOps(x) 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] = implicit def initTaskOps[T](x: Def.Initialize[Task[T]]): Def.InitTaskOps[T] =
new Def.InitTaskOps(x) new Def.InitTaskOps(x)
} }

View File

@ -382,6 +382,8 @@ object Scoped:
protected def onTask[A2](f: Task[A1] => Task[A2]): Initialize[Task[A2]] = protected def onTask[A2](f: Task[A1] => Task[A2]): Initialize[Task[A2]] =
init.apply(f) 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]] = def flatMapTaskValue[T](f: A1 => Task[T]): Initialize[Task[T]] =
onTask(_.result flatMap (f compose successM)) onTask(_.result flatMap (f compose successM))
def map[A2](f: A1 => A2): Initialize[Task[A2]] = def map[A2](f: A1 => A2): Initialize[Task[A2]] =

View File

@ -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

View File

@ -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

View File

@ -2902,6 +2902,9 @@ object Classpaths {
import Defaults._ import Defaults._
import Keys._ import Keys._
def analyzed[A](data: A, analysisFile: VirtualFile): Attributed[A] =
Attributed.blank(data).put(Keys.analysis, analysisFile.id)
def concatDistinct[A]( def concatDistinct[A](
a: Taskable[Seq[A]], a: Taskable[Seq[A]],
b: Taskable[Seq[A]] b: Taskable[Seq[A]]
@ -4776,11 +4779,18 @@ object Classpaths {
} }
} }
private[sbt] object Build0 extends BuildExtra private[sbt] object BuildExtra extends BuildExtra
trait BuildExtra extends BuildCommon with DefExtra { trait BuildExtra extends BuildCommon with DefExtra {
import Defaults._ 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`. * Defines an alias given by `name` that expands to `value`.
* This alias is defined globally after projects are loaded. * This alias is defined globally after projects are loaded.
@ -5051,6 +5061,9 @@ trait BuildExtra extends BuildCommon with DefExtra {
f: ScopedKey[_] => Boolean f: ScopedKey[_] => Boolean
): Seq[Setting[_]] = ): Seq[Setting[_]] =
ss filter (s => f(s.key) && (!transitive || s.dependencies.forall(f))) ss filter (s => f(s.key) && (!transitive || s.dependencies.forall(f)))
implicit def sbtStateToUpperStateOps(s: State): UpperStateOps =
new UpperStateOps.UpperStateOpsImpl(s)
} }
trait DefExtra { trait DefExtra {

View File

@ -13,6 +13,7 @@ import java.util.concurrent.atomic.AtomicReference
import sbt.Def.{ ScopedKey, Setting, dummyState } import sbt.Def.{ ScopedKey, Setting, dummyState }
import sbt.Keys.{ TaskProgress => _, name => _, _ } import sbt.Keys.{ TaskProgress => _, name => _, _ }
import sbt.BuildExtra.*
import sbt.ProjectExtra.* import sbt.ProjectExtra.*
import sbt.Scope.Global import sbt.Scope.Global
import sbt.SlashSyntax0._ import sbt.SlashSyntax0._
@ -24,7 +25,6 @@ import sbt.internal.util.{ Terminal => ITerminal, _ }
import sbt.librarymanagement.{ Resolver, UpdateReport } import sbt.librarymanagement.{ Resolver, UpdateReport }
import sbt.std.Transform.DummyTaskMap import sbt.std.Transform.DummyTaskMap
import sbt.util.{ Logger, Show } import sbt.util.{ Logger, Show }
import sbt.BuildSyntax._
import sbt.internal.bsp.BuildTargetIdentifier import sbt.internal.bsp.BuildTargetIdentifier
import scala.annotation.nowarn import scala.annotation.nowarn

View File

@ -16,8 +16,7 @@ import lmcoursier.{ CoursierConfiguration, FallbackDependency }
import org.apache.ivy.core.module.descriptor.ModuleDescriptor import org.apache.ivy.core.module.descriptor.ModuleDescriptor
import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.ivy.core.module.id.ModuleRevisionId
import org.apache.logging.log4j.core.{ Appender => XAppender } import org.apache.logging.log4j.core.{ Appender => XAppender }
import sbt.BuildSyntax._ import sbt.Def.*
import sbt.Def.ScopedKey
import sbt.KeyRanks._ import sbt.KeyRanks._
import sbt.internal.InMemoryCacheStore.CacheStoreFactoryFactory import sbt.internal.InMemoryCacheStore.CacheStoreFactoryFactory
import sbt.internal._ import sbt.internal._

View File

@ -94,6 +94,7 @@ object BuildUtil {
("import _root_.scala.xml.{TopScope=>$scope}" ("import _root_.scala.xml.{TopScope=>$scope}"
:: "import _root_.sbt.*" :: "import _root_.sbt.*"
:: "import _root_.sbt.given" :: "import _root_.sbt.given"
:: "import _root_.sbt.BareBuildSyntax.*"
:: "import _root_.sbt.Keys.*" :: "import _root_.sbt.Keys.*"
:: "import _root_.sbt.nio.Keys.*" :: "import _root_.sbt.nio.Keys.*"
:: Nil) :: Nil)

View File

@ -43,7 +43,7 @@ private[sbt] object ClasspathImpl {
val xs = products.map(_ -> analysis) val xs = products.map(_ -> analysis)
for (f, analysis) <- xs for (f, analysis) <- xs
yield APIMappings yield APIMappings
.store(analyzed(f, analysisFile), apiURL.value) .store(Classpaths.analyzed(f, analysisFile), apiURL.value)
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module)) .put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
.put(Keys.configurationStr, config.name) .put(Keys.configurationStr, config.name)
else exportedProducts.value else exportedProducts.value
@ -57,7 +57,7 @@ private[sbt] object ClasspathImpl {
val config = configuration.value val config = configuration.value
for (f, analysis) <- trackedExportedProductsImplTask(track).value for (f, analysis) <- trackedExportedProductsImplTask(track).value
yield APIMappings yield APIMappings
.store(analyzed(f, analysis), apiURL.value) .store(Classpaths.analyzed(f, analysis), apiURL.value)
.put(Keys.artifactStr, RemoteCache.artifactToStr(art)) .put(Keys.artifactStr, RemoteCache.artifactToStr(art))
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module)) .put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
.put(Keys.configurationStr, config.name) .put(Keys.configurationStr, config.name)
@ -71,7 +71,7 @@ private[sbt] object ClasspathImpl {
val config = configuration.value val config = configuration.value
for (f, analysis) <- trackedJarProductsImplTask(track).value for (f, analysis) <- trackedJarProductsImplTask(track).value
yield APIMappings yield APIMappings
.store(analyzed(f, analysis), apiURL.value) .store(Classpaths.analyzed(f, analysis), apiURL.value)
.put(Keys.artifactStr, RemoteCache.artifactToStr(art)) .put(Keys.artifactStr, RemoteCache.artifactToStr(art))
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module)) .put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
.put(Keys.configurationStr, config.name) .put(Keys.configurationStr, config.name)
@ -344,9 +344,6 @@ private[sbt] object ClasspathImpl {
(tasks.toSeq.join).map(_.flatten.distinct) (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( def interSort(
projectRef: ProjectRef, projectRef: ProjectRef,
conf: Configuration, conf: Configuration,

View File

@ -11,8 +11,8 @@ package internal
package server package server
import java.net.URI import java.net.URI
import sbt.BuildExtra.*
import sbt.BuildPaths.{ configurationSources, projectStandard } import sbt.BuildPaths.{ configurationSources, projectStandard }
import sbt.BuildSyntax._
import sbt.Def._ import sbt.Def._
import sbt.Keys._ import sbt.Keys._
import sbt.Project._ import sbt.Project._

View File

@ -12,7 +12,7 @@ import java.io.InputStream
import java.nio.file.Path import java.nio.file.Path
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import sbt.BuildSyntax.{ settingKey, taskKey } import sbt.Def.{ settingKey, taskKey }
import sbt.KeyRanks.{ BMinusSetting, DSetting, Invisible } import sbt.KeyRanks.{ BMinusSetting, DSetting, Invisible }
import sbt.internal.DynamicInput import sbt.internal.DynamicInput
import sbt.internal.nio.FileTreeRepository import sbt.internal.nio.FileTreeRepository

View File

@ -12,7 +12,7 @@ package plugins
import java.io.File import java.io.File
import java.net.URI import java.net.URI
import sbt.internal.graph._ import sbt.internal.graph._
import sbt.BuildSyntax._ import sbt.Def._
import sbt.librarymanagement.{ ModuleID, UpdateReport } import sbt.librarymanagement.{ ModuleID, UpdateReport }
trait MiniDependencyTreeKeys { trait MiniDependencyTreeKeys {

View File

@ -39,7 +39,7 @@ object SemanticdbPlugin extends AutoPlugin {
val sdb = semanticdbEnabled.value val sdb = semanticdbEnabled.value
val m = semanticdbCompilerPlugin.value val m = semanticdbCompilerPlugin.value
val sv = scalaVersion.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 else Nil
}, },
semanticdbOptions += { semanticdbOptions += {

View File

@ -11,7 +11,7 @@ package sbt
import scala.util.control.NonFatal import scala.util.control.NonFatal
import org.scalacheck._ import org.scalacheck._
import Prop._ import Prop._
import sbt.BuildSyntax.project import sbt.BuildExtra.project
import java.io.File import java.io.File
class ProjectDefs { class ProjectDefs {

View File

@ -23,9 +23,8 @@ package object sbt
with sbt.librarymanagement.DependencyFilterExtra with sbt.librarymanagement.DependencyFilterExtra
with sbt.librarymanagement.LibraryManagementSyntax with sbt.librarymanagement.LibraryManagementSyntax
with sbt.BuildExtra with sbt.BuildExtra
with sbt.TaskMacroExtra
with sbt.ScopeFilter.Make
with sbt.BuildSyntax with sbt.BuildSyntax
with sbt.ScopeFilter.Make
with sbt.OptionSyntax with sbt.OptionSyntax
with sbt.SlashSyntax with sbt.SlashSyntax
with sbt.Import: with sbt.Import:

View File

@ -29,7 +29,10 @@ trait Import {
val CustomOutput = sbt.OutputStrategy.CustomOutput val CustomOutput = sbt.OutputStrategy.CustomOutput
val AllRequirements = sbt.PluginTrigger.AllRequirements val AllRequirements = sbt.PluginTrigger.AllRequirements
val NoTrigger = sbt.PluginTrigger.NoTrigger val NoTrigger = sbt.PluginTrigger.NoTrigger
val ClasspathDependency = ClasspathDep.ClasspathDependency
type ClasspathDependency = ClasspathDep.ClasspathDependency
val ResolvedClasspathDependency = ClasspathDep.ResolvedClasspathDependency
type ResolvedClasspathDependency = ClasspathDep.ResolvedClasspathDependency
// sbt.testing // sbt.testing
type TestResult = sbt.protocol.testing.TestResult type TestResult = sbt.protocol.testing.TestResult
val TestResult = sbt.protocol.testing.TestResult val TestResult = sbt.protocol.testing.TestResult
@ -197,6 +200,8 @@ trait Import {
type SimpleReader = sbt.internal.util.SimpleReader type SimpleReader = sbt.internal.util.SimpleReader
type SourcePosition = sbt.internal.util.SourcePosition type SourcePosition = sbt.internal.util.SourcePosition
val StackTrace = sbt.internal.util.StackTrace 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 SuppressedTraceContext = sbt.internal.util.SuppressedTraceContext
type TranslatedException = sbt.internal.util.TranslatedException type TranslatedException = sbt.internal.util.TranslatedException
type TranslatedIOException = sbt.internal.util.TranslatedIOException type TranslatedIOException = sbt.internal.util.TranslatedIOException