From 9f2f7007626c39f79511f51e357d9157fd9d19ce Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 8 Jul 2017 13:01:59 +0200 Subject: [PATCH] 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 +}