Skip to content

Commit

Permalink
Accept legacy language features (#20454)
Browse files Browse the repository at this point in the history
Fix #20419

* Accept legacy language features (from Scala 2),
* For other unknown features, it will still fail.
  • Loading branch information
noti0na1 committed May 23, 2024
2 parents 6233495 + a308ac8 commit 7bdeb0b
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 13 deletions.
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

0 comments on commit 7bdeb0b

Please sign in to comment.