Skip to content

Commit f146ca7

Browse files
committed
Applied review suggestions
1 parent 2ee562e commit f146ca7

File tree

6 files changed

+146
-130
lines changed

6 files changed

+146
-130
lines changed

Diff for: compiler/src/dotty/tools/backend/jvm/BackendUtils.scala

+17-17
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class BackendUtils(val postProcessor: PostProcessor) {
2020
import bTypes.*
2121
import coreBTypes.jliLambdaMetaFactoryAltMetafactoryHandle
2222

23-
lazy val classfileVersion: Int = BackendUtils.classfileVersionMap(compilerSettings.target)
23+
lazy val classfileVersion: Int = BackendUtils.classfileVersionMap(compilerSettings.target.toInt)
2424

2525
lazy val extraProc: Int = {
2626
import GenBCodeOps.addFlagIf
@@ -169,21 +169,21 @@ class BackendUtils(val postProcessor: PostProcessor) {
169169
}
170170

171171
object BackendUtils {
172-
lazy val classfileVersionMap = Map(
173-
"8" -> asm.Opcodes.V1_8,
174-
"9" -> asm.Opcodes.V9,
175-
"10" -> asm.Opcodes.V10,
176-
"11" -> asm.Opcodes.V11,
177-
"12" -> asm.Opcodes.V12,
178-
"13" -> asm.Opcodes.V13,
179-
"14" -> asm.Opcodes.V14,
180-
"15" -> asm.Opcodes.V15,
181-
"16" -> asm.Opcodes.V16,
182-
"17" -> asm.Opcodes.V17,
183-
"18" -> asm.Opcodes.V18,
184-
"19" -> asm.Opcodes.V19,
185-
"20" -> asm.Opcodes.V20,
186-
"21" -> asm.Opcodes.V21,
187-
"22" -> asm.Opcodes.V22,
172+
lazy val classfileVersionMap: Map[Int, Int] = Map(
173+
8 -> asm.Opcodes.V1_8,
174+
9 -> asm.Opcodes.V9,
175+
10 -> asm.Opcodes.V10,
176+
11 -> asm.Opcodes.V11,
177+
12 -> asm.Opcodes.V12,
178+
13 -> asm.Opcodes.V13,
179+
14 -> asm.Opcodes.V14,
180+
15 -> asm.Opcodes.V15,
181+
16 -> asm.Opcodes.V16,
182+
17 -> asm.Opcodes.V17,
183+
18 -> asm.Opcodes.V18,
184+
19 -> asm.Opcodes.V19,
185+
20 -> asm.Opcodes.V20,
186+
21 -> asm.Opcodes.V21,
187+
22 -> asm.Opcodes.V22,
188188
)
189189
}

Diff for: compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

+19-50
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ package dotty.tools.dotc
22
package config
33

44
import scala.language.unsafeNulls
5-
import dotty.tools.backend.jvm.BackendUtils.classfileVersionMap
65
import dotty.tools.dotc.config.PathResolver.Defaults
7-
import dotty.tools.dotc.config.Settings.{Setting, SettingGroup}
6+
import dotty.tools.dotc.config.Settings.{Setting, SettingGroup, SettingCategory}
87
import dotty.tools.dotc.config.SourceVersion
98
import dotty.tools.dotc.core.Contexts.*
109
import dotty.tools.dotc.rewrites.Rewrites
@@ -16,62 +15,32 @@ import scala.util.chaining.*
1615

1716
import java.util.zip.Deflater
1817

19-
object ScalaSettingCategories:
20-
val RootSetting = ""
21-
val WarningSetting = "W"
22-
val ForkSetting = "Y"
23-
val AdvancedSetting = "X"
24-
val VerboseSetting = "V"
25-
26-
object ScalaSettingsProperties:
27-
28-
private lazy val minTargetVersion = classfileVersionMap.keysIterator.map(_.toInt).min
29-
private lazy val maxTargetVersion = classfileVersionMap.keysIterator.map(_.toInt).max
30-
31-
def supportedTargetVersions: List[String] =
32-
(minTargetVersion to maxTargetVersion).toList.map(_.toString)
33-
34-
def supportedReleaseVersions: List[String] =
35-
if scala.util.Properties.isJavaAtLeast("9") then
36-
val jdkVersion = JDK9Reflectors.runtimeVersionMajor(JDK9Reflectors.runtimeVersion()).intValue()
37-
val maxVersion = Math.min(jdkVersion, maxTargetVersion)
38-
(minTargetVersion to maxVersion).toList.map(_.toString)
39-
else List(minTargetVersion).map(_.toString)
40-
41-
def supportedScalaReleaseVersions: List[String] =
42-
ScalaRelease.values.toList.map(_.show)
43-
44-
def supportedSourceVersions: List[String] =
45-
SourceVersion.values.toList.map(_.toString)
46-
47-
def defaultClasspath: String = sys.env.getOrElse("CLASSPATH", ".")
48-
49-
def defaultPageWidth: Int = {
50-
val defaultWidth = 80
51-
val columnsVar = System.getenv("COLUMNS")
52-
if columnsVar != null then columnsVar.toInt
53-
else if Properties.isWin then
54-
val ansiconVar = System.getenv("ANSICON") // eg. "142x32766 (142x26)"
55-
if ansiconVar != null && ansiconVar.matches("[0-9]+x.*") then
56-
ansiconVar.substring(0, ansiconVar.indexOf("x")).toInt
57-
else defaultWidth
58-
else defaultWidth
59-
}
18+
enum ScalaSettingCategories(val prefixLetter: String) extends SettingCategory:
19+
// Root settings, a category for setting that are used to configure the core compilation process
20+
case RootSetting extends ScalaSettingCategories("")
21+
// Warning settings, a category for settings that are used to enable and configure warnings
22+
case WarningSetting extends ScalaSettingCategories("W")
23+
// Fork / private settings, a category for settings that enable private or advanced features, mainly used for debugging the compiler
24+
case ForkSetting extends ScalaSettingCategories("Y")
25+
// Advanced settings, a category for settings that enable advanced, often unstable, features
26+
case AdvancedSetting extends ScalaSettingCategories("X")
27+
// Verbose settings, a category to configure the verbosity of the compiler
28+
case VerboseSetting extends ScalaSettingCategories("V")
6029

6130
object ScalaSettings extends ScalaSettings
6231

6332
// Kept as seperate type to avoid breaking backward compatibility
6433
abstract class ScalaSettings extends SettingGroup, AllScalaSettings:
65-
val settingsByCategory: Map[String, List[Setting[_]]] =
34+
val settingsByCategory: Map[SettingCategory, List[Setting[_]]] =
6635
allSettings.groupBy(_.category)
6736
.view.mapValues(_.toList).toMap
6837
.withDefaultValue(Nil)
69-
def categories: List[String] = settingsByCategory.keys.toList
70-
val rootSettings: List[Setting[_]] = settingsByCategory(RootSetting)
71-
val warningSettings: List[Setting[_]] = settingsByCategory(WarningSetting)
72-
val forkSettings: List[Setting[_]] = settingsByCategory(ForkSetting)
73-
val advancedSettings: List[Setting[_]] = settingsByCategory(AdvancedSetting)
74-
val verboseSettings: List[Setting[_]] = settingsByCategory(VerboseSetting)
38+
def categories: List[SettingCategory] = settingsByCategory.keys.toList.sortBy(_.prefixLetter)
39+
val rootSettings: List[Setting[_]] = settingsByCategory(RootSetting).sortBy(_.name)
40+
val warningSettings: List[Setting[_]] = settingsByCategory(WarningSetting).sortBy(_.name)
41+
val forkSettings: List[Setting[_]] = settingsByCategory(ForkSetting).sortBy(_.name)
42+
val advancedSettings: List[Setting[_]] = settingsByCategory(AdvancedSetting).sortBy(_.name)
43+
val verboseSettings: List[Setting[_]] = settingsByCategory(VerboseSetting).sortBy(_.name)
7544
val settingsByAliases: Map[String, Setting[_]] = allSettings.flatMap(s => s.aliases.map(_ -> s)).toMap
7645

7746

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package dotty.tools.dotc
2+
package config
3+
4+
import dotty.tools.backend.jvm.BackendUtils.classfileVersionMap
5+
import dotty.tools.io.{AbstractFile, Directory, JDK9Reflectors, PlainDirectory, NoAbstractFile}
6+
import scala.language.unsafeNulls
7+
8+
object ScalaSettingsProperties:
9+
10+
private lazy val minTargetVersion = classfileVersionMap.keysIterator.min
11+
private lazy val maxTargetVersion = classfileVersionMap.keysIterator.max
12+
13+
def supportedTargetVersions: List[String] =
14+
(minTargetVersion to maxTargetVersion).toList.map(_.toString)
15+
16+
def supportedReleaseVersions: List[String] =
17+
if scala.util.Properties.isJavaAtLeast("9") then
18+
val jdkVersion = JDK9Reflectors.runtimeVersionMajor(JDK9Reflectors.runtimeVersion()).intValue()
19+
val maxVersion = Math.min(jdkVersion, maxTargetVersion)
20+
(minTargetVersion to maxVersion).toList.map(_.toString)
21+
else List(minTargetVersion).map(_.toString)
22+
23+
def supportedScalaReleaseVersions: List[String] =
24+
ScalaRelease.values.toList.map(_.show)
25+
26+
def supportedSourceVersions: List[String] =
27+
SourceVersion.values.toList.map(_.toString)
28+
29+
def defaultClasspath: String = sys.env.getOrElse("CLASSPATH", ".")
30+
31+
def defaultPageWidth: Int = {
32+
val defaultWidth = 80
33+
val columnsVar = System.getenv("COLUMNS")
34+
if columnsVar != null then columnsVar.toInt
35+
else if Properties.isWin then
36+
val ansiconVar = System.getenv("ANSICON") // eg. "142x32766 (142x26)"
37+
if ansiconVar != null && ansiconVar.matches("[0-9]+x.*") then
38+
ansiconVar.substring(0, ansiconVar.indexOf("x")).toInt
39+
else defaultWidth
40+
else defaultWidth
41+
}

Diff for: compiler/src/dotty/tools/dotc/config/Settings.scala

+48-43
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ object Settings:
2525
val OptionTag: ClassTag[Option[?]] = ClassTag(classOf[Option[?]])
2626
val OutputTag: ClassTag[AbstractFile] = ClassTag(classOf[AbstractFile])
2727

28+
trait SettingCategory:
29+
def prefixLetter: String
30+
2831
class SettingsState(initialValues: Seq[Any], initialChanged: Set[Int] = Set.empty):
2932
private val values = ArrayBuffer(initialValues*)
3033
private val changed: mutable.Set[Int] = initialChanged.to(mutable.Set)
@@ -59,8 +62,14 @@ object Settings:
5962
ArgsSummary(sstate, arguments.tail, errors, warnings :+ msg)
6063
}
6164

65+
@unshared
66+
val settingCharacters = "[a-zA-Z0-9_\\-]*".r
67+
def validateSettingString(name: String): Unit =
68+
assert(settingCharacters.matches(name), s"Setting string $name contains invalid characters")
69+
70+
6271
case class Setting[T: ClassTag] private[Settings] (
63-
category: String,
72+
category: SettingCategory,
6473
name: String,
6574
description: String,
6675
default: T,
@@ -75,8 +84,10 @@ object Settings:
7584
// kept only for -Ykind-projector option compatibility
7685
legacyArgs: Boolean = false)(private[Settings] val idx: Int) {
7786

78-
79-
assert(name.startsWith(s"-$category"), s"Setting $name does not start with category -$category")
87+
validateSettingString(prefix.getOrElse(name))
88+
aliases.foreach(validateSettingString)
89+
prefix.foreach(validateSettingString)
90+
assert(name.startsWith(s"-${category.prefixLetter}"), s"Setting $name does not start with category -$category")
8091
assert(legacyArgs || !choices.exists(_.contains("")), s"Empty string is not supported as a choice for setting $name")
8192
// Without the following assertion, it would be easy to mistakenly try to pass a file to a setting that ignores invalid args.
8293
// Example: -opt Main.scala would be interpreted as -opt:Main.scala, and the source file would be ignored.
@@ -319,64 +330,58 @@ object Settings:
319330
setting
320331
}
321332

322-
@unshared
323-
val settingCharacters = "[a-zA-Z0-9_\\-]*".r
324-
def validateSetting(setting: String): String =
325-
assert(settingCharacters.matches(setting), s"Setting $setting contains invalid characters")
326-
setting
327-
328-
def validateAndPrependName(name: String): String =
333+
def prependName(name: String): String =
329334
assert(!name.startsWith("-"), s"Setting $name cannot start with -")
330-
"-" + validateSetting(name)
335+
"-" + name
331336

332-
def BooleanSetting(category: String, name: String, descr: String, initialValue: Boolean = false, aliases: List[String] = Nil): Setting[Boolean] =
333-
publish(Setting(category, validateAndPrependName(name), descr, initialValue, aliases = aliases.map(validateSetting)))
337+
def BooleanSetting(category: SettingCategory, name: String, descr: String, initialValue: Boolean = false, aliases: List[String] = Nil): Setting[Boolean] =
338+
publish(Setting(category, prependName(name), descr, initialValue, aliases = aliases))
334339

335-
def StringSetting(category: String, name: String, helpArg: String, descr: String, default: String, aliases: List[String] = Nil): Setting[String] =
336-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg, aliases = aliases.map(validateSetting)))
340+
def StringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: String, aliases: List[String] = Nil): Setting[String] =
341+
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases))
337342

