Skip to content

Commit fa4f2a1

Browse files
committed
improvement: Suggest to add using as a code action
This should add the code action to both Metals and Intellij. I will try to go over the existing rewrites to see if we can add more actions easily. Fixes #23071
1 parent c4531d4 commit fa4f2a1

File tree

6 files changed

+40
-11
lines changed

6 files changed

+40
-11
lines changed

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -424,12 +424,17 @@ trait NoDisambiguation extends Message:
424424
withoutDisambiguation()
425425

426426
/** The fallback `Message` containing no explanation and having no `kind` */
427-
final class NoExplanation(msgFn: Context ?=> String)(using Context) extends Message(ErrorMessageID.NoExplanationID) {
427+
final class NoExplanation(msgFn: Context ?=> String, actions: List[CodeAction] = List.empty)(using Context) extends Message(ErrorMessageID.NoExplanationID) {
428428
def msg(using Context): String = msgFn
429429
def explain(using Context): String = ""
430430
val kind: MessageKind = MessageKind.NoKind
431431

432+
override def actions(using Context): List[CodeAction] = actions
433+
432434
override def toString(): String = msg
435+
436+
def withActions(actions: CodeAction*): NoExplanation =
437+
new NoExplanation(msgFn, actions.toList)
433438
}
434439

435440
/** The extractor for `NoExplanation` can be used to check whether any error

compiler/src/dotty/tools/dotc/typer/Migrations.scala

+17-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import NameKinds.ContextBoundParamName
2121
import rewrites.Rewrites.patch
2222
import util.Spans.Span
2323
import rewrites.Rewrites
24+
import dotty.tools.dotc.rewrites.Rewrites.ActionPatch
25+
import dotty.tools.dotc.util.SourcePosition
2426

2527
/** A utility trait containing source-dependent deprecation messages
2628
* and migrations.
@@ -139,14 +141,23 @@ trait Migrations:
139141
val rewriteMsg =
140142
if hasParentheses then
141143
Message.rewriteNotice("This code", mversion.patchFrom)
142-
else
143-
""
144-
report.errorOrMigrationWarning(
144+
else ""
145+
val message =
145146
em"""Implicit parameters should be provided with a `using` clause.$rewriteMsg
146-
|To disable the warning, please use the following option:
147+
|To disable the warning, please use the following option:
147148
| "-Wconf:msg=Implicit parameters should be provided with a `using` clause:s"
148-
|""",
149-
pt.args.head.srcPos, mversion)
149+
|"""
150+
val codeAction = CodeAction(
151+
title = "Add `using` clause",
152+
description = None,
153+
patches = List(ActionPatch(pt.args.head.startPos.sourcePos, "using "))
154+
)
155+
val withActions = message.withActions(codeAction)
156+
report.errorOrMigrationWarning(
157+
withActions,
158+
pt.args.head.srcPos,
159+
mversion
160+
)
150161
if hasParentheses && mversion.needsPatch then
151162
patch(Span(pt.args.head.span.start), "using ")
152163
end implicitParams

compiler/test/dotty/tools/dotc/reporting/CodeActionTest.scala

+13
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,19 @@ class CodeActionTest extends DottyTest:
5454
|""".stripMargin
5555
)
5656

57+
@Test def addUsingClause =
58+
checkCodeAction(
59+
"""|object Test:
60+
| def foo(implicit a: Int) = a
61+
| foo(123)
62+
|""".stripMargin,
63+
"Add `using` clause",
64+
"""|object Test:
65+
| def foo(implicit a: Int) = a
66+
| foo(using 123)
67+
|""".stripMargin
68+
)
69+
5770
@Test def insertMissingCases =
5871
checkCodeAction(
5972
code =

tests/neg/i22440.check

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
| ^
44
| Implicit parameters should be provided with a `using` clause.
55
| This code can be rewritten automatically under -rewrite -source 3.7-migration.
6-
| To disable the warning, please use the following option:
6+
| To disable the warning, please use the following option:
77
| "-Wconf:msg=Implicit parameters should be provided with a `using` clause:s"

tests/warn/i22440.check

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
| ^
44
| Implicit parameters should be provided with a `using` clause.
55
| This code can be rewritten automatically under -rewrite -source 3.7-migration.
6-
| To disable the warning, please use the following option:
6+
| To disable the warning, please use the following option:
77
| "-Wconf:msg=Implicit parameters should be provided with a `using` clause:s"

tests/warn/i22731.check

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
| ^^^^^^^^
44
| Implicit parameters should be provided with a `using` clause.
55
| This code can be rewritten automatically under -rewrite -source 3.7-migration.
6-
| To disable the warning, please use the following option:
6+
| To disable the warning, please use the following option:
77
| "-Wconf:msg=Implicit parameters should be provided with a `using` clause:s"
88
-- Warning: tests/warn/i22731.scala:7:6 --------------------------------------------------------------------------------
99
7 | foo { () => 43 } // warn
1010
| ^^^^^^^^^^^^
1111
| Implicit parameters should be provided with a `using` clause.
12-
| To disable the warning, please use the following option:
12+
| To disable the warning, please use the following option:
1313
| "-Wconf:msg=Implicit parameters should be provided with a `using` clause:s"

0 commit comments

Comments
 (0)