Skip to content

Commit 051e8e7

Browse files
committed
Explicit deprecatedAliases
1 parent 2311719 commit 051e8e7

File tree

3 files changed

+44
-41
lines changed

3 files changed

+44
-41
lines changed

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ private sealed trait PluginSettings:
146146
private sealed trait VerboseSettings:
147147
self: SettingGroup =>
148148
val Vhelp: Setting[Boolean] = BooleanSetting(VerboseSetting, "V", "Print a synopsis of verbose options.")
149-
val Vprint: Setting[List[String]] = PhasesSetting(VerboseSetting, "Vprint", "Print out program after", aliases = List("-Xprint*"))
150-
val XshowPhases: Setting[Boolean] = BooleanSetting(VerboseSetting, "Vphases", "List compiler phases.", aliases = List("-Xshow-phases*"))
149+
val Vprint: Setting[List[String]] = PhasesSetting(VerboseSetting, "Vprint", "Print out program after", deprecatedAliases = List("-Xprint" -> Deprecation()))
150+
val XshowPhases: Setting[Boolean] = BooleanSetting(VerboseSetting, "Vphases", "List compiler phases.", deprecatedAliases = List("-Xshow-phases" -> Deprecation()))
151151

152152
val Vprofile: Setting[Boolean] = BooleanSetting(VerboseSetting, "Vprofile", "Show metrics about sources and internal representations to estimate compile-time complexity.")
153153
val VprofileSortedBy = ChoiceSetting(VerboseSetting, "Vprofile-sorted-by", "key", "Show metrics about sources and internal representations sorted by given column name", List("name", "path", "lines", "tokens", "tasty", "complexity"), "")
@@ -161,7 +161,7 @@ private sealed trait WarningSettings:
161161
self: SettingGroup =>
162162

163163
val Whelp: Setting[Boolean] = BooleanSetting(WarningSetting, "W", "Print a synopsis of warning options.")
164-
val Werror: Setting[Boolean] = BooleanSetting(WarningSetting, "Werror", "Fail the compilation if there are any warnings.", aliases = List("-Xfatal-warnings*"))
164+
val Werror: Setting[Boolean] = BooleanSetting(WarningSetting, "Werror", "Fail the compilation if there are any warnings.", deprecatedAliases = List("-Xfatal-warnings" -> Deprecation()))
165165
val Wall: Setting[Boolean] = BooleanSetting(WarningSetting, "Wall", "Enable all warning settings.")
166166
private val WvalueDiscard: Setting[Boolean] = BooleanSetting(WarningSetting, "Wvalue-discard", "Warn when non-Unit expression results are unused.")
167167
private val WNonUnitStatement = BooleanSetting(WarningSetting, "Wnonunit-statement", "Warn when block statements are non-Unit expressions.")

compiler/src/dotty/tools/dotc/config/Settings.scala

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,15 @@ object Settings:
106106
preferPrevious: Boolean = false,
107107
propertyClass: Option[Class[?]] = None,
108108
deprecation: Option[Deprecation] = None,
109+
deprecatedAliases: List[(String, Deprecation)] = Nil,
109110
// kept only for -Xkind-projector option compatibility
110111
legacyArgs: Boolean = false,
111112
// accept legacy choices (for example, valid in Scala 2 but no longer supported)
112113
legacyChoices: Option[Seq[?]] = None)(private[Settings] val idx: Int)(using ct: ClassTag[T]):
113114

114-
val alternatives = aliases.map(_.stripSuffix("*"))
115115
validateSettingString(prefix.getOrElse(name))
116-
alternatives.foreach(validateSettingString)
116+
aliases.foreach(validateSettingString)
117+
deprecatedAliases.foreach((alias, _) => validateSettingString(alias))
117118
assert(name.startsWith(s"-${category.prefixLetter}"), s"Setting $name does not start with category -$category")
118119
assert(legacyArgs || !choices.exists(_.contains("")), s"Empty string is not supported as a choice for setting $name")
119120
validateSettingTag(ct)
@@ -122,7 +123,7 @@ object Settings:
122123
// Example: -opt Main.scala would be interpreted as -opt:Main.scala, and the source file would be ignored.
123124
assert(!(ct == ListTag && ignoreInvalidArgs), s"Ignoring invalid args is not supported for multivalue settings: $name")
124125

125-
val allFullNames: List[String] = s"$name" :: s"-$name" :: alternatives
126+
val allFullNames: List[String] = s"$name" :: s"-$name" :: aliases ::: deprecatedAliases.map(_._1)
126127

127128
def valueIn(state: SettingsState): T = state.value(idx).asInstanceOf[T]
128129