338-
def ChoiceSetting(category: String, name: String, helpArg: String, descr: String, choices: List[String], default: String, aliases: List[String] = Nil): Setting[String] =
339-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg, Some(choices), aliases = aliases.map(validateSetting)))
343+
def ChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: String, aliases: List[String] = Nil): Setting[String] =
344+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases))
340345

341346
// Allows only args after :, but supports empty string as a choice. Used for -Ykind-projector
342-
def LegacyChoiceSetting(category: String, name: String, helpArg: String, descr: String, choices: List[String], default: String, aliases: List[String] = Nil): Setting[String] =
343-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg, Some(choices), aliases = aliases.map(validateSetting), legacyArgs = true))
347+
def LegacyChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: String, aliases: List[String] = Nil): Setting[String] =
348+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases, legacyArgs = true))
344349

345-
def MultiChoiceSetting(category: String, name: String, helpArg: String, descr: String, choices: List[String], default: List[String], aliases: List[String] = Nil): Setting[List[String]] =
346-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg, Some(choices), aliases = aliases.map(validateSetting)))
350+
def MultiChoiceSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[String], default: List[String], aliases: List[String] = Nil): Setting[List[String]] =
351+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases))
347352

348-
def MultiChoiceHelpSetting(category: String, name: String, helpArg: String, descr: String, choices: List[ChoiceWithHelp[String]], default: List[ChoiceWithHelp[String]], aliases: List[String] = Nil): Setting[List[ChoiceWithHelp[String]]] =
349-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg, Some(choices), aliases = aliases.map(validateSetting)))
353+
def MultiChoiceHelpSetting(category: SettingCategory, name: String, helpArg: String, descr: String, choices: List[ChoiceWithHelp[String]], default: List[ChoiceWithHelp[String]], aliases: List[String] = Nil): Setting[List[ChoiceWithHelp[String]]] =
354+
publish(Setting(category, prependName(name), descr, default, helpArg, Some(choices), aliases = aliases))
350355

