Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Accept legacy language features #20454

Merged
merged 1 commit into from
May 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions compiler/src/dotty/tools/dotc/config/Feature.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ object Feature:
(betterMatchTypeExtractors, "Enable better match type extractors")
)

// legacy language features from Scala 2 that are no longer supported.
val legacyFeatures = List(
"higherKinds",
"existentials",
"reflectiveCalls"
)

private def enabledLanguageFeaturesBySetting(using Context): List[String] =
ctx.settings.language.value.asInstanceOf

Expand Down
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/dotc/config/ScalaSettings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ trait CommonScalaSettings:
val explainTypes: Setting[Boolean] = BooleanSetting(RootSetting, "explain-types", "Explain type errors in more detail (deprecated, use -explain instead).", aliases = List("--explain-types", "-explaintypes"))
val explainCyclic: Setting[Boolean] = BooleanSetting(RootSetting, "explain-cyclic", "Explain cyclic reference errors in more detail.", aliases = List("--explain-cyclic"))
val unchecked: Setting[Boolean] = BooleanSetting(RootSetting, "unchecked", "Enable additional warnings where generated code depends on assumptions.", initialValue = true, aliases = List("--unchecked"))
val language: Setting[List[ChoiceWithHelp[String]]] = MultiChoiceHelpSetting(RootSetting, "language", "feature", "Enable one or more language features.", choices = ScalaSettingsProperties.supportedLanguageFeatures, default = Nil, aliases = List("--language"))
val language: Setting[List[ChoiceWithHelp[String]]] = MultiChoiceHelpSetting(RootSetting, "language", "feature", "Enable one or more language features.", choices = ScalaSettingsProperties.supportedLanguageFeatures, legacyChoices = ScalaSettingsProperties.legacyLanguageFeatures, default = Nil, aliases = List("--language"))
val experimental: Setting[Boolean] = BooleanSetting(RootSetting, "experimental", "Annotate all top-level definitions with @experimental. This enables the use of experimental features anywhere in the project.")

/* Coverage settings */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ object ScalaSettingsProperties:
def supportedLanguageFeatures: List[ChoiceWithHelp[String]] =
Feature.values.map((n, d) => ChoiceWithHelp(n.toString, d))

val legacyLanguageFeatures: List[String] =
Feature.legacyFeatures

def defaultClasspath: String = sys.env.getOrElse("CLASSPATH", ".")

def defaultPageWidth: Int = {
Expand Down
23 changes: 15 additions & 8 deletions compiler/src/dotty/tools/dotc/config/Settings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ object Settings:
propertyClass: Option[Class[?]] = None,
deprecation: Option[Deprecation] = None,
// kept only for -Xkind-projector option compatibility
legacyArgs: Boolean = false)(private[Settings] val idx: Int):
legacyArgs: Boolean = false,
// accept legacy choices (for example, valid in Scala 2 but no longer supported)
legacyChoices: Option[Seq[?]] = None)(private[Settings] val idx: Int):

validateSettingString(prefix.getOrElse(name))
aliases.foreach(validateSettingString)
Expand Down Expand Up @@ -206,9 +208,14 @@ object Settings:

def appendList(strings: List[String], argValue: String, args: List[String]) =
choices match
case Some(valid) => strings.filterNot(valid.contains) match
case Nil => update(strings, argValue, args)
case invalid => invalidChoices(invalid)
case Some(valid) => strings.partition(valid.contains) match
case (_, Nil) => update(strings, argValue, args)
case (validStrs, invalidStrs) => legacyChoices match
case Some(validBefore) =>
invalidStrs.filterNot(validBefore.contains) match
case Nil => update(validStrs, argValue, args)
case realInvalidStrs => invalidChoices(realInvalidStrs)
case _ => invalidChoices(invalidStrs)
case _ => update(strings, argValue, args)

def doSet(argRest: String) =
Expand Down Expand Up @@ -380,11 +387,11 @@ object Settings:
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] =
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, legacyArgs = legacyArgs, deprecation = deprecation))

def MultiChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: List[String] = Nil, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[List[String]] =
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, deprecation = deprecation))
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]] =
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation))

def MultiChoiceHelpSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[ChoiceWithHelp[String]], default: List[ChoiceWithHelp[String]], aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[List[ChoiceWithHelp[String]]] =
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, deprecation = deprecation))
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]]] =
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation))

def IntSetting(category: SettingCategory, name: String, descr: String, default: Int, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[Int] =
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation))
Expand Down
8 changes: 4 additions & 4 deletions compiler/test/dotty/tools/dotc/SettingsTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -272,8 +272,8 @@ class SettingsTests {
val booleanSetting = BooleanSetting(RootSetting, "booleanSetting", "booleanSetting", false)
val stringSetting = StringSetting(RootSetting, "stringSetting", "stringSetting", "", "test")
val choiceSetting = ChoiceSetting(RootSetting, "choiceSetting", "choiceSetting", "", List("a", "b"), "a")
val multiChoiceSetting= MultiChoiceSetting(RootSetting, "multiChoiceSetting", "multiChoiceSetting", "", List("a", "b"), List())
val multiChoiceHelpSetting= MultiChoiceHelpSetting(RootSetting, "multiChoiceHelpSetting", "multiChoiceHelpSetting", "", List(ChoiceWithHelp("a", "a"), ChoiceWithHelp("b", "b")), List())
val multiChoiceSetting= MultiChoiceSetting(RootSetting, "multiChoiceSetting", "multiChoiceSetting", "", List("a", "b"), List(), legacyChoices = List("c"))
val multiChoiceHelpSetting= MultiChoiceHelpSetting(RootSetting, "multiChoiceHelpSetting", "multiChoiceHelpSetting", "", List(ChoiceWithHelp("a", "a"), ChoiceWithHelp("b", "b")), List(), legacyChoices = List("c"))
val intSetting = IntSetting(RootSetting, "intSetting", "intSetting", 0)
val intChoiceSetting = IntChoiceSetting(RootSetting, "intChoiceSetting", "intChoiceSetting", List(1,2,3), 1)
val multiStringSetting = MultiStringSetting(RootSetting, "multiStringSetting", "multiStringSetting", "", List("a", "b"), List())
Expand All @@ -289,8 +289,8 @@ class SettingsTests {
List("-booleanSetting", "true"),
List("-stringSetting", "newTest"),
List("-choiceSetting", "b"),
List("-multiChoiceSetting", "a,b"),
List("-multiChoiceHelpSetting", "a,b"),
List("-multiChoiceSetting", "a,b,c"),
List("-multiChoiceHelpSetting", "a,b,c"),
List("-intSetting", "42"),
List("-intChoiceSetting", "2"),
List("-multiStringSetting", "a,b"),
Expand Down
Loading