@@ -143,13 +144,18 @@ object Settings:
143144
case Some(xs) => xs.mkString(", ")
144145
case None => ""
145146

146-
// Updates the state from the next arg if this setting is applicable.
147+
/** Updates the state from the next arg if this setting is applicable. */
147148
def tryToSet(state0: ArgsSummary): ArgsSummary =
148-
val ArgsSummary(sstate, arg :: args, _, _) = state0: @unchecked
149-
def state(using ArgsSummary) = summon[ArgsSummary]
150-
def changed = sstate.wasChanged(idx)
149+
inline def state(using ArgsSummary) = summon[ArgsSummary]
150+
inline def sstate(using ArgsSummary) = state.sstate
151+
inline def changed(using ArgsSummary) = sstate.wasChanged(idx)
152+
val arg :: args = state0.arguments: @unchecked // there must be an arg
151153

152154
/** Updates the value in state.
155+
*
156+
* If this option is deprecated, add a warning.
157+
* If the option is `replacedBy` another option, instead of applying the value,
158+
* add the reconstructed arg to be applied subsequently.
153159
*
154160
* @param value will be evaluated at most once for side effects
155161
* @param altArg alt string to apply with alt setting if this setting is deprecated
@@ -289,15 +295,10 @@ object Settings:
289295

290296
def checkDeprecatedAlias()(using ArgsSummary) =
291297
val name = arg.takeWhile(_ != ':')
292-
val found =
293-
for
294-
alt <- alternatives.find(_ == name)
295-
altx = alt + "*"
296-
_ <- aliases.find(_ == altx)
297-
yield
298-
alt
299-
found.map: alt =>
300-
state.warn(s"Option $alt is a deprecated alias: use ${this.name}", args)
298+
val found = deprecatedAliases.find((alt, _) => alt == name)
299+
found.map: (alt, dep) =>
300+
val msg = if dep.msg.nonEmpty then dep.msg else s"use ${this.name} instead"
301+
state.warn(s"Option $alt is a deprecated alias: $msg", args)
301302
.getOrElse(state)
302303

303304
if matches then
@@ -359,6 +360,7 @@ object Settings:
359360
)
360361

361362
object Deprecation:
363+
def apply(): Deprecation = Deprecation(msg = "", replacedBy = None)
362364
def renamed(replacement: String) = Some(Deprecation(s"Use $replacement instead.", Some(replacement)))
363365
def removed(removedVersion: Option[String] = None) =
364366
val msg = removedVersion.map(" in " + _).getOrElse(".")
@@ -435,38 +437,38 @@ object Settings:
435437
assert(!name.startsWith("-"), s"Setting $name cannot start with -")
436438
"-" + name
437439

438-
def BooleanSetting(category: SettingCategory, name: String, descr: String, initialValue: Boolean = false, aliases: List[String] = Nil, preferPrevious: Boolean = false, deprecation: Option[Deprecation] = None, ignoreInvalidArgs: Boolean = false): Setting[Boolean] =
439-
publish(Setting(category, prependName(name), descr, initialValue, aliases = aliases, preferPrevious = preferPrevious, deprecation = deprecation, ignoreInvalidArgs = ignoreInvalidArgs))
440+
def BooleanSetting(category: SettingCategory, name: String, descr: String, initialValue: Boolean = false, aliases: List[String] = Nil, preferPrevious: Boolean = false, deprecation: Option[Deprecation] = None, ignoreInvalidArgs: Boolean = false, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[Boolean] =
441+
publish(Setting(category, prependName(name), descr, initialValue, aliases = aliases, preferPrevious = preferPrevious, deprecation = deprecation, ignoreInvalidArgs = ignoreInvalidArgs, deprecatedAliases = deprecatedAliases))
440442

441-
def StringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: String, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, depends: SettingDependencies = Nil): Setting[String] =
442-
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, deprecation = deprecation, depends = depends))
443+
def StringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: String, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, depends: SettingDependencies = Nil, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[String] =
444+
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, deprecation = deprecation, depends = depends, deprecatedAliases = deprecatedAliases))
443445

444-
def ChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: String, aliases: List[String] = Nil, legacyArgs: Boolean = false, deprecation: Option[Deprecation] = None): Setting[String] =
445-
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, legacyArgs = legacyArgs, deprecation = deprecation))
446+
def ChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: String, aliases: List[String] = Nil, legacyArgs: Boolean = false, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[String] =
447+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, legacyArgs = legacyArgs, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
446448

447-
def MultiChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: List[String] = Nil, legacyChoices: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[List[String]] =
448-
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation))
449+
def MultiChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: List[String] = Nil, legacyChoices: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[List[String]] =
450+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
449451

450-
def MultiChoiceHelpSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[ChoiceWithHelp[String]], default: List[ChoiceWithHelp[String]], legacyChoices: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[List[ChoiceWithHelp[String]]] =
451-
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation))
452+
def MultiChoiceHelpSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[ChoiceWithHelp[String]], default: List[ChoiceWithHelp[String]], legacyChoices: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[List[ChoiceWithHelp[String]]] =
453+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
452454

453-
def IntSetting(category: SettingCategory, name: String, descr: String, default: Int, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[Int] =
454-
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation))
455+
def IntSetting(category: SettingCategory, name: String, descr: String, default: Int, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[Int] =
456+
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
455457

456458
def IntChoiceSetting(category: SettingCategory, name: String, descr: String, choices: Seq[Int], default: Int, deprecation: Option[Deprecation] = None): Setting[Int] =
457459
publish(Setting(category, prependName(name), descr, default, choices = Some(choices), deprecation = deprecation))
458460

459-
def MultiStringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[List[String]] =
460-
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, deprecation = deprecation))
461+
def MultiStringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[List[String]] =
462+
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
461463

462-
def OutputSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: AbstractFile, aliases: List[String] = Nil, preferPrevious: Boolean = false, deprecation: Option[Deprecation] = None): Setting[AbstractFile] =
463-
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, preferPrevious = preferPrevious, deprecation = deprecation))
464+
def OutputSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: AbstractFile, aliases: List[String] = Nil, preferPrevious: Boolean = false, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[AbstractFile] =
465+
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, preferPrevious = preferPrevious, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
464466

465-
def PathSetting(category: SettingCategory, name: String, descr: String, default: String, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[String] =
466-
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation))
467+
def PathSetting(category: SettingCategory, name: String, descr: String, default: String, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[String] =
468+
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
467469

468-
def PhasesSetting(category: SettingCategory, name: String, descr: String, default: String = "", aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, depends: SettingDependencies = Nil): Setting[List[String]] =
469-
publish(Setting(category, prependName(name), descr, if (default.isEmpty) Nil else List(default), aliases = aliases, deprecation = deprecation, depends = depends))
470+
def PhasesSetting(category: SettingCategory, name: String, descr: String, default: String = "", aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, depends: SettingDependencies = Nil, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[List[String]] =
471+
publish(Setting(category, prependName(name), descr, if (default.isEmpty) Nil else List(default), aliases = aliases, deprecation = deprecation, depends = depends, deprecatedAliases = deprecatedAliases))
470472

471473
def PrefixSetting(category: SettingCategory, name0: String, descr: String, deprecation: Option[Deprecation] = None): Setting[List[String]] =
472474
val name = prependName(name0)
@@ -476,8 +478,8 @@ object Settings:
476478
def VersionSetting(category: SettingCategory, name: String, descr: String, default: ScalaVersion = NoScalaVersion, legacyArgs: Boolean = false, deprecation: Option[Deprecation] = None): Setting[ScalaVersion] =
477479
publish(Setting(category, prependName(name), descr, default, legacyArgs = legacyArgs, deprecation = deprecation))
478480

479-
def OptionSetting[T: ClassTag](category: SettingCategory, name: String, descr: String, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[Option[T]] =
480-
publish(Setting(category, prependName(name), descr, None, propertyClass = Some(summon[ClassTag[T]].runtimeClass), aliases = aliases, deprecation = deprecation))
481+
def OptionSetting[T: ClassTag](category: SettingCategory, name: String, descr: String, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None, deprecatedAliases: List[(String, Deprecation)] = Nil): Setting[Option[T]] =
482+
publish(Setting(category, prependName(name), descr, None, propertyClass = Some(summon[ClassTag[T]].runtimeClass), aliases = aliases, deprecation = deprecation, deprecatedAliases = deprecatedAliases))
481483

482484
end SettingGroup
483485
end Settings

compiler/test/dotty/tools/dotc/config/ScalaSettingsTests.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ class ScalaSettingsTests:
311311
val args = "-Xfatal-warnings" :: "-Xprint" :: "typer" :: Nil
312312
val result = settings.processArguments(args, processAll = true)
313313
assertEquals(2, result.warnings.length)
314+
assertEquals("Option -Xfatal-warnings is a deprecated alias: use -Werror instead", result.warnings.head)
314315
assertEquals(0, result.errors.length)
315316

316317
end ScalaSettingsTests

0 commit comments

Comments
 (0)