forked from VirtusLab/scala-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Override using directives scalac, java, and dependency options with t…
…heir cli counterparts (VirtusLab#612) * Add initial String options and dependency shadowing mechanism * Move implicits to seperate object * Make scalac options Positioned and add prefixed option handling * Shadow using directives java options with cli options * Add tests for shadowing * Apply scalafix * scalafix * Redesign shadowing for a more generic approach * Revert changes to map ConfigMonoid * scalafix * fix compiler plugin option handling * Simplify JavaOpt / ScalacOpt They now only wrap a single option * Better hashing for ShadowingSeq * NIT / clean-up / diff minimization Co-authored-by: Alexandre Archambault <alexandre.archambault@gmail.com>
- Loading branch information
1 parent
f1ce67a
commit ab623dc
Showing
30 changed files
with
399 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
modules/build/src/main/scala/scala/build/options/JavaOpt.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package scala.build.options | ||
|
||
final case class JavaOpt(value: String) { | ||
def key: Option[String] = | ||
JavaOpt.optionPrefixes.find(value.startsWith) | ||
.orElse { | ||
if (value.startsWith("-")) Some(value.takeWhile(_ != ':')) | ||
else if (value.startsWith("@")) Some("@") | ||
else None | ||
} | ||
} | ||
|
||
object JavaOpt { | ||
/* Hardcoded prefixes for java options */ | ||
private val optionPrefixes = Set("-Xmn", "-Xms", "-Xmx", "-Xss") | ||
|
||
implicit val hashedType: HashedType[JavaOpt] = { | ||
opt => opt.value | ||
} | ||
implicit val keyOf: ShadowingSeq.KeyOf[JavaOpt] = | ||
ShadowingSeq.KeyOf( | ||
_.key, | ||
seq => ScalacOpt.groupCliOptions(seq.map(_.value)) | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
37 changes: 37 additions & 0 deletions
37
modules/build/src/main/scala/scala/build/options/ScalacOpt.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package scala.build.options | ||
|
||
final case class ScalacOpt(value: String) { | ||
def key: Option[String] = | ||
if (value.startsWith("-")) | ||
Some(value.takeWhile(_ != ':')) | ||
.filterNot(ScalacOpt.repeatingKeys.contains) | ||
else if (value.startsWith("@")) | ||
Some("@") | ||
else | ||
None | ||
} | ||
|
||
object ScalacOpt { | ||
private val repeatingKeys = Set( | ||
"-Xplugin:", | ||
"-P" // plugin options | ||
) | ||
|
||
implicit val hashedType: HashedType[ScalacOpt] = { | ||
opt => opt.value | ||
} | ||
implicit val keyOf: ShadowingSeq.KeyOf[ScalacOpt] = | ||
ShadowingSeq.KeyOf( | ||
_.key, | ||
seq => groupCliOptions(seq.map(_.value)) | ||
) | ||
|
||
// Groups options (starting with `-` or `@`) with option arguments that follow | ||
def groupCliOptions(opts: Seq[String]): Seq[Int] = | ||
opts | ||
.zipWithIndex | ||
.collect { | ||
case (opt, idx) if opt.startsWith("-") || opt.startsWith("@") => | ||
idx | ||
} | ||
} |
73 changes: 73 additions & 0 deletions
73
modules/build/src/main/scala/scala/build/options/ShadowingSeq.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
package scala.build.options | ||
|
||
import dependency.AnyDependency | ||
import shapeless.Lazy | ||
|
||
import scala.collection.mutable | ||
|
||
/** Seq ensuring some of its values are unique according to some key */ | ||
final case class ShadowingSeq[T] private (values: Seq[Seq[T]]) { | ||
lazy val toSeq: Seq[T] = values.flatten | ||
def ++(other: Seq[T])(implicit key: ShadowingSeq.KeyOf[T]): ShadowingSeq[T] = | ||
addGroups(ShadowingSeq.groups(other, key.groups(other))) | ||
private def addGroups(other: Seq[Seq[T]])(implicit key: ShadowingSeq.KeyOf[T]): ShadowingSeq[T] = | ||
if (other.isEmpty) this | ||
else { | ||
val l = new mutable.ListBuffer[Seq[T]] | ||
val seen = new mutable.HashSet[String] | ||
|
||
for (group <- values.iterator ++ other.iterator) { | ||
assert(group.nonEmpty) | ||
val keyOpt = key.get(group.head) | ||
if (!keyOpt.exists(seen.contains)) { | ||
l += group | ||
for (key <- keyOpt) | ||
seen += key | ||
} | ||
} | ||
|
||
ShadowingSeq(l.toList) | ||
} | ||
} | ||
|
||
object ShadowingSeq { | ||
|
||
final case class KeyOf[T]( | ||
get: T => Option[String], | ||
/** The indices at which sub-groups of values start */ | ||
groups: Seq[T] => Seq[Int] | ||
) | ||
object KeyOf { | ||
implicit val keyOfAnyDependency: KeyOf[AnyDependency] = | ||
KeyOf(dep => Some(dep.module.render), _.indices) | ||
} | ||
|
||
implicit def monoid[T](implicit key: KeyOf[T]): ConfigMonoid[ShadowingSeq[T]] = | ||
ConfigMonoid.instance(ShadowingSeq.empty[T]) { (a, b) => | ||
a.addGroups(b.values) | ||
} | ||
implicit def hashedField[T](implicit | ||
hasher: Lazy[HashedType[T]] | ||
): HashedField[ShadowingSeq[T]] = { | ||
(name, seq, update) => | ||
for (t <- seq.toSeq) | ||
update(s"$name+=${hasher.value.hashedValue(t)}") | ||
} | ||
|
||
def empty[T]: ShadowingSeq[T] = ShadowingSeq(Nil) | ||
|
||
def from[T](values: Seq[T])(implicit key: KeyOf[T]): ShadowingSeq[T] = | ||
empty[T] ++ values | ||
|
||
private def groups[T](values: Seq[T], indices: Seq[Int]): Seq[Seq[T]] = { | ||
val safeIndices = Seq(0) ++ indices ++ Seq(values.length) | ||
safeIndices | ||
.sliding(2) | ||
.map { | ||
case Seq(start, end) => | ||
values.slice(start, end) | ||
} | ||
.filter(_.nonEmpty) | ||
.toVector | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.