Skip to content

Commit a7276ad

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 e6636ba commit a7276ad

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
@@ -15,8 +15,8 @@ import dotty.tools.dotc.core.StdNames.nme
1515
import dotty.tools.dotc.core.Symbols.{ClassSymbol, NoSymbol, Symbol, defn, isDeprecated, requiredClass, requiredModule}
1616
import dotty.tools.dotc.core.Types.*
1717
import dotty.tools.dotc.report
18-
import dotty.tools.dotc.reporting.{Action, CodeAction, Diagnostic, UnusedSymbol, WConf}
19-
import dotty.tools.dotc.rewrites.Rewrites
18+
import dotty.tools.dotc.reporting.{CodeAction, Diagnostic, UnusedSymbol}
19+
import dotty.tools.dotc.rewrites.Rewrites.ActionPatch
2020
import dotty.tools.dotc.transform.MegaPhase.MiniPhase
2121
import dotty.tools.dotc.typer.{ImportInfo, Typer}
2222
import dotty.tools.dotc.typer.Deriving.OriginalTypeClass
@@ -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)