Skip to content

Commit 7bdeb0b

Browse files
authored
Accept legacy language features (#20454)
Fix #20419 * Accept legacy language features (from Scala 2), * For other unknown features, it will still fail.
2 parents 6233495 + a308ac8 commit 7bdeb0b

File tree

5 files changed

+30
-13
lines changed

5 files changed

+30
-13
lines changed

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

+7
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ object Feature:
6969
(betterMatchTypeExtractors, "Enable better match type extractors")
7070
)
7171

72+
// legacy language features from Scala 2 that are no longer supported.
73+
val legacyFeatures = List(
74+
"higherKinds",
75+
"existentials",
76+
"reflectiveCalls"
77+
)
78+
7279
private def enabledLanguageFeaturesBySetting(using Context): List[String] =
7380
ctx.settings.language.value.asInstanceOf
7481

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ trait CommonScalaSettings:
114114
val explainTypes: Setting[Boolean] = BooleanSetting(RootSetting, "explain-types", "Explain type errors in more detail (deprecated, use -explain instead).", aliases = List("--explain-types", "-explaintypes"))
115115
val explainCyclic: Setting[Boolean] = BooleanSetting(RootSetting, "explain-cyclic", "Explain cyclic reference errors in more detail.", aliases = List("--explain-cyclic"))
116116
val unchecked: Setting[Boolean] = BooleanSetting(RootSetting, "unchecked", "Enable additional warnings where generated code depends on assumptions.", initialValue = true, aliases = List("--unchecked"))
117-
val language: Setting[List[ChoiceWithHelp[String]]] = MultiChoiceHelpSetting(RootSetting, "language", "feature", "Enable one or more language features.", choices = ScalaSettingsProperties.supportedLanguageFeatures, default = Nil, aliases = List("--language"))
117+
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"))
118118
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.")
119119

120120
/* Coverage settings */

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

+3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ object ScalaSettingsProperties:
3030
def supportedLanguageFeatures: List[ChoiceWithHelp[String]] =
3131
Feature.values.map((n, d) => ChoiceWithHelp(n.toString, d))
3232

33+
val legacyLanguageFeatures: List[String] =
34+
Feature.legacyFeatures
35+
3336
def defaultClasspath: String = sys.env.getOrElse("CLASSPATH", ".")
3437

3538
def defaultPageWidth: Int = {

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

+15-8
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ object Settings:
8585
propertyClass: Option[Class[?]] = None,
8686
deprecation: Option[Deprecation] = None,
8787
// kept only for -Xkind-projector option compatibility
88-
legacyArgs: Boolean = false)(private[Settings] val idx: Int):
88+
legacyArgs: Boolean = false,
89+
// accept legacy choices (for example, valid in Scala 2 but no longer supported)
90+
legacyChoices: Option[Seq[?]] = None)(private[Settings] val idx: Int):
8991

9092
validateSettingString(prefix.getOrElse(name))
9193
aliases.foreach(validateSettingString)
@@ -206,9 +208,14 @@ object Settings:
206208

207209
def appendList(strings: List[String], argValue: String, args: List[String]) =
208210
choices match
209-
case Some(valid) => strings.filterNot(valid.contains) match
210-
case Nil => update(strings, argValue, args)
211-
case invalid => invalidChoices(invalid)
211+
case Some(valid) => strings.partition(valid.contains) match
212+
case (_, Nil) => update(strings, argValue, args)
213+
case (validStrs, invalidStrs) => legacyChoices match
214+
case Some(validBefore) =>
215+
invalidStrs.filterNot(validBefore.contains) match
216+
case Nil => update(validStrs, argValue, args)
217+
case realInvalidStrs => invalidChoices(realInvalidStrs)
218+
case _ => invalidChoices(invalidStrs)
212219
case _ => update(strings, argValue, args)
213220

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

383-
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]] =
384-
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, deprecation = deprecation))
390+
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]] =
391+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation))
385392

386-
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]]] =
387-
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, deprecation = deprecation))
393+
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]]] =
394+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), legacyChoices = Some(legacyChoices), aliases = aliases, deprecation = deprecation))
388395

389396
def IntSetting(category: SettingCategory, name: String, descr: String, default: Int, aliases: List[String] = Nil, deprecation: Option[Deprecation] = None): Setting[Int] =
390397
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation))

compiler/test/dotty/tools/dotc/SettingsTests.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,8 @@ class SettingsTests {
272272
val booleanSetting = BooleanSetting(RootSetting, "booleanSetting", "booleanSetting", false)
273273
val stringSetting = StringSetting(RootSetting, "stringSetting", "stringSetting", "", "test")
274274
val choiceSetting = ChoiceSetting(RootSetting, "choiceSetting", "choiceSetting", "", List("a", "b"), "a")
275-
val multiChoiceSetting= MultiChoiceSetting(RootSetting, "multiChoiceSetting", "multiChoiceSetting", "", List("a", "b"), List())
276-
val multiChoiceHelpSetting= MultiChoiceHelpSetting(RootSetting, "multiChoiceHelpSetting", "multiChoiceHelpSetting", "", List(ChoiceWithHelp("a", "a"), ChoiceWithHelp("b", "b")), List())
275+
val multiChoiceSetting= MultiChoiceSetting(RootSetting, "multiChoiceSetting", "multiChoiceSetting", "", List("a", "b"), List(), legacyChoices = List("c"))
276+
val multiChoiceHelpSetting= MultiChoiceHelpSetting(RootSetting, "multiChoiceHelpSetting", "multiChoiceHelpSetting", "", List(ChoiceWithHelp("a", "a"), ChoiceWithHelp("b", "b")), List(), legacyChoices = List("c"))
277277
val intSetting = IntSetting(RootSetting, "intSetting", "intSetting", 0)
278278
val intChoiceSetting = IntChoiceSetting(RootSetting, "intChoiceSetting", "intChoiceSetting", List(1,2,3), 1)
279279
val multiStringSetting = MultiStringSetting(RootSetting, "multiStringSetting", "multiStringSetting", "", List("a", "b"), List())
@@ -289,8 +289,8 @@ class SettingsTests {
289289
List("-booleanSetting", "true"),
290290
List("-stringSetting", "newTest"),
291291
List("-choiceSetting", "b"),
292-
List("-multiChoiceSetting", "a,b"),
293-
List("-multiChoiceHelpSetting", "a,b"),
292+
List("-multiChoiceSetting", "a,b,c"),
293+
List("-multiChoiceHelpSetting", "a,b,c"),
294294
List("-intSetting", "42"),
295295
List("-intChoiceSetting", "2"),
296296
List("-multiStringSetting", "a,b"),

0 commit comments

Comments
 (0)