351-
def IntSetting(category: String, name: String, descr: String, default: Int, aliases: List[String] = Nil): Setting[Int] =
352-
publish(Setting(category, validateAndPrependName(name), descr, default, aliases = aliases.map(validateSetting)))
356+
def IntSetting(category: SettingCategory, name: String, descr: String, default: Int, aliases: List[String] = Nil): Setting[Int] =
357+
publish(Setting(category, prependName(name), descr, default, aliases = aliases))
353358

354-
def IntChoiceSetting(category: String, name: String, descr: String, choices: Seq[Int], default: Int): Setting[Int] =
355-
publish(Setting(category, validateAndPrependName(name), descr, default, choices = Some(choices)))
359+
def IntChoiceSetting(category: SettingCategory, name: String, descr: String, choices: Seq[Int], default: Int): Setting[Int] =
360+
publish(Setting(category, prependName(name), descr, default, choices = Some(choices)))
356361

357-
def MultiStringSetting(category: String, name: String, helpArg: String, descr: String, default: List[String] = Nil, aliases: List[String] = Nil): Setting[List[String]] =
358-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg, aliases = aliases.map(validateSetting)))
362+
def MultiStringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: List[String] = Nil, aliases: List[String] = Nil): Setting[List[String]] =
363+
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases))
359364

