From bc0ed18308e8eed4a624c01bfacbd34f13557d0f Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 10 Jun 2017 04:13:31 -0400 Subject: [PATCH 1/3] define def config(...) as a macro to capture the Scala identifier --- build.sbt | 14 +-- .../sbt/librarymanagement/Artifact.scala | 8 +- .../librarymanagement/ArtifactFormats.scala | 4 +- .../LibraryManagementCodec.scala | 2 +- .../main/contraband/librarymanagement.json | 18 +--- .../sbt/internal/librarymanagement/Ivy.scala | 8 +- .../librarymanagement/IvyRetrieve.scala | 2 +- .../sbt/librarymanagement/ArtifactExtra.scala | 8 +- .../sbt/librarymanagement/Configuration.scala | 77 ++++++++++++++++ .../ConfigurationExtra.scala | 89 ++++++++++++++----- .../ConfigurationFormats.scala | 46 ++++++++++ .../src/test/scala/ConfigMacroSpec.scala | 61 +++++++++++++ project/Dependencies.scala | 1 + 13 files changed, 279 insertions(+), 59 deletions(-) create mode 100644 librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala create mode 100644 librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationFormats.scala create mode 100644 librarymanagement/src/test/scala/ConfigMacroSpec.scala diff --git a/build.sbt b/build.sbt index 33a410a47..295ce27fe 100644 --- a/build.sbt +++ b/build.sbt @@ -64,11 +64,15 @@ lazy val lm = (project in file("librarymanagement")) .settings( commonSettings, name := "librarymanagement", - libraryDependencies ++= Seq( - ivy, jsch, scalaReflect.value, launcherInterface, gigahorseOkhttp, okhttpUrlconnection, - sjsonnewScalaJson.value % Optional, - scalaTest - ), + libraryDependencies ++= Seq(ivy, + jsch, + scalaReflect.value, + scalaCompiler.value, + launcherInterface, + gigahorseOkhttp, + okhttpUrlconnection, + sjsonnewScalaJson.value % Optional, + scalaTest), libraryDependencies ++= scalaXml.value, resourceGenerators in Compile += Def.task( Util.generateVersionFile( diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala index d1848b1c0..42c20e392 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala @@ -9,7 +9,7 @@ final class Artifact private ( val `type`: String, val extension: String, val classifier: Option[String], - val configurations: Vector[sbt.librarymanagement.Configuration], + val configurations: Vector[String], val url: Option[java.net.URL], val extraAttributes: Map[String, String], val checksum: Option[sbt.librarymanagement.Checksum]) extends sbt.librarymanagement.ArtifactExtra with Serializable { @@ -26,7 +26,7 @@ final class Artifact private ( override def toString: String = { "Artifact(" + name + ", " + `type` + ", " + extension + ", " + classifier + ", " + configurations + ", " + url + ", " + extraAttributes + ", " + checksum + ")" } - protected[this] def copy(name: String = name, `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, configurations: Vector[sbt.librarymanagement.Configuration] = configurations, url: Option[java.net.URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[sbt.librarymanagement.Checksum] = checksum): Artifact = { + protected[this] def copy(name: String = name, `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, configurations: Vector[String] = configurations, url: Option[java.net.URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[sbt.librarymanagement.Checksum] = checksum): Artifact = { new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum) } def withName(name: String): Artifact = { @@ -41,7 +41,7 @@ final class Artifact private ( def withClassifier(classifier: Option[String]): Artifact = { copy(classifier = classifier) } - def withConfigurations(configurations: Vector[sbt.librarymanagement.Configuration]): Artifact = { + def withConfigurations(configurations: Vector[String]): Artifact = { copy(configurations = configurations) } def withUrl(url: Option[java.net.URL]): Artifact = { @@ -57,5 +57,5 @@ final class Artifact private ( object Artifact extends sbt.librarymanagement.ArtifactFunctions { def apply(name: String): Artifact = new Artifact(name, Artifact.DefaultType, Artifact.DefaultExtension, None, Vector.empty, None, Map.empty, None) - def apply(name: String, `type`: String, extension: String, classifier: Option[String], configurations: Vector[sbt.librarymanagement.Configuration], url: Option[java.net.URL], extraAttributes: Map[String, String], checksum: Option[sbt.librarymanagement.Checksum]): Artifact = new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum) + def apply(name: String, `type`: String, extension: String, classifier: Option[String], configurations: Vector[String], url: Option[java.net.URL], extraAttributes: Map[String, String], checksum: Option[sbt.librarymanagement.Checksum]): Artifact = new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala index 08bd9cadb..514cd83fc 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait ArtifactFormats { self: sbt.librarymanagement.ConfigurationFormats with sbt.librarymanagement.ChecksumFormats with sjsonnew.BasicJsonProtocol => +trait ArtifactFormats { self: sbt.librarymanagement.ChecksumFormats with sjsonnew.BasicJsonProtocol => implicit lazy val ArtifactFormat: JsonFormat[sbt.librarymanagement.Artifact] = new JsonFormat[sbt.librarymanagement.Artifact] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.Artifact = { jsOpt match { @@ -15,7 +15,7 @@ implicit lazy val ArtifactFormat: JsonFormat[sbt.librarymanagement.Artifact] = n val `type` = unbuilder.readField[String]("type") val extension = unbuilder.readField[String]("extension") val classifier = unbuilder.readField[Option[String]]("classifier") - val configurations = unbuilder.readField[Vector[sbt.librarymanagement.Configuration]]("configurations") + val configurations = unbuilder.readField[Vector[String]]("configurations") val url = unbuilder.readField[Option[java.net.URL]]("url") val extraAttributes = unbuilder.readField[Map[String, String]]("extraAttributes") val checksum = unbuilder.readField[Option[sbt.librarymanagement.Checksum]]("checksum") diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala index 9745a4d1a..8d1cf1a46 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala @@ -5,7 +5,6 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement trait LibraryManagementCodec extends sjsonnew.BasicJsonProtocol - with sbt.librarymanagement.ConfigurationFormats with sbt.librarymanagement.ChecksumFormats with sbt.librarymanagement.ArtifactFormats with sbt.librarymanagement.ArtifactTypeFilterFormats @@ -24,6 +23,7 @@ trait LibraryManagementCodec extends sjsonnew.BasicJsonProtocol with sbt.librarymanagement.ConflictManagerFormats with sbt.librarymanagement.DeveloperFormats with sbt.librarymanagement.FileConfigurationFormats + with sbt.librarymanagement.ConfigurationFormats with sbt.librarymanagement.IvyScalaFormats with sbt.librarymanagement.ChainedResolverFormats with sbt.librarymanagement.MavenRepoFormats diff --git a/librarymanagement/src/main/contraband/librarymanagement.json b/librarymanagement/src/main/contraband/librarymanagement.json index 71b18d691..7ceabeb73 100644 --- a/librarymanagement/src/main/contraband/librarymanagement.json +++ b/librarymanagement/src/main/contraband/librarymanagement.json @@ -13,7 +13,7 @@ { "name": "type", "type": "String", "default": "Artifact.DefaultType", "since": "0.0.1" }, { "name": "extension", "type": "String", "default": "Artifact.DefaultExtension", "since": "0.0.1" }, { "name": "classifier", "type": "Option[String]", "default": "None", "since": "0.0.1" }, - { "name": "configurations", "type": "sbt.librarymanagement.Configuration*", "default": "Vector.empty", "since": "0.0.1" }, + { "name": "configurations", "type": "String*", "default": "Vector.empty", "since": "0.0.1" }, { "name": "url", "type": "Option[java.net.URL]", "default": "None", "since": "0.0.1" }, { "name": "extraAttributes", "type": "Map[String, String]", "default": "Map.empty", "since": "0.0.1" }, { "name": "checksum", "type": "Option[sbt.librarymanagement.Checksum]", "default": "None", "since": "0.0.1" } @@ -61,22 +61,6 @@ ], "toString": "s\"$caller\"" }, - { - "name": "Configuration", - "namespace": "sbt.librarymanagement", - "target": "Scala", - "type": "record", - "doc": "Represents an Ivy configuration.", - "parents": "sbt.librarymanagement.ConfigurationExtra", - "fields": [ - { "name": "name", "type": "String" }, - { "name": "description", "type": "String", "default": "\"\"", "since": "0.0.1" }, - { "name": "isPublic", "type": "boolean", "default": "true", "since": "0.0.1" }, - { "name": "extendsConfigs", "type": "sbt.librarymanagement.Configuration*", "default": "Vector.empty", "since": "0.0.1" }, - { "name": "transitive", "type": "boolean", "default": "true", "since": "0.0.1" } - ], - "toString": "name" - }, { "name": "ConfigurationReport", "namespace": "sbt.librarymanagement", diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala index e7fcdd204..121e8d929 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala @@ -238,9 +238,9 @@ final class IvySbt(val configuration: IvyConfiguration) { self => import ic._ val moduleID = newConfiguredModuleID(module, moduleInfo, configurations) IvySbt.setConflictManager(moduleID, conflictManager, ivy.getSettings) - val defaultConf = defaultConfiguration getOrElse Configurations.config( - ModuleDescriptor.DEFAULT_CONFIGURATION - ) + val defaultConf = defaultConfiguration getOrElse Configuration( + "Default", + ModuleDescriptor.DEFAULT_CONFIGURATION) log.debug( "Using inline dependencies specified in Scala" + (if (ivyXML.isEmpty) "." else " and XML.") @@ -859,7 +859,7 @@ private[sbt] object IvySbt { ): Unit = { val confs = if (artifact.configurations.isEmpty) allConfigurations - else artifact.configurations.map(_.name) + else artifact.configurations confs foreach addConfiguration } diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala index d76f7556d..85eb001c2 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala @@ -217,7 +217,7 @@ object IvyRetrieve { getType, getExt, Option(getExtraAttribute("classifier")), - getConfigurations.toVector map Configurations.config, + getConfigurations.toVector, Option(getUrl) ) } diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala index d3f7a6e7e..92b9fdf1c 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala @@ -11,7 +11,7 @@ abstract class ArtifactExtra { def `type`: String def extension: String def classifier: Option[String] - def configurations: Vector[Configuration] + def configurations: Vector[String] def url: Option[URL] def extraAttributes: Map[String, String] def checksum: Option[Checksum] @@ -21,7 +21,7 @@ abstract class ArtifactExtra { `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, - configurations: Vector[Configuration] = configurations, + configurations: Vector[String] = configurations, url: Option[URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[Checksum] = checksum @@ -58,7 +58,7 @@ abstract class ArtifactFunctions { `type`: String, extension: String, classifier: Option[String], - configurations: Vector[Configuration], + configurations: Vector[String], url: Option[URL] ): Artifact = Artifact(name, `type`, extension, classifier, configurations, url, empty, None) @@ -67,7 +67,7 @@ abstract class ArtifactFunctions { def sources(name: String) = classified(name, SourceClassifier) def javadoc(name: String) = classified(name, DocClassifier) - def pom(name: String) = Artifact(name, PomType, PomType, None, Vector(Pom), None) + def pom(name: String) = Artifact(name, PomType, PomType, None, Vector(Pom.name), None) // Possible ivy artifact types such that sbt will treat those artifacts at sources / docs val DefaultSourceTypes = Set("src", "source", "sources") diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala new file mode 100644 index 000000000..7527f085a --- /dev/null +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala @@ -0,0 +1,77 @@ +package sbt +package librarymanagement + +/** Represents an Ivy configuration. */ +final class Configuration private[sbt] ( + val id: String, + val name: String, + val description: String, + val isPublic: Boolean, + val extendsConfigs: Vector[sbt.librarymanagement.Configuration], + val transitive: Boolean) + extends sbt.librarymanagement.ConfigurationExtra + with Serializable { + + require(name != null, "name cannot be null") + require(name.size > 0, "name cannot be empty") + require(id != null, "id cannot be null") + require(id.size > 0, "id cannot be empty") + require(id.head.isUpper, s"id must be capitalized: $id") + + private def this(id: String, name: String) = + this(id, name, "", true, Vector.empty, true) + + override def equals(o: Any): Boolean = o match { + case x: Configuration => + (this.id == x.id) && + (this.name == x.name) && + (this.description == x.description) && + (this.isPublic == x.isPublic) && + (this.extendsConfigs == x.extendsConfigs) && + (this.transitive == x.transitive) + case _ => false + } + override def hashCode: Int = { + 37 * (37 * (37 * (37 * (37 * (37 * (17 + id.##) + name.##) + description.##) + isPublic.##) + extendsConfigs.##) + transitive.##) + } + override def toString: String = { + name + } + protected[this] def copy(id: String = id, + name: String = name, + description: String = description, + isPublic: Boolean = isPublic, + extendsConfigs: Vector[sbt.librarymanagement.Configuration] = + extendsConfigs, + transitive: Boolean = transitive): Configuration = { + new Configuration(id, name, description, isPublic, extendsConfigs, transitive) + } + + def withDescription(description: String): Configuration = { + copy(description = description) + } + + def withIsPublic(isPublic: Boolean): Configuration = { + copy(isPublic = isPublic) + } + + def withExtendsConfigs( + extendsConfigs: Vector[sbt.librarymanagement.Configuration]): Configuration = { + copy(extendsConfigs = extendsConfigs) + } + + def withTransitive(transitive: Boolean): Configuration = { + copy(transitive = transitive) + } +} +object Configuration { + private[sbt] def apply(id: String, name: String): Configuration = + new Configuration(id, name, "", true, Vector.empty, true) + private[sbt] def apply(id: String, + name: String, + description: String, + isPublic: Boolean, + extendsConfigs: Vector[sbt.librarymanagement.Configuration], + transitive: Boolean): Configuration = + new Configuration(id, name, description, isPublic, extendsConfigs, transitive) +} diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala index 9795ff70a..4d019ffff 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala @@ -3,8 +3,11 @@ */ package sbt.librarymanagement +import scala.annotation.tailrec +import scala.language.experimental.macros + object Configurations { - def config(name: String) = Configuration(name) + def config(name: String) = macro ConfigurationMacro.configMacroImpl def default: Seq[Configuration] = defaultMavenConfigurations def defaultMavenConfigurations: Seq[Configuration] = Seq(Compile, Runtime, Test, Provided, Optional) @@ -25,24 +28,26 @@ object Configurations { case _ => c } - def internal(base: Configuration, ext: Configuration*) = - config(base.name + "-internal").extend(ext: _*).hide - def fullInternal(base: Configuration): Configuration = internal(base, base, Optional, Provided) - def optionalInternal(base: Configuration): Configuration = internal(base, base, Optional) + private[sbt] def internal(base: Configuration, ext: Configuration*) = + Configuration(base.id + "Internal", base.name + "-internal").extend(ext: _*).hide + private[sbt] def fullInternal(base: Configuration): Configuration = + internal(base, base, Optional, Provided) + private[sbt] def optionalInternal(base: Configuration): Configuration = + internal(base, base, Optional) - lazy val Default = config("default") - lazy val Compile = config("compile") - lazy val IntegrationTest = config("it") extend (Runtime) - lazy val Provided = config("provided") - lazy val Runtime = config("runtime") extend (Compile) - lazy val Test = config("test") extend (Runtime) - lazy val System = config("system") - lazy val Optional = config("optional") - lazy val Pom = config("pom") + lazy val Default = Configuration("Default", "default") + lazy val Compile = Configuration("Compile", "compile") + lazy val IntegrationTest = Configuration("IntegrationTest", "it") extend (Runtime) + lazy val Provided = Configuration("Provided", "provided") + lazy val Runtime = Configuration("Runtime", "runtime") extend (Compile) + lazy val Test = Configuration("Test", "test") extend (Runtime) + lazy val System = Configuration("System", "system") + lazy val Optional = Configuration("Optional", "optional") + lazy val Pom = Configuration("Pom", "pom") - lazy val ScalaTool = config("scala-tool").hide - lazy val CompilerPlugin = config("plugin").hide - lazy val Component = config("component").hide + lazy val ScalaTool = Configuration("ScalaTool", "scala-tool").hide + lazy val CompilerPlugin = Configuration("CompilerPlugin", "plugin").hide + lazy val Component = Configuration("Component", "component").hide private[sbt] val DefaultMavenConfiguration = defaultConfiguration(true) private[sbt] val DefaultIvyConfiguration = defaultConfiguration(false) @@ -70,6 +75,7 @@ object Configurations { } abstract class ConfigurationExtra { + def id: String def name: String def description: String def isPublic: Boolean @@ -80,10 +86,51 @@ abstract class ConfigurationExtra { require(description != null) def describedAs(newDescription: String) = - Configuration(name, newDescription, isPublic, extendsConfigs, transitive) + Configuration(id, name, newDescription, isPublic, extendsConfigs, transitive) def extend(configs: Configuration*) = - Configuration(name, description, isPublic, configs.toVector ++ extendsConfigs, transitive) + Configuration(id, name, description, isPublic, configs.toVector ++ extendsConfigs, transitive) def notTransitive = intransitive - def intransitive = Configuration(name, description, isPublic, extendsConfigs, false) - def hide = Configuration(name, description, false, extendsConfigs, transitive) + def intransitive = Configuration(id, name, description, isPublic, extendsConfigs, false) + def hide = Configuration(id, name, description, false, extendsConfigs, transitive) +} + +private[sbt] object ConfigurationMacro { + import scala.reflect.macros._ + + def configMacroImpl(c: Context)(name: c.Expr[String]): c.Expr[Configuration] = { + import c.universe._ + val enclosingValName = definingValName( + c, + methodName => + s"""$methodName must be directly assigned to a val, such as `val x = $methodName`.""") + val id = c.Expr[String](Literal(Constant(enclosingValName))) + reify { Configuration(id.splice, name.splice) } + } + + def definingValName(c: blackbox.Context, invalidEnclosingTree: String => String): String = { + import c.universe.{ Apply => ApplyTree, _ } + val methodName = c.macroApplication.symbol.name + def processName(n: Name): String = + n.decodedName.toString.trim // trim is not strictly correct, but macros don't expose the API necessary + @tailrec def enclosingVal(trees: List[c.Tree]): String = { + trees match { + case vd @ ValDef(_, name, _, _) :: ts => processName(name) + case (_: ApplyTree | _: Select | _: TypeApply) :: xs => enclosingVal(xs) + // lazy val x: X = has this form for some reason (only when the explicit type is present, though) + case Block(_, _) :: DefDef(mods, name, _, _, _, _) :: xs if mods.hasFlag(Flag.LAZY) => + processName(name) + case _ => + c.error(c.enclosingPosition, invalidEnclosingTree(methodName.decodedName.toString)) + "" + } + } + enclosingVal(enclosingTrees(c).toList) + } + + def enclosingTrees(c: blackbox.Context): Seq[c.Tree] = + c.asInstanceOf[reflect.macros.runtime.Context] + .callsiteTyper + .context + .enclosingContextChain + .map(_.tree.asInstanceOf[c.Tree]) } diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationFormats.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationFormats.scala new file mode 100644 index 000000000..30c09a453 --- /dev/null +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationFormats.scala @@ -0,0 +1,46 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ +package sbt +package librarymanagement + +import _root_.sjsonnew.{ deserializationError, serializationError, Builder, JsonFormat, Unbuilder } +trait ConfigurationFormats { + self: sbt.librarymanagement.ConfigurationFormats with sjsonnew.BasicJsonProtocol => + implicit lazy val ConfigurationFormat: JsonFormat[sbt.librarymanagement.Configuration] = + new JsonFormat[sbt.librarymanagement.Configuration] { + override def read[J](jsOpt: Option[J], + unbuilder: Unbuilder[J]): sbt.librarymanagement.Configuration = { + jsOpt match { + case Some(js) => + unbuilder.beginObject(js) + val id = unbuilder.readField[String]("id") + val name = unbuilder.readField[String]("name") + val description = unbuilder.readField[String]("description") + val isPublic = unbuilder.readField[Boolean]("isPublic") + val extendsConfigs = + unbuilder.readField[Vector[sbt.librarymanagement.Configuration]]("extendsConfigs") + val transitive = unbuilder.readField[Boolean]("transitive") + unbuilder.endObject() + new sbt.librarymanagement.Configuration(id, + name, + description, + isPublic, + extendsConfigs, + transitive) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.librarymanagement.Configuration, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("id", obj.id) + builder.addField("name", obj.name) + builder.addField("description", obj.description) + builder.addField("isPublic", obj.isPublic) + builder.addField("extendsConfigs", obj.extendsConfigs) + builder.addField("transitive", obj.transitive) + builder.endObject() + } + } +} diff --git a/librarymanagement/src/test/scala/ConfigMacroSpec.scala b/librarymanagement/src/test/scala/ConfigMacroSpec.scala new file mode 100644 index 000000000..93810a96a --- /dev/null +++ b/librarymanagement/src/test/scala/ConfigMacroSpec.scala @@ -0,0 +1,61 @@ +package sbt.internal.librarymanagement + +import sbt.librarymanagement.Configuration +import sbt.librarymanagement.Configurations.config +import scala.util.control.NonFatal +import org.scalacheck._ +import Prop._ + +class ConfigDefs { + lazy val Kompile = config("kompile") + val X = config("x") + val Z = config("z").hide + val A: Configuration = config("a") + lazy val Aa: Configuration = config("aa") +} + +object ConfigMacroSpec extends Properties("ConfigMacroSpec") { + lazy val cd = new ConfigDefs + import cd._ + + def secure(f: => Prop): Prop = + try { + Prop.secure(f) + } catch { + case NonFatal(e) => + e.printStackTrace + throw e + } + + property("Explicit type on lazy val supported") = secure { + check(Aa, "Aa", "aa", true) + } + + property("Explicit type on val supported") = secure { + check(A, "A", "a", true) + } + + property("lazy vals supported") = secure { + check(Kompile, "Kompile", "kompile", true) + } + + property("plain vals supported") = secure { + check(X, "X", "x", true) + } + + property("Directory overridable") = secure { + check(Z, "Z", "z", false) + } + + def check(c: Configuration, id: String, name: String, isPublic: Boolean): Prop = { + s"Expected id: $id" |: + s"Expected name: $name" |: + s"Expected isPublic: $isPublic" |: + s"Actual id: ${c.id}" |: + s"Actual name: ${c.name}" |: + s"Actual isPublic: ${c.isPublic}" |: + (c.id == id) && + (c.name == name) && + (c.isPublic == isPublic) + } +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 73f3d42c3..1f8e6f5f2 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -43,6 +43,7 @@ object Dependencies { val ivy = "org.scala-sbt.ivy" % "ivy" % "2.3.0-sbt-a3314352b638afbf0dca19f127e8263ed6f898bd" val jsch = "com.jcraft" % "jsch" % "0.1.46" intransitive () val scalaReflect = Def.setting { "org.scala-lang" % "scala-reflect" % scalaVersion.value } + val scalaCompiler = Def.setting { "org.scala-lang" % "scala-compiler" % scalaVersion.value } val scalaXml = scala211Module("scala-xml", "1.0.5") val scalaTest = "org.scalatest" %% "scalatest" % "3.0.1" % Test val sjsonnew = Def.setting { "com.eed3si9n" %% "sjson-new-core" % contrabandSjsonNewVersion.value } From 9f2f7007626c39f79511f51e357d9157fd9d19ce Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 8 Jul 2017 13:01:59 +0200 Subject: [PATCH 2/3] Define ConfigRef and use it in Artifact --- .../sbt/librarymanagement/Artifact.scala | 8 ++--- .../librarymanagement/ArtifactFormats.scala | 4 +-- .../sbt/librarymanagement/ConfigRef.scala | 34 +++++++++++++++++++ .../librarymanagement/ConfigRefFormats.scala | 27 +++++++++++++++ .../LibraryManagementCodec.scala | 1 + .../main/contraband/librarymanagement.json | 19 ++++++++++- .../sbt/internal/librarymanagement/Ivy.scala | 18 +++++----- .../librarymanagement/IvyRetrieve.scala | 4 ++- .../sbt/librarymanagement/ArtifactExtra.scala | 8 ++--- .../sbt/librarymanagement/Configuration.scala | 2 ++ .../ConfigurationExtra.scala | 5 +++ 11 files changed, 110 insertions(+), 20 deletions(-) create mode 100644 librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala create mode 100644 librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRefFormats.scala diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala index 42c20e392..df5d51f0a 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Artifact.scala @@ -9,7 +9,7 @@ final class Artifact private ( val `type`: String, val extension: String, val classifier: Option[String], - val configurations: Vector[String], + val configurations: Vector[sbt.librarymanagement.ConfigRef], val url: Option[java.net.URL], val extraAttributes: Map[String, String], val checksum: Option[sbt.librarymanagement.Checksum]) extends sbt.librarymanagement.ArtifactExtra with Serializable { @@ -26,7 +26,7 @@ final class Artifact private ( override def toString: String = { "Artifact(" + name + ", " + `type` + ", " + extension + ", " + classifier + ", " + configurations + ", " + url + ", " + extraAttributes + ", " + checksum + ")" } - protected[this] def copy(name: String = name, `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, configurations: Vector[String] = configurations, url: Option[java.net.URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[sbt.librarymanagement.Checksum] = checksum): Artifact = { + protected[this] def copy(name: String = name, `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, configurations: Vector[sbt.librarymanagement.ConfigRef] = configurations, url: Option[java.net.URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[sbt.librarymanagement.Checksum] = checksum): Artifact = { new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum) } def withName(name: String): Artifact = { @@ -41,7 +41,7 @@ final class Artifact private ( def withClassifier(classifier: Option[String]): Artifact = { copy(classifier = classifier) } - def withConfigurations(configurations: Vector[String]): Artifact = { + def withConfigurations(configurations: Vector[sbt.librarymanagement.ConfigRef]): Artifact = { copy(configurations = configurations) } def withUrl(url: Option[java.net.URL]): Artifact = { @@ -57,5 +57,5 @@ final class Artifact private ( object Artifact extends sbt.librarymanagement.ArtifactFunctions { def apply(name: String): Artifact = new Artifact(name, Artifact.DefaultType, Artifact.DefaultExtension, None, Vector.empty, None, Map.empty, None) - def apply(name: String, `type`: String, extension: String, classifier: Option[String], configurations: Vector[String], url: Option[java.net.URL], extraAttributes: Map[String, String], checksum: Option[sbt.librarymanagement.Checksum]): Artifact = new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum) + def apply(name: String, `type`: String, extension: String, classifier: Option[String], configurations: Vector[sbt.librarymanagement.ConfigRef], url: Option[java.net.URL], extraAttributes: Map[String, String], checksum: Option[sbt.librarymanagement.Checksum]): Artifact = new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala index 514cd83fc..4dfc42b54 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ArtifactFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait ArtifactFormats { self: sbt.librarymanagement.ChecksumFormats with sjsonnew.BasicJsonProtocol => +trait ArtifactFormats { self: sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.ChecksumFormats with sjsonnew.BasicJsonProtocol => implicit lazy val ArtifactFormat: JsonFormat[sbt.librarymanagement.Artifact] = new JsonFormat[sbt.librarymanagement.Artifact] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.Artifact = { jsOpt match { @@ -15,7 +15,7 @@ implicit lazy val ArtifactFormat: JsonFormat[sbt.librarymanagement.Artifact] = n val `type` = unbuilder.readField[String]("type") val extension = unbuilder.readField[String]("extension") val classifier = unbuilder.readField[Option[String]]("classifier") - val configurations = unbuilder.readField[Vector[String]]("configurations") + val configurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("configurations") val url = unbuilder.readField[Option[java.net.URL]]("url") val extraAttributes = unbuilder.readField[Map[String, String]]("extraAttributes") val checksum = unbuilder.readField[Option[sbt.librarymanagement.Checksum]]("checksum") diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala new file mode 100644 index 000000000..b6e1b12b3 --- /dev/null +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala @@ -0,0 +1,34 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.librarymanagement +/** A reference to Configuration. */ +final class ConfigRef private ( + /** The name of the configuration that eventually get used by Maven. */ + val name: String) extends Serializable { + + + + override def equals(o: Any): Boolean = o match { + case x: ConfigRef => (this.name == x.name) + case _ => false + } + override def hashCode: Int = { + 37 * (37 * (17 + "ConfigRef".##) + name.##) + } + override def toString: String = { + "ConfigRef(" + name + ")" + } + protected[this] def copy(name: String = name): ConfigRef = { + new ConfigRef(name) + } + def withName(name: String): ConfigRef = { + copy(name = name) + } +} +object ConfigRef extends sbt.librarymanagement.ConfigRefFunctions { + + def apply(name: String): ConfigRef = new ConfigRef(name) +} diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRefFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRefFormats.scala new file mode 100644 index 000000000..9996bd2db --- /dev/null +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRefFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.librarymanagement +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait ConfigRefFormats { self: sjsonnew.BasicJsonProtocol => +implicit lazy val ConfigRefFormat: JsonFormat[sbt.librarymanagement.ConfigRef] = new JsonFormat[sbt.librarymanagement.ConfigRef] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ConfigRef = { + jsOpt match { + case Some(js) => + unbuilder.beginObject(js) + val name = unbuilder.readField[String]("name") + unbuilder.endObject() + sbt.librarymanagement.ConfigRef(name) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.librarymanagement.ConfigRef, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("name", obj.name) + builder.endObject() + } +} +} diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala index 8d1cf1a46..08e493b48 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala @@ -5,6 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement trait LibraryManagementCodec extends sjsonnew.BasicJsonProtocol + with sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.ChecksumFormats with sbt.librarymanagement.ArtifactFormats with sbt.librarymanagement.ArtifactTypeFilterFormats diff --git a/librarymanagement/src/main/contraband/librarymanagement.json b/librarymanagement/src/main/contraband/librarymanagement.json index 7ceabeb73..1f87a59de 100644 --- a/librarymanagement/src/main/contraband/librarymanagement.json +++ b/librarymanagement/src/main/contraband/librarymanagement.json @@ -13,7 +13,7 @@ { "name": "type", "type": "String", "default": "Artifact.DefaultType", "since": "0.0.1" }, { "name": "extension", "type": "String", "default": "Artifact.DefaultExtension", "since": "0.0.1" }, { "name": "classifier", "type": "Option[String]", "default": "None", "since": "0.0.1" }, - { "name": "configurations", "type": "String*", "default": "Vector.empty", "since": "0.0.1" }, + { "name": "configurations", "type": "sbt.librarymanagement.ConfigRef*", "default": "Vector.empty", "since": "0.0.1" }, { "name": "url", "type": "Option[java.net.URL]", "default": "None", "since": "0.0.1" }, { "name": "extraAttributes", "type": "Map[String, String]", "default": "Map.empty", "since": "0.0.1" }, { "name": "checksum", "type": "Option[sbt.librarymanagement.Checksum]", "default": "None", "since": "0.0.1" } @@ -61,6 +61,23 @@ ], "toString": "s\"$caller\"" }, + { + "name": "ConfigRef", + "namespace": "sbt.librarymanagement", + "target": "Scala", + "type": "record", + "doc": [ + "A reference to Configuration." + ], + "fields": [ + { + "name": "name", + "type": "String", + "doc": [ "The name of the configuration that eventually get used by Maven." ] + } + ], + "parentsCompanion": "sbt.librarymanagement.ConfigRefFunctions" + }, { "name": "ConfigurationReport", "namespace": "sbt.librarymanagement", diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala index 121e8d929..48f29920e 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala @@ -603,10 +603,12 @@ private[sbt] object IvySbt { private def toIvyArtifact( moduleID: ModuleDescriptor, a: Artifact, - allConfigurations: Iterable[String] + allConfigurations: Vector[ConfigRef] ): MDArtifact = { val artifact = new MDArtifact(moduleID, a.name, a.`type`, a.extension, null, extra(a, false)) - copyConfigurations(a, artifact.addConfiguration, allConfigurations) + copyConfigurations(a, + (ref: ConfigRef) => { artifact.addConfiguration(ref.name) }, + allConfigurations) artifact } def getExtraAttributes(revID: ExtendableItem): Map[String, String] = { @@ -816,7 +818,7 @@ private[sbt] object IvySbt { url.orNull, extraMap ) - copyConfigurations(artifact, ivyArtifact.addConfiguration) + copyConfigurations(artifact, (ref: ConfigRef) => { ivyArtifact.addConfiguration(ref.name) }) for (conf <- dependencyDescriptor.getModuleConfigurations) dependencyDescriptor.addDependencyArtifact(conf, ivyArtifact) } @@ -849,13 +851,13 @@ private[sbt] object IvySbt { dependencyDescriptor } - def copyConfigurations(artifact: Artifact, addConfiguration: String => Unit): Unit = - copyConfigurations(artifact, addConfiguration, "*" :: Nil) + def copyConfigurations(artifact: Artifact, addConfiguration: ConfigRef => Unit): Unit = + copyConfigurations(artifact, addConfiguration, Vector(ConfigRef("*"))) private[this] def copyConfigurations( artifact: Artifact, - addConfiguration: String => Unit, - allConfigurations: Iterable[String] + addConfiguration: ConfigRef => Unit, + allConfigurations: Vector[ConfigRef] ): Unit = { val confs = if (artifact.configurations.isEmpty) allConfigurations @@ -923,7 +925,7 @@ private[sbt] object IvySbt { configurations.foreach(config => mod.addConfiguration(toIvyConfiguration(config))) def mapArtifacts(moduleID: ModuleDescriptor, artifacts: Seq[Artifact]): Seq[IArtifact] = { - lazy val allConfigurations = moduleID.getPublicConfigurationsNames + lazy val allConfigurations = moduleID.getPublicConfigurationsNames.toVector map ConfigRef.apply for (artifact <- artifacts) yield toIvyArtifact(moduleID, artifact, allConfigurations) } diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala index 85eb001c2..89f81f600 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala @@ -217,7 +217,9 @@ object IvyRetrieve { getType, getExt, Option(getExtraAttribute("classifier")), - getConfigurations.toVector, + getConfigurations.toVector map { c: String => + ConfigRef(c) + }, Option(getUrl) ) } diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala index 92b9fdf1c..62fac2e6b 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ArtifactExtra.scala @@ -11,7 +11,7 @@ abstract class ArtifactExtra { def `type`: String def extension: String def classifier: Option[String] - def configurations: Vector[String] + def configurations: Vector[ConfigRef] def url: Option[URL] def extraAttributes: Map[String, String] def checksum: Option[Checksum] @@ -21,7 +21,7 @@ abstract class ArtifactExtra { `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, - configurations: Vector[String] = configurations, + configurations: Vector[ConfigRef] = configurations, url: Option[URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[Checksum] = checksum @@ -58,7 +58,7 @@ abstract class ArtifactFunctions { `type`: String, extension: String, classifier: Option[String], - configurations: Vector[String], + configurations: Vector[ConfigRef], url: Option[URL] ): Artifact = Artifact(name, `type`, extension, classifier, configurations, url, empty, None) @@ -67,7 +67,7 @@ abstract class ArtifactFunctions { def sources(name: String) = classified(name, SourceClassifier) def javadoc(name: String) = classified(name, DocClassifier) - def pom(name: String) = Artifact(name, PomType, PomType, None, Vector(Pom.name), None) + def pom(name: String) = Artifact(name, PomType, PomType, None, Vector(Pom), None) // Possible ivy artifact types such that sbt will treat those artifacts at sources / docs val DefaultSourceTypes = Set("src", "source", "sources") diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala index 7527f085a..9a65e8b46 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/Configuration.scala @@ -63,6 +63,8 @@ final class Configuration private[sbt] ( def withTransitive(transitive: Boolean): Configuration = { copy(transitive = transitive) } + + def toConfigRef: ConfigRef = ConfigRef(name) } object Configuration { private[sbt] def apply(id: String, name: String): Configuration = diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala index 4d019ffff..ae821954c 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala @@ -134,3 +134,8 @@ private[sbt] object ConfigurationMacro { .enclosingContextChain .map(_.tree.asInstanceOf[c.Tree]) } + +abstract class ConfigRefFunctions { + implicit def configToConfigRef(c: Configuration): ConfigRef = + c.toConfigRef +} From 13e803d199cf0c9838f6e36386babbc3d98cc41c Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 8 Jul 2017 14:57:15 +0200 Subject: [PATCH 3/3] Use ConfigRef in reports --- build.sbt | 3 ++- .../RetrieveConfiguration.scala | 8 +++---- .../sbt/librarymanagement/Caller.scala | 8 +++---- .../sbt/librarymanagement/CallerFormats.scala | 4 ++-- .../sbt/librarymanagement/ConfigRef.scala | 2 +- .../ConfigurationReport.scala | 8 +++---- .../ConfigurationReportFormats.scala | 4 ++-- .../sbt/librarymanagement/InclExclRule.scala | 8 +++---- .../InclExclRuleFormats.scala | 4 ++-- .../sbt/librarymanagement/ModuleReport.scala | 8 +++---- .../ModuleReportFormats.scala | 4 ++-- .../RetrieveConfigurationFormats.scala | 4 ++-- .../main/contraband/librarymanagement.json | 15 ++++++------ .../sbt/internal/librarymanagement/Ivy.scala | 6 ++--- .../librarymanagement/IvyActions.scala | 20 +++++++--------- .../librarymanagement/IvyRetrieve.scala | 8 ++++--- .../internal/librarymanagement/JsonUtil.scala | 4 ++-- .../CachedResolutionResolveEngine.scala | 20 +++++++++------- .../ConfigurationExtra.scala | 1 + .../librarymanagement/DependencyFilter.scala | 24 +++++++++---------- .../librarymanagement/EvictionWarning.scala | 10 ++++---- .../librarymanagement/RichUpdateReport.scala | 10 ++++---- .../librarymanagement/UpdateReportExtra.scala | 14 +++++------ .../src/test/scala/DMSerializationSpec.scala | 2 +- .../librarymanagement/IvyRepoSpec.scala | 4 ++-- project/Dependencies.scala | 1 + 26 files changed, 103 insertions(+), 101 deletions(-) diff --git a/build.sbt b/build.sbt index 295ce27fe..890d24ff0 100644 --- a/build.sbt +++ b/build.sbt @@ -72,7 +72,8 @@ lazy val lm = (project in file("librarymanagement")) gigahorseOkhttp, okhttpUrlconnection, sjsonnewScalaJson.value % Optional, - scalaTest), + scalaTest, + scalaCheck), libraryDependencies ++= scalaXml.value, resourceGenerators in Compile += Def.task( Util.generateVersionFile( diff --git a/librarymanagement/src/main/contraband-scala/sbt/internal/librarymanagement/RetrieveConfiguration.scala b/librarymanagement/src/main/contraband-scala/sbt/internal/librarymanagement/RetrieveConfiguration.scala index e1be8c9db..0a6551f33 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/internal/librarymanagement/RetrieveConfiguration.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/internal/librarymanagement/RetrieveConfiguration.scala @@ -8,7 +8,7 @@ final class RetrieveConfiguration private ( val retrieveDirectory: java.io.File, val outputPattern: String, val sync: Boolean, - val configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]]) extends Serializable { + val configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]]) extends Serializable { private def this(retrieveDirectory: java.io.File, outputPattern: String) = this(retrieveDirectory, outputPattern, false, None) @@ -22,7 +22,7 @@ final class RetrieveConfiguration private ( override def toString: String = { "RetrieveConfiguration(" + retrieveDirectory + ", " + outputPattern + ", " + sync + ", " + configurationsToRetrieve + ")" } - protected[this] def copy(retrieveDirectory: java.io.File = retrieveDirectory, outputPattern: String = outputPattern, sync: Boolean = sync, configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]] = configurationsToRetrieve): RetrieveConfiguration = { + protected[this] def copy(retrieveDirectory: java.io.File = retrieveDirectory, outputPattern: String = outputPattern, sync: Boolean = sync, configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]] = configurationsToRetrieve): RetrieveConfiguration = { new RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve) } def withRetrieveDirectory(retrieveDirectory: java.io.File): RetrieveConfiguration = { @@ -34,12 +34,12 @@ final class RetrieveConfiguration private ( def withSync(sync: Boolean): RetrieveConfiguration = { copy(sync = sync) } - def withConfigurationsToRetrieve(configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]]): RetrieveConfiguration = { + def withConfigurationsToRetrieve(configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]]): RetrieveConfiguration = { copy(configurationsToRetrieve = configurationsToRetrieve) } } object RetrieveConfiguration { def apply(retrieveDirectory: java.io.File, outputPattern: String): RetrieveConfiguration = new RetrieveConfiguration(retrieveDirectory, outputPattern, false, None) - def apply(retrieveDirectory: java.io.File, outputPattern: String, sync: Boolean, configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]]): RetrieveConfiguration = new RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve) + def apply(retrieveDirectory: java.io.File, outputPattern: String, sync: Boolean, configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]]): RetrieveConfiguration = new RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Caller.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Caller.scala index 0770bc9e7..3cfd92909 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Caller.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/Caller.scala @@ -6,7 +6,7 @@ package sbt.librarymanagement final class Caller private ( val caller: sbt.librarymanagement.ModuleID, - val callerConfigurations: Vector[String], + val callerConfigurations: Vector[sbt.librarymanagement.ConfigRef], val callerExtraAttributes: Map[String, String], val isForceDependency: Boolean, val isChangingDependency: Boolean, @@ -25,13 +25,13 @@ final class Caller private ( override def toString: String = { s"$caller" } - protected[this] def copy(caller: sbt.librarymanagement.ModuleID = caller, callerConfigurations: Vector[String] = callerConfigurations, callerExtraAttributes: Map[String, String] = callerExtraAttributes, isForceDependency: Boolean = isForceDependency, isChangingDependency: Boolean = isChangingDependency, isTransitiveDependency: Boolean = isTransitiveDependency, isDirectlyForceDependency: Boolean = isDirectlyForceDependency): Caller = { + protected[this] def copy(caller: sbt.librarymanagement.ModuleID = caller, callerConfigurations: Vector[sbt.librarymanagement.ConfigRef] = callerConfigurations, callerExtraAttributes: Map[String, String] = callerExtraAttributes, isForceDependency: Boolean = isForceDependency, isChangingDependency: Boolean = isChangingDependency, isTransitiveDependency: Boolean = isTransitiveDependency, isDirectlyForceDependency: Boolean = isDirectlyForceDependency): Caller = { new Caller(caller, callerConfigurations, callerExtraAttributes, isForceDependency, isChangingDependency, isTransitiveDependency, isDirectlyForceDependency) } def withCaller(caller: sbt.librarymanagement.ModuleID): Caller = { copy(caller = caller) } - def withCallerConfigurations(callerConfigurations: Vector[String]): Caller = { + def withCallerConfigurations(callerConfigurations: Vector[sbt.librarymanagement.ConfigRef]): Caller = { copy(callerConfigurations = callerConfigurations) } def withCallerExtraAttributes(callerExtraAttributes: Map[String, String]): Caller = { @@ -52,5 +52,5 @@ final class Caller private ( } object Caller { - def apply(caller: sbt.librarymanagement.ModuleID, callerConfigurations: Vector[String], callerExtraAttributes: Map[String, String], isForceDependency: Boolean, isChangingDependency: Boolean, isTransitiveDependency: Boolean, isDirectlyForceDependency: Boolean): Caller = new Caller(caller, callerConfigurations, callerExtraAttributes, isForceDependency, isChangingDependency, isTransitiveDependency, isDirectlyForceDependency) + def apply(caller: sbt.librarymanagement.ModuleID, callerConfigurations: Vector[sbt.librarymanagement.ConfigRef], callerExtraAttributes: Map[String, String], isForceDependency: Boolean, isChangingDependency: Boolean, isTransitiveDependency: Boolean, isDirectlyForceDependency: Boolean): Caller = new Caller(caller, callerConfigurations, callerExtraAttributes, isForceDependency, isChangingDependency, isTransitiveDependency, isDirectlyForceDependency) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/CallerFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/CallerFormats.scala index f0994fef8..a7b863a5a 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/CallerFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/CallerFormats.scala @@ -5,14 +5,14 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait CallerFormats { self: sbt.librarymanagement.ModuleIDFormats with sjsonnew.BasicJsonProtocol => +trait CallerFormats { self: sbt.librarymanagement.ModuleIDFormats with sbt.librarymanagement.ConfigRefFormats with sjsonnew.BasicJsonProtocol => implicit lazy val CallerFormat: JsonFormat[sbt.librarymanagement.Caller] = new JsonFormat[sbt.librarymanagement.Caller] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.Caller = { jsOpt match { case Some(js) => unbuilder.beginObject(js) val caller = unbuilder.readField[sbt.librarymanagement.ModuleID]("caller") - val callerConfigurations = unbuilder.readField[Vector[String]]("callerConfigurations") + val callerConfigurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("callerConfigurations") val callerExtraAttributes = unbuilder.readField[Map[String, String]]("callerExtraAttributes") val isForceDependency = unbuilder.readField[Boolean]("isForceDependency") val isChangingDependency = unbuilder.readField[Boolean]("isChangingDependency") diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala index b6e1b12b3..2fd00af21 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigRef.scala @@ -19,7 +19,7 @@ final class ConfigRef private ( 37 * (37 * (17 + "ConfigRef".##) + name.##) } override def toString: String = { - "ConfigRef(" + name + ")" + name } protected[this] def copy(name: String = name): ConfigRef = { new ConfigRef(name) diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReport.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReport.scala index 2fa190dea..5929ae95d 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReport.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReport.scala @@ -7,7 +7,7 @@ package sbt.librarymanagement /** Provides information about resolution of a single configuration. */ final class ConfigurationReport private ( /** the configuration this report is for. */ - val configuration: String, + val configuration: sbt.librarymanagement.ConfigRef, /** a sequence containing one report for each module resolved for this configuration. */ val modules: Vector[sbt.librarymanagement.ModuleReport], /** a sequence containing one report for each org/name, which may or may not be part of the final resolution. */ @@ -27,10 +27,10 @@ final class ConfigurationReport private ( (if (details.isEmpty) modules.mkString + details.flatMap(_.modules).filter(_.evicted).map("\t\t(EVICTED) " + _ + "\n").mkString else details.mkString) } - protected[this] def copy(configuration: String = configuration, modules: Vector[sbt.librarymanagement.ModuleReport] = modules, details: Vector[sbt.librarymanagement.OrganizationArtifactReport] = details): ConfigurationReport = { + protected[this] def copy(configuration: sbt.librarymanagement.ConfigRef = configuration, modules: Vector[sbt.librarymanagement.ModuleReport] = modules, details: Vector[sbt.librarymanagement.OrganizationArtifactReport] = details): ConfigurationReport = { new ConfigurationReport(configuration, modules, details) } - def withConfiguration(configuration: String): ConfigurationReport = { + def withConfiguration(configuration: sbt.librarymanagement.ConfigRef): ConfigurationReport = { copy(configuration = configuration) } def withModules(modules: Vector[sbt.librarymanagement.ModuleReport]): ConfigurationReport = { @@ -42,5 +42,5 @@ final class ConfigurationReport private ( } object ConfigurationReport { - def apply(configuration: String, modules: Vector[sbt.librarymanagement.ModuleReport], details: Vector[sbt.librarymanagement.OrganizationArtifactReport]): ConfigurationReport = new ConfigurationReport(configuration, modules, details) + def apply(configuration: sbt.librarymanagement.ConfigRef, modules: Vector[sbt.librarymanagement.ModuleReport], details: Vector[sbt.librarymanagement.OrganizationArtifactReport]): ConfigurationReport = new ConfigurationReport(configuration, modules, details) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReportFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReportFormats.scala index 81a1219ad..d94d09184 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReportFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ConfigurationReportFormats.scala @@ -5,13 +5,13 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait ConfigurationReportFormats { self: sbt.librarymanagement.ModuleReportFormats with sbt.librarymanagement.OrganizationArtifactReportFormats with sjsonnew.BasicJsonProtocol => +trait ConfigurationReportFormats { self: sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.ModuleReportFormats with sbt.librarymanagement.OrganizationArtifactReportFormats with sjsonnew.BasicJsonProtocol => implicit lazy val ConfigurationReportFormat: JsonFormat[sbt.librarymanagement.ConfigurationReport] = new JsonFormat[sbt.librarymanagement.ConfigurationReport] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ConfigurationReport = { jsOpt match { case Some(js) => unbuilder.beginObject(js) - val configuration = unbuilder.readField[String]("configuration") + val configuration = unbuilder.readField[sbt.librarymanagement.ConfigRef]("configuration") val modules = unbuilder.readField[Vector[sbt.librarymanagement.ModuleReport]]("modules") val details = unbuilder.readField[Vector[sbt.librarymanagement.OrganizationArtifactReport]]("details") unbuilder.endObject() diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRule.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRule.scala index cd2032c80..dde013ed2 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRule.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRule.scala @@ -17,7 +17,7 @@ final class InclExclRule private ( val organization: String, val name: String, val artifact: String, - val configurations: Vector[String], + val configurations: Vector[sbt.librarymanagement.ConfigRef], val crossVersion: sbt.librarymanagement.CrossVersion) extends Serializable { private def this() = this("*", "*", "*", Vector.empty, sbt.librarymanagement.Disabled()) @@ -32,7 +32,7 @@ final class InclExclRule private ( override def toString: String = { "InclExclRule(" + organization + ", " + name + ", " + artifact + ", " + configurations + ", " + crossVersion + ")" } - protected[this] def copy(organization: String = organization, name: String = name, artifact: String = artifact, configurations: Vector[String] = configurations, crossVersion: sbt.librarymanagement.CrossVersion = crossVersion): InclExclRule = { + protected[this] def copy(organization: String = organization, name: String = name, artifact: String = artifact, configurations: Vector[sbt.librarymanagement.ConfigRef] = configurations, crossVersion: sbt.librarymanagement.CrossVersion = crossVersion): InclExclRule = { new InclExclRule(organization, name, artifact, configurations, crossVersion) } def withOrganization(organization: String): InclExclRule = { @@ -44,7 +44,7 @@ final class InclExclRule private ( def withArtifact(artifact: String): InclExclRule = { copy(artifact = artifact) } - def withConfigurations(configurations: Vector[String]): InclExclRule = { + def withConfigurations(configurations: Vector[sbt.librarymanagement.ConfigRef]): InclExclRule = { copy(configurations = configurations) } def withCrossVersion(crossVersion: sbt.librarymanagement.CrossVersion): InclExclRule = { @@ -54,5 +54,5 @@ final class InclExclRule private ( object InclExclRule extends sbt.librarymanagement.InclExclRuleFunctions { def apply(): InclExclRule = new InclExclRule("*", "*", "*", Vector.empty, sbt.librarymanagement.Disabled()) - def apply(organization: String, name: String, artifact: String, configurations: Vector[String], crossVersion: sbt.librarymanagement.CrossVersion): InclExclRule = new InclExclRule(organization, name, artifact, configurations, crossVersion) + def apply(organization: String, name: String, artifact: String, configurations: Vector[sbt.librarymanagement.ConfigRef], crossVersion: sbt.librarymanagement.CrossVersion): InclExclRule = new InclExclRule(organization, name, artifact, configurations, crossVersion) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRuleFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRuleFormats.scala index 76a3c49b8..ed1878b60 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRuleFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/InclExclRuleFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait InclExclRuleFormats { self: sbt.librarymanagement.CrossVersionFormats with sjsonnew.BasicJsonProtocol => +trait InclExclRuleFormats { self: sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.CrossVersionFormats with sjsonnew.BasicJsonProtocol => implicit lazy val InclExclRuleFormat: JsonFormat[sbt.librarymanagement.InclExclRule] = new JsonFormat[sbt.librarymanagement.InclExclRule] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.InclExclRule = { jsOpt match { @@ -14,7 +14,7 @@ implicit lazy val InclExclRuleFormat: JsonFormat[sbt.librarymanagement.InclExclR val organization = unbuilder.readField[String]("organization") val name = unbuilder.readField[String]("name") val artifact = unbuilder.readField[String]("artifact") - val configurations = unbuilder.readField[Vector[String]]("configurations") + val configurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("configurations") val crossVersion = unbuilder.readField[sbt.librarymanagement.CrossVersion]("crossVersion") unbuilder.endObject() sbt.librarymanagement.InclExclRule(organization, name, artifact, configurations, crossVersion) diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReport.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReport.scala index 625b142f2..13f44f54e 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReport.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReport.scala @@ -24,7 +24,7 @@ final class ModuleReport private ( val extraAttributes: Map[String, String], val isDefault: Option[Boolean], val branch: Option[String], - val configurations: Vector[String], + val configurations: Vector[sbt.librarymanagement.ConfigRef], val licenses: Vector[scala.Tuple2[String, Option[String]]], val callers: Vector[sbt.librarymanagement.Caller]) extends sbt.librarymanagement.ModuleReportExtra with Serializable { @@ -41,7 +41,7 @@ final class ModuleReport private ( s"\t\t$module: " + (if (arts.size <= 1) "" else "\n\t\t\t") + arts.mkString("\n\t\t\t") + "\n" } - protected[this] def copy(module: sbt.librarymanagement.ModuleID = module, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]] = artifacts, missingArtifacts: Vector[sbt.librarymanagement.Artifact] = missingArtifacts, status: Option[String] = status, publicationDate: Option[java.util.Calendar] = publicationDate, resolver: Option[String] = resolver, artifactResolver: Option[String] = artifactResolver, evicted: Boolean = evicted, evictedData: Option[String] = evictedData, evictedReason: Option[String] = evictedReason, problem: Option[String] = problem, homepage: Option[String] = homepage, extraAttributes: Map[String, String] = extraAttributes, isDefault: Option[Boolean] = isDefault, branch: Option[String] = branch, configurations: Vector[String] = configurations, licenses: Vector[scala.Tuple2[String, Option[String]]] = licenses, callers: Vector[sbt.librarymanagement.Caller] = callers): ModuleReport = { + protected[this] def copy(module: sbt.librarymanagement.ModuleID = module, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]] = artifacts, missingArtifacts: Vector[sbt.librarymanagement.Artifact] = missingArtifacts, status: Option[String] = status, publicationDate: Option[java.util.Calendar] = publicationDate, resolver: Option[String] = resolver, artifactResolver: Option[String] = artifactResolver, evicted: Boolean = evicted, evictedData: Option[String] = evictedData, evictedReason: Option[String] = evictedReason, problem: Option[String] = problem, homepage: Option[String] = homepage, extraAttributes: Map[String, String] = extraAttributes, isDefault: Option[Boolean] = isDefault, branch: Option[String] = branch, configurations: Vector[sbt.librarymanagement.ConfigRef] = configurations, licenses: Vector[scala.Tuple2[String, Option[String]]] = licenses, callers: Vector[sbt.librarymanagement.Caller] = callers): ModuleReport = { new ModuleReport(module, artifacts, missingArtifacts, status, publicationDate, resolver, artifactResolver, evicted, evictedData, evictedReason, problem, homepage, extraAttributes, isDefault, branch, configurations, licenses, callers) } def withModule(module: sbt.librarymanagement.ModuleID): ModuleReport = { @@ -89,7 +89,7 @@ final class ModuleReport private ( def withBranch(branch: Option[String]): ModuleReport = { copy(branch = branch) } - def withConfigurations(configurations: Vector[String]): ModuleReport = { + def withConfigurations(configurations: Vector[sbt.librarymanagement.ConfigRef]): ModuleReport = { copy(configurations = configurations) } def withLicenses(licenses: Vector[scala.Tuple2[String, Option[String]]]): ModuleReport = { @@ -102,5 +102,5 @@ final class ModuleReport private ( object ModuleReport { def apply(module: sbt.librarymanagement.ModuleID, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]], missingArtifacts: Vector[sbt.librarymanagement.Artifact]): ModuleReport = new ModuleReport(module, artifacts, missingArtifacts, None, None, None, None, false, None, None, None, None, Map.empty, None, None, Vector.empty, Vector.empty, Vector.empty) - def apply(module: sbt.librarymanagement.ModuleID, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]], missingArtifacts: Vector[sbt.librarymanagement.Artifact], status: Option[String], publicationDate: Option[java.util.Calendar], resolver: Option[String], artifactResolver: Option[String], evicted: Boolean, evictedData: Option[String], evictedReason: Option[String], problem: Option[String], homepage: Option[String], extraAttributes: Map[String, String], isDefault: Option[Boolean], branch: Option[String], configurations: Vector[String], licenses: Vector[scala.Tuple2[String, Option[String]]], callers: Vector[sbt.librarymanagement.Caller]): ModuleReport = new ModuleReport(module, artifacts, missingArtifacts, status, publicationDate, resolver, artifactResolver, evicted, evictedData, evictedReason, problem, homepage, extraAttributes, isDefault, branch, configurations, licenses, callers) + def apply(module: sbt.librarymanagement.ModuleID, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]], missingArtifacts: Vector[sbt.librarymanagement.Artifact], status: Option[String], publicationDate: Option[java.util.Calendar], resolver: Option[String], artifactResolver: Option[String], evicted: Boolean, evictedData: Option[String], evictedReason: Option[String], problem: Option[String], homepage: Option[String], extraAttributes: Map[String, String], isDefault: Option[Boolean], branch: Option[String], configurations: Vector[sbt.librarymanagement.ConfigRef], licenses: Vector[scala.Tuple2[String, Option[String]]], callers: Vector[sbt.librarymanagement.Caller]): ModuleReport = new ModuleReport(module, artifacts, missingArtifacts, status, publicationDate, resolver, artifactResolver, evicted, evictedData, evictedReason, problem, homepage, extraAttributes, isDefault, branch, configurations, licenses, callers) } diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReportFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReportFormats.scala index fedf5b263..78052a649 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReportFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/ModuleReportFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait ModuleReportFormats { self: sbt.librarymanagement.ModuleIDFormats with sbt.librarymanagement.ArtifactFormats with sbt.librarymanagement.CallerFormats with sjsonnew.BasicJsonProtocol => +trait ModuleReportFormats { self: sbt.librarymanagement.ModuleIDFormats with sbt.librarymanagement.ArtifactFormats with sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.CallerFormats with sjsonnew.BasicJsonProtocol => implicit lazy val ModuleReportFormat: JsonFormat[sbt.librarymanagement.ModuleReport] = new JsonFormat[sbt.librarymanagement.ModuleReport] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ModuleReport = { jsOpt match { @@ -26,7 +26,7 @@ implicit lazy val ModuleReportFormat: JsonFormat[sbt.librarymanagement.ModuleRep val extraAttributes = unbuilder.readField[Map[String, String]]("extraAttributes") val isDefault = unbuilder.readField[Option[Boolean]]("isDefault") val branch = unbuilder.readField[Option[String]]("branch") - val configurations = unbuilder.readField[Vector[String]]("configurations") + val configurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("configurations") val licenses = unbuilder.readField[Vector[scala.Tuple2[String, Option[String]]]]("licenses") val callers = unbuilder.readField[Vector[sbt.librarymanagement.Caller]]("callers") unbuilder.endObject() diff --git a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/RetrieveConfigurationFormats.scala b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/RetrieveConfigurationFormats.scala index 9fbb51b2d..158e305cd 100644 --- a/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/RetrieveConfigurationFormats.scala +++ b/librarymanagement/src/main/contraband-scala/sbt/librarymanagement/RetrieveConfigurationFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait RetrieveConfigurationFormats { self: sbt.librarymanagement.ConfigurationFormats with sjsonnew.BasicJsonProtocol => +trait RetrieveConfigurationFormats { self: sbt.librarymanagement.ConfigRefFormats with sjsonnew.BasicJsonProtocol => implicit lazy val RetrieveConfigurationFormat: JsonFormat[sbt.internal.librarymanagement.RetrieveConfiguration] = new JsonFormat[sbt.internal.librarymanagement.RetrieveConfiguration] { override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.librarymanagement.RetrieveConfiguration = { jsOpt match { @@ -14,7 +14,7 @@ implicit lazy val RetrieveConfigurationFormat: JsonFormat[sbt.internal.libraryma val retrieveDirectory = unbuilder.readField[java.io.File]("retrieveDirectory") val outputPattern = unbuilder.readField[String]("outputPattern") val sync = unbuilder.readField[Boolean]("sync") - val configurationsToRetrieve = unbuilder.readField[Option[Set[sbt.librarymanagement.Configuration]]]("configurationsToRetrieve") + val configurationsToRetrieve = unbuilder.readField[Option[Set[sbt.librarymanagement.ConfigRef]]]("configurationsToRetrieve") unbuilder.endObject() sbt.internal.librarymanagement.RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve) case None => diff --git a/librarymanagement/src/main/contraband/librarymanagement.json b/librarymanagement/src/main/contraband/librarymanagement.json index 1f87a59de..28422cfdd 100644 --- a/librarymanagement/src/main/contraband/librarymanagement.json +++ b/librarymanagement/src/main/contraband/librarymanagement.json @@ -52,7 +52,7 @@ "type": "record", "fields": [ { "name": "caller", "type": "sbt.librarymanagement.ModuleID" }, - { "name": "callerConfigurations", "type": "String*" }, + { "name": "callerConfigurations", "type": "sbt.librarymanagement.ConfigRef*" }, { "name": "callerExtraAttributes", "type": "Map[String, String]" }, { "name": "isForceDependency", "type": "boolean" }, { "name": "isChangingDependency", "type": "boolean" }, @@ -76,7 +76,8 @@ "doc": [ "The name of the configuration that eventually get used by Maven." ] } ], - "parentsCompanion": "sbt.librarymanagement.ConfigRefFunctions" + "parentsCompanion": "sbt.librarymanagement.ConfigRefFunctions", + "toString": "name" }, { "name": "ConfigurationReport", @@ -88,7 +89,7 @@ ], "parents": "sbt.librarymanagement.ConfigurationReportExtra", "fields": [ - { "name": "configuration", "type": "String", "doc": [ "the configuration this report is for." ] }, + { "name": "configuration", "type": "sbt.librarymanagement.ConfigRef", "doc": [ "the configuration this report is for." ] }, { "name": "modules", "type": "sbt.librarymanagement.ModuleReport*", @@ -233,7 +234,7 @@ { "name": "organization", "type": "String", "default": "\"*\"", "since": "0.0.1" }, { "name": "name", "type": "String", "default": "\"*\"", "since": "0.0.1" }, { "name": "artifact", "type": "String", "default": "\"*\"", "since": "0.0.1" }, - { "name": "configurations", "type": "String*", "default": "Vector.empty", "since": "0.0.1" }, + { "name": "configurations", "type": "sbt.librarymanagement.ConfigRef*", "default": "Vector.empty", "since": "0.0.1" }, { "name": "crossVersion", "type": "sbt.librarymanagement.CrossVersion", "default": "sbt.librarymanagement.Disabled()", "since": "0.0.1"} ], "parentsCompanion": "sbt.librarymanagement.InclExclRuleFunctions" @@ -351,7 +352,7 @@ { "name": "extraAttributes", "type": "Map[String, String]", "default": "Map.empty", "since": "0.0.1" }, { "name": "isDefault", "type": "Option[Boolean]", "default": "None", "since": "0.0.1" }, { "name": "branch", "type": "Option[String]", "default": "None", "since": "0.0.1" }, - { "name": "configurations", "type": "String*", "default": "Vector.empty", "since": "0.0.1" }, + { "name": "configurations", "type": "sbt.librarymanagement.ConfigRef*", "default": "Vector.empty", "since": "0.0.1" }, { "name": "licenses", "type": "scala.Tuple2[String, Option[String]]*", "default": "Vector.empty", "since": "0.0.1" }, { "name": "callers", "type": "sbt.librarymanagement.Caller*", "default": "Vector.empty", "since": "0.0.1" } ], @@ -805,8 +806,8 @@ "fields": [ { "name": "retrieveDirectory", "type": "java.io.File" }, { "name": "outputPattern", "type": "String" }, - { "name": "sync", "type": "boolean", "default": "false", "since": "0.0.1" }, - { "name": "configurationsToRetrieve", "type": "Option[Set[sbt.librarymanagement.Configuration]]", "default": "None", "since": "0.0.1" } + { "name": "sync", "type": "boolean", "default": "false", "since": "0.0.1" }, + { "name": "configurationsToRetrieve", "type": "Option[Set[sbt.librarymanagement.ConfigRef]]", "default": "None", "since": "0.0.1" } ] }, { diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala index 48f29920e..ee4977559 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala @@ -829,7 +829,7 @@ private[sbt] object IvySbt { IvyScala.excludeRule( excls.organization, excls.name, - excls.configurations, + excls.configurations map { _.name }, excls.artifact ) ) @@ -842,7 +842,7 @@ private[sbt] object IvySbt { IvyScala.includeRule( incls.organization, incls.name, - incls.configurations, + incls.configurations map { _.name }, incls.artifact ) ) @@ -877,7 +877,7 @@ private[sbt] object IvySbt { val exclude = CrossVersion.substituteCross(exclude0, ivyScala) val confs = if (exclude.configurations.isEmpty) moduleID.getConfigurationsNames.toList - else exclude.configurations + else exclude.configurations map { _.name } val excludeRule = IvyScala.excludeRule(exclude.organization, exclude.name, confs, exclude.artifact) moduleID.addExcludeRule(excludeRule) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala index d989d2cd4..acc8849a5 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala @@ -541,19 +541,15 @@ object IvyActions { config: RetrieveConfiguration ): UpdateReport = { val copyChecksums = ivy.getVariable(ConvertResolver.ManagedChecksums).toBoolean - val toRetrieve = config.configurationsToRetrieve + val toRetrieve: Option[Set[ConfigRef]] = config.configurationsToRetrieve val base = config.retrieveDirectory val pattern = config.outputPattern - val configurationNames = toRetrieve match { - case None => None - case Some(configs) => Some(configs.map(_.name)) - } val existingFiles = PathFinder(base).allPaths.get filterNot { _.isDirectory } val toCopy = new collection.mutable.HashSet[(File, File)] - val retReport = report retrieve { (conf, mid, art, cached) => - configurationNames match { + val retReport = report retrieve { (conf: ConfigRef, mid, art, cached) => + toRetrieve match { case None => performRetrieve(conf, mid, art, base, pattern, cached, copyChecksums, toCopy) - case Some(names) if names(conf) => + case Some(refs) if refs(conf) => performRetrieve(conf, mid, art, base, pattern, cached, copyChecksums, toCopy) case _ => cached } @@ -572,7 +568,7 @@ object IvyActions { } private def performRetrieve( - conf: String, + conf: ConfigRef, mid: ModuleID, art: Artifact, base: File, @@ -603,7 +599,7 @@ object IvyActions { } private def retrieveTarget( - conf: String, + conf: ConfigRef, mid: ModuleID, art: Artifact, base: File, @@ -611,7 +607,7 @@ object IvyActions { ): File = new File(base, substitute(conf, mid, art, pattern)) - private def substitute(conf: String, mid: ModuleID, art: Artifact, pattern: String): String = { + private def substitute(conf: ConfigRef, mid: ModuleID, art: Artifact, pattern: String): String = { val mextra = IvySbt.javaMap(mid.extraAttributes, true) val aextra = IvySbt.extra(art, true) IvyPatternHelper.substitute( @@ -623,7 +619,7 @@ object IvyActions { art.name, art.`type`, art.extension, - conf, + conf.name, null, mextra, aextra diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala index 89f81f600..728ffde1b 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala @@ -89,7 +89,7 @@ object IvyRetrieve { def toCaller(caller: IvyCaller): Caller = { val m = toModuleID(caller.getModuleRevisionId) val callerConfigurations = caller.getCallerConfigurations.toVector collect { - case x if nonEmptyString(x).isDefined => x + case x if nonEmptyString(x).isDefined => ConfigRef(x) } val ddOpt = Option(caller.getDependencyDescriptor) val (extraAttributes, isForce, isChanging, isTransitive, isDirectlyForce) = ddOpt match { @@ -167,7 +167,9 @@ object IvyRetrieve { case _ => dep.getResolvedId.getExtraAttributes }) val isDefault = Option(dep.getDescriptor) map { _.isDefault } - val configurations = dep.getConfigurations(confReport.getConfiguration).toVector + val configurations = dep.getConfigurations(confReport.getConfiguration).toVector map { + ConfigRef(_) + } val licenses: Vector[(String, Option[String])] = mdOpt match { case Some(md) => md.getLicenses.toVector collect { @@ -235,7 +237,7 @@ object IvyRetrieve { UpdateStats(report.getResolveTime, report.getDownloadTime, report.getDownloadSize, false) def configurationReport(confReport: ConfigurationResolveReport): ConfigurationReport = ConfigurationReport( - confReport.getConfiguration, + ConfigRef(confReport.getConfiguration), moduleReports(confReport), organizationArtifactReports(confReport) ) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/JsonUtil.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/JsonUtil.scala index 2780d5e12..4532b019e 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/JsonUtil.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/JsonUtil.scala @@ -35,7 +35,7 @@ private[sbt] object JsonUtil { def toLite(ur: UpdateReport): UpdateReportLite = UpdateReportLite(ur.configurations map { cr => ConfigurationReportLite( - cr.configuration, + cr.configuration.name, cr.details map { oar => OrganizationArtifactReport( @@ -92,7 +92,7 @@ private[sbt] object JsonUtil { !mr.evicted && mr.problem.isEmpty } } - ConfigurationReport(cr.configuration, modules, details) + ConfigurationReport(ConfigRef(cr.configuration), modules, details) } UpdateReport(cachedDescriptor, configReports, stats, Map.empty) } diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala index cfb2cc755..e6985e943 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala @@ -512,14 +512,16 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { ) val configReports = rootModuleConfigs map { conf => log.debug("::: -----------") - val crs = reports flatMap { _.configurations filter { _.configuration == conf.getName } } - mergeConfigurationReports(conf.getName, crs, os, log) + val crs = reports flatMap { + _.configurations filter { _.configuration.name == conf.getName } + } + mergeConfigurationReports(ConfigRef(conf.getName), crs, os, log) } UpdateReport(cachedDescriptor, configReports, stats, Map.empty) } // memory usage 62%, of which 58% is in mergeOrganizationArtifactReports def mergeConfigurationReports( - rootModuleConf: String, + rootModuleConf: ConfigRef, reports: Vector[ConfigurationReport], os: Vector[IvyOverride], log: Logger @@ -539,7 +541,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { * Returns a tuple of (merged org + name combo, newly evicted modules) */ def mergeOrganizationArtifactReports( - rootModuleConf: String, + rootModuleConf: ConfigRef, reports0: Vector[OrganizationArtifactReport], os: Vector[IvyOverride], log: Logger @@ -735,7 +737,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { * Returns a touple of (surviving modules ++ non-conflicting modules, newly evicted modules). */ def mergeModuleReports( - rootModuleConf: String, + rootModuleConf: ConfigRef, modules: Vector[ModuleReport], os: Vector[IvyOverride], log: Logger @@ -787,7 +789,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { * This transitively evicts any non-evicted modules whose only callers are newly evicted. */ def transitivelyEvict( - rootModuleConf: String, + rootModuleConf: ConfigRef, pairs: List[(String, String)], reports0: Map[(String, String), Vector[OrganizationArtifactReport]], evicted0: Vector[ModuleReport], @@ -833,7 +835,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { * which may be because Ivy makes all Maven dependencies as forced="true". */ def resolveConflict( - rootModuleConf: String, + rootModuleConf: ConfigRef, conflicts: Vector[ModuleReport], os: Vector[IvyOverride], log: Logger @@ -945,7 +947,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { } // These are the configurations from the original project we want to resolve. val rootModuleConfs = md0.getConfigurations.toVector - val configurations0 = ur.configurations.toVector + val configurations0: Vector[ConfigurationReport] = ur.configurations.toVector // This is how md looks from md0 via dd's mapping. val remappedConfigs0: Map[String, Vector[String]] = Map(rootModuleConfs map { conf0 => val remapped @@ -969,7 +971,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { val remappedCRs = configurations0 filter { cr => remappedConfigs(conf0.getName) contains cr.configuration } - mergeConfigurationReports(conf0.getName, remappedCRs, os, log) + mergeConfigurationReports(ConfigRef(conf0.getName), remappedCRs, os, log) } UpdateReport(ur.cachedDescriptor, configurations, ur.stats, ur.stamps) } diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala index ae821954c..f6a19955d 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala @@ -14,6 +14,7 @@ object Configurations { def defaultInternal: Seq[Configuration] = Seq(CompileInternal, RuntimeInternal, TestInternal) def auxiliary: Seq[Configuration] = Seq(Pom) def names(cs: Seq[Configuration]) = cs.map(_.name) + def refs(cs: Seq[Configuration]) = cs.map(_.toConfigRef) lazy val RuntimeInternal = optionalInternal(Runtime) lazy val TestInternal = fullInternal(Test) diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/DependencyFilter.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/DependencyFilter.scala index 27900061c..969271fe9 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/DependencyFilter.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/DependencyFilter.scala @@ -28,7 +28,7 @@ trait DependencyFilterExtra { } def configurationFilter(name: NameFilter = AllPassFilter): ConfigurationFilter = new ConfigurationFilter { - def apply(c: String): Boolean = name.accept(c) + def apply(c: ConfigRef): Boolean = name.accept(c.name) } } object DependencyFilter extends DependencyFilterExtra { @@ -38,7 +38,7 @@ object DependencyFilter extends DependencyFilterExtra { artifact: ArtifactFilter = artifactFilter() ): DependencyFilter = new DependencyFilter { - def apply(c: String, m: ModuleID, a: Artifact): Boolean = + def apply(c: ConfigRef, m: ModuleID, a: Artifact): Boolean = configuration(c) && module(m) && artifact(a) } def apply( @@ -47,7 +47,7 @@ object DependencyFilter extends DependencyFilterExtra { combine: (Boolean, Boolean) => Boolean ): DependencyFilter = new DependencyFilter { - def apply(c: String, m: ModuleID, a: Artifact): Boolean = combine(x(c, m, a), y(c, m, a)) + def apply(c: ConfigRef, m: ModuleID, a: Artifact): Boolean = combine(x(c, m, a), y(c, m, a)) } def allPass: DependencyFilter = configurationFilter() implicit def fnToModuleFilter(f: ModuleID => Boolean): ModuleFilter = new ModuleFilter { @@ -56,12 +56,12 @@ object DependencyFilter extends DependencyFilterExtra { implicit def fnToArtifactFilter(f: Artifact => Boolean): ArtifactFilter = new ArtifactFilter { def apply(m: Artifact) = f(m) } - implicit def fnToConfigurationFilter(f: String => Boolean): ConfigurationFilter = - new ConfigurationFilter { def apply(c: String) = f(c) } + implicit def fnToConfigurationFilter(f: ConfigRef => Boolean): ConfigurationFilter = + new ConfigurationFilter { def apply(c: ConfigRef) = f(c) } implicit def subDepFilterToFn[Arg](f: SubDepFilter[Arg, _]): Arg => Boolean = f apply _ } trait DependencyFilter { - def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean + def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean final def &&(o: DependencyFilter) = DependencyFilter(this, o, _ && _) final def ||(o: DependencyFilter) = DependencyFilter(this, o, _ || _) final def --(o: DependencyFilter) = DependencyFilter(this, o, _ && !_) @@ -80,20 +80,20 @@ trait ModuleFilter extends SubDepFilter[ModuleID, ModuleFilter] { protected final def make(f: ModuleID => Boolean) = new ModuleFilter { def apply(m: ModuleID) = f(m) } - final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean = + final def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean = apply(module) } trait ArtifactFilter extends SubDepFilter[Artifact, ArtifactFilter] { protected final def make(f: Artifact => Boolean) = new ArtifactFilter { def apply(m: Artifact) = f(m) } - final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean = + final def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean = apply(artifact) } -trait ConfigurationFilter extends SubDepFilter[String, ConfigurationFilter] { - protected final def make(f: String => Boolean) = new ConfigurationFilter { - def apply(m: String) = f(m) +trait ConfigurationFilter extends SubDepFilter[ConfigRef, ConfigurationFilter] { + protected final def make(f: ConfigRef => Boolean) = new ConfigurationFilter { + def apply(m: ConfigRef) = f(m) } - final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean = + final def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean = apply(configuration) } diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/EvictionWarning.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/EvictionWarning.scala index 66e9d3185..7316be808 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/EvictionWarning.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/EvictionWarning.scala @@ -8,7 +8,7 @@ import sbt.util.ShowLines import sbt.internal.librarymanagement.{ InlineConfiguration, IvySbt } final class EvictionWarningOptions private[sbt] ( - val configurations: Seq[Configuration], + val configurations: Seq[ConfigRef], val warnScalaVersionEviction: Boolean, val warnDirectEvictions: Boolean, val warnTransitiveEvictions: Boolean, @@ -16,9 +16,7 @@ final class EvictionWarningOptions private[sbt] ( val showCallers: Boolean, val guessCompatible: Function1[(ModuleID, Option[ModuleID], Option[IvyScala]), Boolean] ) { - private[sbt] def configStrings = configurations map { _.name } - - def withConfigurations(configurations: Seq[Configuration]): EvictionWarningOptions = + def withConfigurations(configurations: Seq[ConfigRef]): EvictionWarningOptions = copy(configurations = configurations) def withWarnScalaVersionEviction(warnScalaVersionEviction: Boolean): EvictionWarningOptions = copy(warnScalaVersionEviction = warnScalaVersionEviction) @@ -36,7 +34,7 @@ final class EvictionWarningOptions private[sbt] ( copy(guessCompatible = guessCompatible) private[sbt] def copy( - configurations: Seq[Configuration] = configurations, + configurations: Seq[ConfigRef] = configurations, warnScalaVersionEviction: Boolean = warnScalaVersionEviction, warnDirectEvictions: Boolean = warnDirectEvictions, warnTransitiveEvictions: Boolean = warnTransitiveEvictions, @@ -193,7 +191,7 @@ object EvictionWarning { ): Seq[OrganizationArtifactReport] = { val buffer: mutable.ListBuffer[OrganizationArtifactReport] = mutable.ListBuffer() val confs = report.configurations filter { x => - options.configStrings contains x.configuration + options.configurations contains x.configuration } confs flatMap { confReport => confReport.details map { detail => diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/RichUpdateReport.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/RichUpdateReport.scala index 6d7e1c581..e4b9d1045 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/RichUpdateReport.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/RichUpdateReport.scala @@ -69,7 +69,7 @@ final class RichUpdateReport(report: UpdateReport) { } private[sbt] def substitute( - f: (String, ModuleID, Vector[(Artifact, File)]) => Vector[(Artifact, File)] + f: (ConfigRef, ModuleID, Vector[(Artifact, File)]) => Vector[(Artifact, File)] ): UpdateReport = moduleReportMap { (configuration, modReport) => val newArtifacts = f(configuration, modReport.module, modReport.artifacts) @@ -78,15 +78,15 @@ final class RichUpdateReport(report: UpdateReport) { .withMissingArtifacts(modReport.missingArtifacts) } - def toSeq: Seq[(String, ModuleID, Artifact, File)] = toVector - def toVector: Vector[(String, ModuleID, Artifact, File)] = + def toSeq: Seq[(ConfigRef, ModuleID, Artifact, File)] = toVector + def toVector: Vector[(ConfigRef, ModuleID, Artifact, File)] = for { confReport <- report.configurations modReport <- confReport.modules (artifact, file) <- modReport.artifacts } yield (confReport.configuration, modReport.module, artifact, file) - def allMissing: Vector[(String, ModuleID, Artifact)] = + def allMissing: Vector[(ConfigRef, ModuleID, Artifact)] = for { confReport <- report.configurations modReport <- confReport.modules @@ -99,7 +99,7 @@ final class RichUpdateReport(report: UpdateReport) { .withMissingArtifacts((modReport.missingArtifacts ++ f(modReport.module)).distinct) } - private[sbt] def moduleReportMap(f: (String, ModuleReport) => ModuleReport): UpdateReport = { + private[sbt] def moduleReportMap(f: (ConfigRef, ModuleReport) => ModuleReport): UpdateReport = { val newConfigurations = report.configurations.map { confReport => import confReport._ val newModules = modules map { modReport => diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala index 7f2c39fa6..db97688df 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala @@ -7,7 +7,7 @@ import java.io.File import java.{ util => ju } abstract class ConfigurationReportExtra { - def configuration: String + def configuration: ConfigRef def modules: Vector[ModuleReport] def details: Vector[OrganizationArtifactReport] @@ -28,7 +28,7 @@ abstract class ConfigurationReportExtra { } else module } - def retrieve(f: (String, ModuleID, Artifact, File) => File): ConfigurationReport = + def retrieve(f: (ConfigRef, ModuleID, Artifact, File) => File): ConfigurationReport = ConfigurationReport(configuration, modules map { _.retrieve((mid, art, file) => f(configuration, mid, art, file)) }, details) @@ -50,7 +50,7 @@ abstract class ModuleReportExtra { def extraAttributes: Map[String, String] def isDefault: Option[Boolean] def branch: Option[String] - def configurations: Vector[String] + def configurations: Vector[ConfigRef] def licenses: Vector[(String, Option[String])] def callers: Vector[Caller] @@ -115,7 +115,7 @@ abstract class ModuleReportExtra { extraAttributes: Map[String, String] = extraAttributes, isDefault: Option[Boolean] = isDefault, branch: Option[String] = branch, - configurations: Vector[String] = configurations, + configurations: Vector[ConfigRef] = configurations, licenses: Vector[(String, Option[String])] = licenses, callers: Vector[Caller] = callers ): ModuleReport @@ -144,12 +144,12 @@ abstract class UpdateReportExtra { } } - def retrieve(f: (String, ModuleID, Artifact, File) => File): UpdateReport = + def retrieve(f: (ConfigRef, ModuleID, Artifact, File) => File): UpdateReport = UpdateReport(cachedDescriptor, configurations map { _ retrieve f }, stats, stamps) /** Gets the report for the given configuration, or `None` if the configuration was not resolved.*/ - def configuration(s: String) = configurations.find(_.configuration == s) + def configuration(s: ConfigRef) = configurations.find(_.configuration == s) /** Gets the names of all resolved configurations. This `UpdateReport` contains one `ConfigurationReport` for each configuration in this list. */ - def allConfigurations: Seq[String] = configurations.map(_.configuration) + def allConfigurations: Vector[ConfigRef] = configurations.map(_.configuration) } diff --git a/librarymanagement/src/test/scala/DMSerializationSpec.scala b/librarymanagement/src/test/scala/DMSerializationSpec.scala index 35c0f7c01..d38c8fcdb 100644 --- a/librarymanagement/src/test/scala/DMSerializationSpec.scala +++ b/librarymanagement/src/test/scala/DMSerializationSpec.scala @@ -57,7 +57,7 @@ class DMSerializationSpec extends UnitSpec { UpdateStats(0, 0, 0, false), Map(new File("./foo") -> 0)) lazy val configurationReportExample = - ConfigurationReport("compile", + ConfigurationReport(ConfigRef("compile"), Vector(moduleReportExample), Vector(organizationArtifactReportExample)) lazy val organizationArtifactReportExample = diff --git a/librarymanagement/src/test/scala/sbt/internal/librarymanagement/IvyRepoSpec.scala b/librarymanagement/src/test/scala/sbt/internal/librarymanagement/IvyRepoSpec.scala index 51be80d06..30965e810 100644 --- a/librarymanagement/src/test/scala/sbt/internal/librarymanagement/IvyRepoSpec.scala +++ b/librarymanagement/src/test/scala/sbt/internal/librarymanagement/IvyRepoSpec.scala @@ -28,7 +28,7 @@ class IvyRepoSpec extends BaseIvySpecification with DependencyBuilders { val report = ivyUpdate(m) import Inside._ - inside(report.configuration("compile").map(_.modules)) { + inside(report.configuration(ConfigRef("compile")).map(_.modules)) { case Some(Seq(mr)) => inside(mr.artifacts) { case Seq((ar, _)) => @@ -82,7 +82,7 @@ class IvyRepoSpec extends BaseIvySpecification with DependencyBuilders { log) import Inside._ - inside(report2.configuration("compile").map(_.modules)) { + inside(report2.configuration(ConfigRef("compile")).map(_.modules)) { case Some(Seq(mr)) => inside(mr.artifacts) { case Seq((ar, _)) => diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 1f8e6f5f2..264d23e13 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -46,6 +46,7 @@ object Dependencies { val scalaCompiler = Def.setting { "org.scala-lang" % "scala-compiler" % scalaVersion.value } val scalaXml = scala211Module("scala-xml", "1.0.5") val scalaTest = "org.scalatest" %% "scalatest" % "3.0.1" % Test + val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.13.4" % Test val sjsonnew = Def.setting { "com.eed3si9n" %% "sjson-new-core" % contrabandSjsonNewVersion.value } val sjsonnewScalaJson = Def.setting { "com.eed3si9n" %% "sjson-new-scalajson" % contrabandSjsonNewVersion.value } val gigahorseOkhttp = "com.eed3si9n" %% "gigahorse-okhttp" % "0.3.0"