Skip to content
Draft
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
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 @@ -365,7 +365,7 @@ private sealed trait XSettings:

/** Pipeline compilation options */
val XjavaTasty: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xjava-tasty", "Pickler phase should compute TASTy for .java defined symbols for use by build tools", aliases = List("-Xpickle-java", "-Yjava-tasty", "-Ypickle-java"), preferPrevious = true)
val XearlyTastyOutput: Setting[AbstractFile] = OutputSetting(AdvancedSetting, "Xearly-tasty-output", "directory|jar", "Destination to write generated .tasty files to for use in pipelined compilation.", NoAbstractFile, aliases = List("-Xpickle-write", "-Yearly-tasty-output", "-Ypickle-write"), preferPrevious = true)
val XearlyTastyOutput: Setting[AbstractFile] = OutputSetting(AdvancedSetting, "Xearly-tasty-output", "directory|jar", "Destination to write generated .tasty files to for use in pipelined compilation.", NoAbstractFile, aliases = List("-Xpickle-write", "-Yearly-tasty-output", "-Ypickle-write"), ignoreInvalidArgs = true, preferPrevious = true)
val XallowOutlineFromTasty: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xallow-outline-from-tasty", "Allow outline TASTy to be loaded with the -from-tasty option.", aliases = List("-Yallow-outline-from-tasty"))

val XmixinForceForwarders = ChoiceSetting(
Expand Down
8 changes: 5 additions & 3 deletions compiler/src/dotty/tools/dotc/config/Settings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,9 @@ object Settings:
else return missingArg
def doSet(arg: String, args: List[String]) =
ct match
case _ if preferPrevious && changed => state.warn(s"Ignoring update of option $name", args)
case _ if preferPrevious && changed =>
if ignoreInvalidArgs then state.shifted(args)
else state.warn(s"Ignoring update of option $name", args)
case ListTag => setMultivalue(arg, args)
case StringTag => setString(arg, args)
case OutputTag => setOutput(arg, args)
Expand Down Expand Up @@ -476,8 +478,8 @@ object Settings:
def MultiStringSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: List[String] = Nil, aliases: List[SettingAlias] = Nil, deprecation: Option[Deprecation] = None): Setting[List[String]] =
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, deprecation = deprecation))

def OutputSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: AbstractFile, aliases: List[SettingAlias] = Nil, preferPrevious: Boolean = false, deprecation: Option[Deprecation] = None): Setting[AbstractFile] =
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, preferPrevious = preferPrevious, deprecation = deprecation))
def OutputSetting(category: SettingCategory, name: String, helpArg: String, descr: String, default: AbstractFile, aliases: List[SettingAlias] = Nil, preferPrevious: Boolean = false, deprecation: Option[Deprecation] = None, ignoreInvalidArgs: Boolean = false): Setting[AbstractFile] =
publish(Setting(category, prependName(name), descr, default, helpArg, aliases = aliases, preferPrevious = preferPrevious, deprecation = deprecation, ignoreInvalidArgs = ignoreInvalidArgs))

def PathSetting(category: SettingCategory, name: String, descr: String, default: String, aliases: List[SettingAlias] = Nil, deprecation: Option[Deprecation] = None): Setting[String] =
publish(Setting(category, prependName(name), descr, default, aliases = aliases, deprecation = deprecation))
Expand Down
22 changes: 20 additions & 2 deletions compiler/test/dotty/tools/dotc/SettingsTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import dotty.tools.vulpix.TestConfiguration.mkClasspath
import dotty.tools.io.PlainDirectory
import dotty.tools.io.Directory
import dotty.tools.dotc.config.ScalaVersion
import io.PlainFile, PlainFile.*

import java.nio.file.*, Files.*

Expand Down Expand Up @@ -253,8 +254,6 @@ class SettingsTests:
assertTrue(summary.warnings.forall(_.contains("updated")))

@Test def `dir option also warns`: Unit =
import java.nio.file.Paths
import io.PlainFile, PlainFile.*
val abc: PlainFile = Paths.get("a", "b", "c").toPlainFile
object Settings extends SettingGroup:
val option = OutputSetting(RootSetting, "option", "out", "A file", Paths.get("a", "b", "c").toPlainFile)
Expand Down Expand Up @@ -474,6 +473,25 @@ class SettingsTests:
assertThrows[AssertionError](_.getMessage.contains("replaced by")):
flag

@Test def `Ignored setting shifts args`: Unit =
object Settings extends SettingGroup:
val foo = BooleanSetting(RootSetting, "foo", "foo", ignoreInvalidArgs = true, preferPrevious = true)
val bar = BooleanSetting(RootSetting, "bar", "bar")
val baz = OutputSetting(RootSetting, "out", "dir", "A file", default = Paths.get("out", "baz").toPlainFile,
ignoreInvalidArgs = true, preferPrevious = true)
import Settings.*
Using.resource(createTempDirectory("testDir")): dir =>
val out = createDirectory(dir.resolve("x"))
val args = List("-out", out.toString, "-out", s"$dir/y", "-foo:true", "-foo:false", "-bar:true")
val summary = processArguments(args, processAll = true)
assertTrue(summary.errors.mkString(","), summary.errors.isEmpty)
assertEquals(1, summary.warnings.size)
assertEquals("Ignoring conflicting value for Boolean flag -foo", summary.warnings.head)
assertEquals(1L, Files.list(dir).count) // second -out is ignored, no dir/y exists
withProcessedArgs(summary):
assertTrue(foo.value)
assertTrue(bar.value)

// use the supplied summary for evaluating settings
private def withProcessedArgs(summary: ArgsSummary)(f: SettingsState ?=> Unit) = f(using summary.sstate)

Expand Down
20 changes: 20 additions & 0 deletions compiler/test/dotty/tools/dotc/config/ScalaSettingsTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package config

import CommandLineParser.tokenize
import Settings._
import dotty.tools.Useables.given
import dotty.tools.dotc.config.ScalaSettingCategories._
import org.junit.Test
import org.junit.Assert._
Expand Down Expand Up @@ -317,4 +318,23 @@ class ScalaSettingsTests:
assertEquals("Option -Xfatal-warnings is a deprecated alias: use -Werror instead", result.warnings.head)
assertEquals(0, result.errors.length)

// see sbt-test/pipelining/pipelining-test/test
@Test def `-Xearly-tasty-output preferPrevious does not warn on change of value`: Unit =
val settings = ScalaSettings
val conf = Using.resource(Files.createTempDirectory("testDir")): dir =>
val args = List("-Ypickle-write", s"$dir/foo.jar", "-Ypickle-write", s"$dir/bar.jar")
val argSummary = ArgsSummary(settings.defaultState, args, errors = Nil, warnings = Nil)
settings.processArguments(argSummary, processAll = true, skipped = Nil)
assert(conf.warnings.isEmpty, s"WARN: ${conf.warnings}")
assert(conf.errors.isEmpty, s"ERROR: ${conf.errors}")

@Test def `-Xjava-tasty preferPrevious warns on change of value`: Unit =
val settings = ScalaSettings
val args = List("-Xjava-tasty", "-Xjava-tasty:false")
val argSummary = ArgsSummary(settings.defaultState, args, errors = Nil, warnings = Nil)
val conf = settings.processArguments(argSummary, processAll = true, skipped = Nil)
assertEquals(s"Warnings [${conf.warnings}]", 1, conf.warnings.size)
assertEquals("Ignoring conflicting value for Boolean flag -Xjava-tasty", conf.warnings.head)
assert(conf.errors.isEmpty, s"ERROR: ${conf.errors}")

end ScalaSettingsTests
Loading