360-
def OutputSetting(category: String, name: String, helpArg: String, descr: String, default: AbstractFile): Setting[AbstractFile] =
361-
publish(Setting(category, validateAndPrependName(name), descr, default, helpArg))
365+
def OutputSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: AbstractFile): Setting[AbstractFile] =
366+
publish(Setting(category, prependName(name), descr, default, helpArg))
362367

363-
def PathSetting(category: String, name: String, descr: String, default: String, aliases: List[String] = Nil): Setting[String] =
364-
publish(Setting(category, validateAndPrependName(name), descr, default, aliases = aliases.map(validateSetting)))
368+
def PathSetting(category: SettingCategory, name: String, descr: String, default: String, aliases: List[String] = Nil): Setting[String] =
369+
publish(Setting(category, prependName(name), descr, default, aliases = aliases))
365370

366-
def PhasesSetting(category: String, name: String, descr: String, default: String = "", aliases: List[String] = Nil): Setting[List[String]] =
367-
publish(Setting(category, validateAndPrependName(name), descr, if (default.isEmpty) Nil else List(default), aliases = aliases.map(validateSetting)))
371+
def PhasesSetting(category: SettingCategory, name: String, descr: String, default: String = "", aliases: List[String] = Nil): Setting[List[String]] =
372+
publish(Setting(category, prependName(name), descr, if (default.isEmpty) Nil else List(default), aliases = aliases))
368373

