Skip to content

Commit

Permalink
move [quick fix available] to the end of the message
Browse files Browse the repository at this point in the history
allow skipping it with `-quickfix:silent`

make more error quickfixes available to `-quickfix` rewrite by
using `runReporting.error` instead of `reporter.error`.
  • Loading branch information
lrytz committed Aug 17, 2023
1 parent 5f46db7 commit 6bb165d
Show file tree
Hide file tree
Showing 93 changed files with 349 additions and 328 deletions.
6 changes: 4 additions & 2 deletions src/compiler/scala/tools/nsc/Reporting.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ trait Reporting extends internal.Reporting { self: ast.Positions with Compilatio
if (settings.quickfix.isSetByUser && settings.quickfix.value.isEmpty) {
globalError(s"Missing message filter for `-quickfix`; see `-quickfix:help` or use `-quickfix:any` to apply all available quick fixes.")
Nil
} else if (settings.quickFixSilent) {
Nil
} else {
val parsed = settings.quickfix.value.map(WConf.parseFilter(_, rootDirPrefix))
val msgs = parsed.collect { case Left(msg) => msg }
Expand Down Expand Up @@ -167,7 +169,7 @@ trait Reporting extends internal.Reporting { self: ast.Positions with Compilatio

val quickfixed = {
if (!skipRewriteAction(action) && registerTextEdit(warning)) s"[rewritten by -quickfix] ${warning.msg}"
else if (warning.actions.exists(_.edits.nonEmpty)) s"[quick fix available] ${warning.msg}"
else if (warning.actions.exists(_.edits.nonEmpty) && !settings.quickFixSilent) s"${warning.msg} [quick fix available]"
else warning.msg
}

Expand Down Expand Up @@ -359,7 +361,7 @@ trait Reporting extends internal.Reporting { self: ast.Positions with Compilatio
def error(pos: Position, msg: String, actions: List[CodeAction]): Unit = {
val quickfixed = {
if (registerErrorTextEdit(pos, msg, actions)) s"[rewritten by -quickfix] $msg"
else if (actions.exists(_.edits.nonEmpty)) s"[quick fix available] $msg"
else if (actions.exists(_.edits.nonEmpty) && !settings.quickFixSilent) s"$msg [quick fix available]"
else msg
}
reporter.error(pos, quickfixed, actions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,11 @@ trait StandardScalaSettings { _: MutableSettings =>
| -quickfix:msg=Auto-application apply quick fixes where the message contains "Auto-application"
|
|Use `-Wconf:any:warning-verbose` to display applicable message filters with each warning.
|
|Use `-quickfix:silent` to remove the `[quick fix available]` tags from compiler messages.
|""".stripMargin),
prepend = true)
def quickFixSilent: Boolean = quickfix.value == List("silent")
val release =
ChoiceSetting("-release", "release", "Compile for a version of the Java API and target class file.", AllTargetVersions, normalizeTarget(javaSpecVersion))
.withPostSetHook { setting =>
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/typechecker/Contexts.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1851,7 +1851,7 @@ trait Contexts { self: Analyzer =>

private[typechecker] class ImmediateReporter(_errorBuffer: mutable.LinkedHashSet[AbsTypeError] = null, _warningBuffer: mutable.LinkedHashSet[ContextWarning] = null) extends ContextReporter(_errorBuffer, _warningBuffer) {
override def makeBuffering: ContextReporter = new BufferingReporter(errorBuffer, warningBuffer)
def error(pos: Position, msg: String, actions: List[CodeAction]): Unit = reporter.error(pos, msg, actions)
def error(pos: Position, msg: String, actions: List[CodeAction]): Unit = runReporting.error(pos, msg, actions)
}

private[typechecker] class BufferingReporter(_errorBuffer: mutable.LinkedHashSet[AbsTypeError] = null, _warningBuffer: mutable.LinkedHashSet[ContextWarning] = null) extends ContextReporter(_errorBuffer, _warningBuffer) {
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ abstract class RefChecks extends Transform {
infoStringWithLocation(other) + (if (msg.isEmpty) "" else s"\n$indent") + msg + addendum
}
def emitOverrideError(fullmsg: String, actions: List[CodeAction] = Nil): Unit = {
if (memberClass == clazz) reporter.error(member.pos, fullmsg, actions)
if (memberClass == clazz) runReporting.error(member.pos, fullmsg, actions)
else mixinOverrideErrors += MixinOverrideError(member, fullmsg)
}

Expand Down
2 changes: 1 addition & 1 deletion test/files/jvm/interpreter.check
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class Bar

scala> implicit def foo2bar(foo: Foo) = Bar(foo.n)
^
warning: [quick fix available] Implicit definition should have explicit type (inferred Bar)
warning: Implicit definition should have explicit type (inferred Bar) [quick fix available]
warning: 1 feature warning; for details, enable `:setting -feature` or `:replay -feature`
def foo2bar(foo: Foo): Bar

Expand Down
4 changes: 2 additions & 2 deletions test/files/neg/auto-application.check
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ auto-application.scala:5: error: Int does not take parameters
auto-application.scala:6: error: Int does not take parameters
("": Object).##()
^
auto-application.scala:9: warning: [quick fix available] Auto-application to `()` is deprecated. Supply the empty argument list `()` explicitly to invoke method meth,
auto-application.scala:9: warning: Auto-application to `()` is deprecated. Supply the empty argument list `()` explicitly to invoke method meth,
or remove the empty argument list from its definition (Java-defined methods are exempt).
In Scala 3, an unapplied method like this will be eta-expanded into a function.
In Scala 3, an unapplied method like this will be eta-expanded into a function. [quick fix available]
meth // warn, auto-application (of nilary methods) is deprecated
^
1 warning
Expand Down
2 changes: 1 addition & 1 deletion test/files/neg/checksensible.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
checksensible.scala:54: warning: [quick fix available] symbol literal is deprecated; use Symbol("sym") instead
checksensible.scala:54: warning: symbol literal is deprecated; use Symbol("sym") instead [quick fix available]
(1 != 'sym)
^
checksensible.scala:15: warning: comparing a fresh object using `eq` will always yield false
Expand Down
36 changes: 18 additions & 18 deletions test/files/neg/deprecated_widening.check
Original file line number Diff line number Diff line change
@@ -1,55 +1,55 @@
deprecated_widening.scala:5: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:5: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
val i_f: Float = i // deprecated
^
deprecated_widening.scala:7: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:7: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
val l_f: Float = l // deprecated
^
deprecated_widening.scala:8: warning: [quick fix available] Widening conversion from Long to Double is deprecated because it loses precision. Write `.toDouble` instead.
deprecated_widening.scala:8: warning: Widening conversion from Long to Double is deprecated because it loses precision. Write `.toDouble` instead. [quick fix available]
val l_d: Double = l // deprecated
^
deprecated_widening.scala:23: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:23: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
val truncatedPosFloat:Float = 16777217L // deprecated
^
deprecated_widening.scala:26: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:26: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
val truncatedNegFloat: Float = - 16777217L // deprecated
^
deprecated_widening.scala:30: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:30: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
val truncatedPosFloatI:Float = 16777217 // deprecated
^
deprecated_widening.scala:33: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:33: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
val truncatedNegFloatI: Float = - 16777217 // deprecated
^
deprecated_widening.scala:37: warning: [quick fix available] Widening conversion from Long to Double is deprecated because it loses precision. Write `.toDouble` instead.
deprecated_widening.scala:37: warning: Widening conversion from Long to Double is deprecated because it loses precision. Write `.toDouble` instead. [quick fix available]
val truncatedPosDouble:Double = 18014398509481985L // deprecated
^
deprecated_widening.scala:40: warning: [quick fix available] Widening conversion from Long to Double is deprecated because it loses precision. Write `.toDouble` instead.
deprecated_widening.scala:40: warning: Widening conversion from Long to Double is deprecated because it loses precision. Write `.toDouble` instead. [quick fix available]
val truncatedNegDouble: Double = - 18014398509481985L // deprecated
^
deprecated_widening.scala:47: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:47: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def literals = Set[Float](0x7fffffc0, 0x7ffffffd, 0x7ffffffe, 0x7fffffff)
^
deprecated_widening.scala:47: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:47: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def literals = Set[Float](0x7fffffc0, 0x7ffffffd, 0x7ffffffe, 0x7fffffff)
^
deprecated_widening.scala:47: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:47: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def literals = Set[Float](0x7fffffc0, 0x7ffffffd, 0x7ffffffe, 0x7fffffff)
^
deprecated_widening.scala:48: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:48: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def longingly = Set[Float](0x7fffffc0L, 0x7ffffffdL, 0x7ffffffeL, 0x7fffffffL)
^
deprecated_widening.scala:48: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:48: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def longingly = Set[Float](0x7fffffc0L, 0x7ffffffdL, 0x7ffffffeL, 0x7fffffffL)
^
deprecated_widening.scala:48: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:48: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def longingly = Set[Float](0x7fffffc0L, 0x7ffffffdL, 0x7ffffffeL, 0x7fffffffL)
^
deprecated_widening.scala:48: warning: [quick fix available] Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:48: warning: Widening conversion from Long to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def longingly = Set[Float](0x7fffffc0L, 0x7ffffffdL, 0x7ffffffeL, 0x7fffffffL)
^
deprecated_widening.scala:50: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:50: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def `pick one` = Set[Float](0x1000003, 0x1000004, 0x1000005)
^
deprecated_widening.scala:50: warning: [quick fix available] Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead.
deprecated_widening.scala:50: warning: Widening conversion from Int to Float is deprecated because it loses precision. Write `.toFloat` instead. [quick fix available]
def `pick one` = Set[Float](0x1000003, 0x1000004, 0x1000005)
^
deprecated_widening.scala:12: warning: method int2float in object Int is deprecated (since 2.13.1): Implicit conversion from Int to Float is dangerous because it loses precision. Write `.toFloat` instead.
Expand Down
6 changes: 3 additions & 3 deletions test/files/neg/dotless-targs-a.check
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
dotless-targs-a.scala:4: error: [quick fix available] type application is not allowed for infix operators
dotless-targs-a.scala:4: error: type application is not allowed for infix operators [quick fix available]
Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration
def fn2 = List apply[Int] 2
^
dotless-targs-a.scala:9: error: [quick fix available] type application is not allowed for infix operators
dotless-targs-a.scala:9: error: type application is not allowed for infix operators [quick fix available]
Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration
def h1 = List apply[List[Int]] (List(1), List(2)) mapConserve[List[Any]] (x => x)
^
dotless-targs-a.scala:9: error: [quick fix available] type application is not allowed for infix operators
dotless-targs-a.scala:9: error: type application is not allowed for infix operators [quick fix available]
Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration
def h1 = List apply[List[Int]] (List(1), List(2)) mapConserve[List[Any]] (x => x)
Expand Down
6 changes: 3 additions & 3 deletions test/files/neg/dotless-targs-b.check
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
dotless-targs-b.scala:4: error: [quick fix available] type application is not allowed for infix operators
dotless-targs-b.scala:4: error: type application is not allowed for infix operators [quick fix available]
Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration
def fn2 = List apply[Int] 2
^
dotless-targs-b.scala:9: error: [quick fix available] type application is not allowed for infix operators
dotless-targs-b.scala:9: error: type application is not allowed for infix operators [quick fix available]
Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration
def h1 = List apply[List[Int]] (List(1), List(2)) mapConserve[List[Any]] (x => x)
^
dotless-targs-b.scala:9: error: [quick fix available] type application is not allowed for infix operators
dotless-targs-b.scala:9: error: type application is not allowed for infix operators [quick fix available]
Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration
def h1 = List apply[List[Int]] (List(1), List(2)) mapConserve[List[Any]] (x => x)
Expand Down
10 changes: 5 additions & 5 deletions test/files/neg/dotless-targs-ranged-a.check
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
dotless-targs-ranged-a.scala:4: warning: [quick fix available] type application is not allowed for infix operators
dotless-targs-ranged-a.scala:4: warning: type application is not allowed for infix operators [quick fix available]
def fn2 = List apply[Int] 2
^
dotless-targs-ranged-a.scala:9: warning: [quick fix available] type application is not allowed for infix operators
dotless-targs-ranged-a.scala:9: warning: type application is not allowed for infix operators [quick fix available]
def h1 = List apply[List[Int]] (List(1), List(2)) mapConserve[List[Any]] (x => x)
^
dotless-targs-ranged-a.scala:9: warning: [quick fix available] type application is not allowed for infix operators
dotless-targs-ranged-a.scala:9: warning: type application is not allowed for infix operators [quick fix available]
def h1 = List apply[List[Int]] (List(1), List(2)) mapConserve[List[Any]] (x => x)
^
dotless-targs-ranged-a.scala:13: warning: [quick fix available] type application is not allowed for infix operators
dotless-targs-ranged-a.scala:13: warning: type application is not allowed for infix operators [quick fix available]
def eval = 1 ->[Int] 2
^
dotless-targs-ranged-a.scala:14: warning: [quick fix available] type application is not allowed for infix operators
dotless-targs-ranged-a.scala:14: warning: type application is not allowed for infix operators [quick fix available]
def evil = new A() op [Int, String ] 42
^
dotless-targs-ranged-a.scala:9: warning: multiarg infix syntax looks like a tuple and will be deprecated
Expand Down

0 comments on commit 6bb165d

Please sign in to comment.