Skip to content

Commit 28f9890

Browse files
committed
Reporter applies lint actions
Instead of testing whether to emit actions by probing suppressions, just let the reporter apply LintWarning actions when the warning is actually reported.
1 parent df87147 commit 28f9890

File tree

4 files changed

+13
-22
lines changed

4 files changed

+13
-22
lines changed

compiler/src/dotty/tools/dotc/reporting/Diagnostic.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@ object Diagnostic:
4040
*/
4141
trait OriginWarning(val origin: String):
4242
self: Warning =>
43+
object OriginWarning:
44+
val NoOrigin = "..."
4345

4446
/** Lints are likely to be filtered. Provide extra axes for filtering by `-Wconf`.
4547
*/
46-
class LintWarning(msg: Message, pos: SourcePosition, origin: String)
48+
class LintWarning(msg: Message, pos: SourcePosition, origin: String = OriginWarning.NoOrigin)
4749
extends Warning(msg, pos), OriginWarning(origin)
4850

4951
class Warning(

compiler/src/dotty/tools/dotc/reporting/Reporter.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import dotty.tools.dotc.core.Mode
99
import dotty.tools.dotc.core.Symbols.{NoSymbol, Symbol}
1010
import dotty.tools.dotc.reporting.Diagnostic.*
1111
import dotty.tools.dotc.reporting.Message.*
12+
import dotty.tools.dotc.rewrites.Rewrites
1213
import dotty.tools.dotc.util.NoSourcePosition
1314

1415
import java.io.{BufferedReader, PrintWriter}
@@ -170,6 +171,8 @@ abstract class Reporter extends interfaces.ReporterResult {
170171
handleRecursive("error reporting", dia.message, ex)
171172
dia match {
172173
case w: Warning =>
174+
if w.isInstanceOf[LintWarning] then
175+
w.msg.actions.foreach(Rewrites.applyAction)
173176
warnings = w :: warnings
174177
_warningCount += 1
175178
case e: Error =>

compiler/src/dotty/tools/dotc/reporting/WConf.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ enum MessageFilter:
3434
pattern.findFirstIn(path).nonEmpty
3535
case Origin(pattern) =>
3636
message match
37-
case message: OriginWarning => pattern.findFirstIn(message.origin).nonEmpty
37+
case message: OriginWarning if message.origin != OriginWarning.NoOrigin =>
38+
pattern.findFirstIn(message.origin).nonEmpty
3839
case _ => false
3940
case None => false
4041

compiler/src/dotty/tools/dotc/transform/CheckUnused.scala

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import Scopes.newScope
1111
import StdNames.nme
1212
import Symbols.{ClassSymbol, NoSymbol, Symbol, defn, isDeprecated, requiredClass, requiredModule}
1313
import Types.*
14-
import reporting.{Action, CodeAction, Diagnostic, UnusedSymbol, WConf}
15-
import rewrites.Rewrites
14+
import reporting.{CodeAction, Diagnostic, UnusedSymbol}
15+
import rewrites.Rewrites.ActionPatch
1616

1717
import MegaPhase.MiniPhase
1818
import typer.{ImportInfo, Typer}
@@ -549,29 +549,15 @@ object CheckUnused:
549549

550550
def reportUnused()(using Context): Unit =
551551
for (msg, pos, origin) <- warnings do
552-
if origin.isEmpty then report.warning(msg, pos)
553-
else report.warning(msg, pos, origin)
554-
// avoid rewrite if warning will be suppressed (would be nice if reporter knew how to apply actions)
555-
msg.actions.headOption match
556-
case Some(action) if ctx.run != null =>
557-
val dia =
558-
if origin.isEmpty then Diagnostic.Warning(msg, pos.sourcePos)
559-
else Diagnostic.LintWarning(msg, pos.sourcePos, origin)
560-
ctx.run.nn.suppressions.nowarnAction(dia) match
561-
case Action.Warning =>
562-
WConf.parsed.action(dia) match
563-
case Action.Error | Action.Warning =>
564-
Rewrites.applyAction(action)
565-
case _ =>
566-
case _ =>
567-
case _ =>
552+
report.warning(msg, pos, origin)
568553

569554
type MessageInfo = (UnusedSymbol, SrcPos, String) // string is origin or empty
570555

571556
def warnings(using Context): Array[MessageInfo] =
572557
val actionable = ctx.settings.rewrite.value.nonEmpty
573558
val warnings = ArrayBuilder.make[MessageInfo]
574-
def warnAt(pos: SrcPos)(msg: UnusedSymbol, origin: String = ""): Unit = warnings.addOne((msg, pos, origin))
559+
def warnAt(pos: SrcPos)(msg: UnusedSymbol, origin: String = Diagnostic.OriginWarning.NoOrigin): Unit =
560+
warnings.addOne((msg, pos, origin))
575561
val infos = refInfos
576562

577563
// non-local sym was target of assignment or has a sibling setter that was referenced
@@ -734,7 +720,6 @@ object CheckUnused:
734720

735721
def checkImports() =
736722
import scala.jdk.CollectionConverters.given
737-
import Rewrites.ActionPatch
738723
type ImpSel = (Import, ImportSelector)
739724
def isUsed(sel: ImportSelector): Boolean = infos.sels.containsKey(sel)
740725
def warnImport(warnable: ImpSel, actions: List[CodeAction] = Nil): Unit =

0 commit comments

Comments
 (0)