@@ -5,8 +5,14 @@ import CommandLineParser.tokenize
55import Settings ._
66
77import org .junit .Test
8+ import org .junit .Ignore
89import org .junit .Assert ._
910import core .Decorators .toMessage
11+ import dotty .tools .io .{Path , PlainFile }
12+
13+ import java .net .URI
14+ import java .nio .file .Files
15+ import scala .util .Using
1016
1117class ScalaSettingsTests :
1218
@@ -83,4 +89,115 @@ class ScalaSettingsTests:
8389 val nowr = new Diagnostic .Warning (" This is a problem." .toMessage, util.NoSourcePosition )
8490 assertEquals(Action .Silent , sut.action(nowr))
8591
92+ @ Ignore (" LTS backport rejected: https://github.com/scala/scala3/pull/18503" )
93+ @ Test def `i18367 rightmost WConf flags take precedence over flags to the left` : Unit =
94+ import reporting .{Action , Diagnostic }
95+ val sets = new ScalaSettings
96+ val args = List (" -Wconf:cat=deprecation:e" , " -Wconf:cat=deprecation:s" )
97+ val sumy = ArgsSummary (sets.defaultState, args, errors = Nil , warnings = Nil )
98+ val proc = sets.processArguments(sumy, processAll = true , skipped = Nil )
99+ val conf = sets.Wconf .valueIn(proc.sstate)
100+ val msg = " Don't use that!" .toMessage
101+ val depr = new Diagnostic .DeprecationWarning (msg, util.NoSourcePosition )
102+ val sut = reporting.WConf .fromSettings(conf).getOrElse(??? )
103+ assertEquals(Action .Silent , sut.action(depr))
104+
105+
106+ private def wconfSrcFilterTest (argsStr : String ,
107+ warning : reporting.Diagnostic .Warning ): Either [List [String ], reporting.Action ] =
108+ import reporting .Diagnostic
109+ val settings = new ScalaSettings
110+ val args = ArgsSummary (settings.defaultState, List (argsStr), errors = Nil , warnings = Nil )
111+ val proc = settings.processArguments(args, processAll = true , skipped = Nil )
112+ val wconfStr = settings.Wconf .valueIn(proc.sstate)
113+ val wconf = reporting.WConf .fromSettings(wconfStr)
114+ wconf.map(_.action(warning))
115+
116+ @ Test def `WConf src filter silences warnings from a matching path for virtual file` : Unit =
117+ val result = wconfSrcFilterTest(
118+ argsStr = " -Wconf:src=path/.*:s" ,
119+ warning = reporting.Diagnostic .Warning (
120+ " A warning" .toMessage,
121+ util.SourcePosition (
122+ source = util.SourceFile .virtual(new URI (" file:///some/path/file.scala" ), " " ),
123+ span = util.Spans .Span (1L )
124+ )
125+ )
126+ )
127+ assertEquals(result, Right (reporting.Action .Silent ))
128+
129+ @ Test def `WConf src filter doesn't silence warnings from a non-matching path` : Unit =
130+ val result = wconfSrcFilterTest(
131+ argsStr = " -Wconf:src=another/.*:s" ,
132+ warning = reporting.Diagnostic .Warning (
133+ " A warning" .toMessage,
134+ util.SourcePosition (
135+ source = util.SourceFile .virtual(new URI (" file:///some/path/file.scala" ), " " ),
136+ span = util.Spans .Span (1L )
137+ )
138+ )
139+ )
140+ assertEquals(result, Right (reporting.Action .Warning ))
141+
142+ @ Test def `WConf src filter silences warnings from a matching path for real file` : Unit =
143+ val result = Using .resource(Files .createTempFile(" myfile" , " .scala" ).nn) { file =>
144+ wconfSrcFilterTest(
145+ argsStr = " -Wconf:src=myfile.*?\\ .scala:s" ,
146+ warning = reporting.Diagnostic .Warning (
147+ " A warning" .toMessage,
148+ util.SourcePosition (
149+ source = util.SourceFile (new PlainFile (Path (file)), " UTF-8" ),
150+ span = util.Spans .Span (1L )
151+ )
152+ )
153+ )
154+ }(Files .deleteIfExists(_))
155+ assertEquals(result, Right (reporting.Action .Silent ))
156+
157+ @ Test def `WConf src filter doesn't silence warnings from a non-matching path for real file` : Unit =
158+ val result = Using .resource(Files .createTempFile(" myfile" , " .scala" ).nn) { file =>
159+ wconfSrcFilterTest(
160+ argsStr = " -Wconf:src=another.*?\\ .scala:s" ,
161+ warning = reporting.Diagnostic .Warning (
162+ " A warning" .toMessage,
163+ util.SourcePosition (
164+ source = util.SourceFile (new PlainFile (Path (file)), " UTF-8" ),
165+ span = util.Spans .Span (1L )
166+ )
167+ )
168+ )
169+ }(Files .deleteIfExists(_))
170+ assertEquals(result, Right (reporting.Action .Warning ))
171+
172+ @ Test def `WConf src filter reports an error on an invalid regex` : Unit =
173+ val result = wconfSrcFilterTest(
174+ argsStr = """ -Wconf:src=\:s""" ,
175+ warning = reporting.Diagnostic .Warning (
176+ " A warning" .toMessage,
177+ util.SourcePosition (
178+ source = util.SourceFile .virtual(new URI (" file:///some/path/file.scala" ), " " ),
179+ span = util.Spans .Span (1L )
180+ )
181+ ),
182+ )
183+ assertTrue(
184+ result.left.exists(errors =>
185+ errors.sizeIs == 1 && errors.headOption.exists(_.startsWith(" invalid pattern" ))
186+ )
187+ )
188+
189+ @ Ignore (" LTS backport rejected: https://github.com/scala/scala3/pull/18503" )
190+ @ Test def `WConf src filter can be mixed with other filters with rightmost taking precedence` : Unit =
191+ val result = wconfSrcFilterTest(
192+ argsStr = " -Wconf:src=.*:s,cat=deprecation:e" ,
193+ warning = reporting.Diagnostic .DeprecationWarning (
194+ " A warning" .toMessage,
195+ util.SourcePosition (
196+ source = util.SourceFile .virtual(new URI (" file:///some/path/file.scala" ), " " ),
197+ span = util.Spans .Span (1L )
198+ )
199+ )
200+ )
201+ assertEquals(result, Right (reporting.Action .Error ))
202+
86203end ScalaSettingsTests
0 commit comments