369-
def PrefixSetting(category: String, name: String, descr: String): Setting[List[String]] =
374+
def PrefixSetting(category: SettingCategory, name: String, descr: String): Setting[List[String]] =
370375
val prefix = name.takeWhile(_ != '<')
371-
publish(Setting(category, "-" + name, descr, Nil, prefix = Some(validateSetting(prefix))))
376+
publish(Setting(category, "-" + name, descr, Nil, prefix = Some(prefix)))
372377

373-
def VersionSetting(category: String, name: String, descr: String, default: ScalaVersion = NoScalaVersion): Setting[ScalaVersion] =
374-
publish(Setting(category, validateAndPrependName(name), descr, default))
378+
def VersionSetting(category: SettingCategory, name: String, descr: String, default: ScalaVersion = NoScalaVersion): Setting[ScalaVersion] =
379+
publish(Setting(category, prependName(name), descr, default))
375380

376-
def OptionSetting[T: ClassTag](category: String, name: String, descr: String, aliases: List[String] = Nil): Setting[Option[T]] =
377-
publish(Setting(category, validateAndPrependName(name), descr, None, propertyClass = Some(summon[ClassTag[T]].runtimeClass), aliases = aliases.map(validateSetting)))
381+
def OptionSetting[T: ClassTag](category: SettingCategory, name: String, descr: String, aliases: List[String] = Nil): Setting[Option[T]] =
382+
publish(Setting(category, prependName(name), descr, None, propertyClass = Some(summon[ClassTag[T]].runtimeClass), aliases = aliases))
378383

379-
def DeprecatedSetting(category: String, name: String, descr: String, deprecationMsg: String): Setting[Boolean] =
380-
publish(Setting(category, validateAndPrependName(name), descr, false, deprecationMsg = Some(deprecationMsg)))
384+
def DeprecatedSetting(category: SettingCategory, name: String, descr: String, deprecationMsg: String): Setting[Boolean] =
385+
publish(Setting(category, prependName(name), descr, false, deprecationMsg = Some(deprecationMsg)))
381386
}
382387
end Settings

0 commit comments

Comments
 (0)