Skip to content

Commit 1928f5f

Browse files
som-snytttgodzik
authored andcommitted
Mention extension in unused param warning
[Cherry-picked 2d2da2e]
1 parent fddbdc7 commit 1928f5f

File tree

4 files changed

+55
-12
lines changed

4 files changed

+55
-12
lines changed

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3174,23 +3174,29 @@ extends SyntaxMsg(VolatileOnValID):
31743174

31753175

31763176
class UnusedSymbol(errorText: String, val actions: List[CodeAction] = Nil)(using Context)
3177-
extends Message(UnusedSymbolID) {
3177+
extends Message(UnusedSymbolID):
31783178
def kind = MessageKind.UnusedSymbol
31793179

31803180
override def msg(using Context) = errorText
31813181
override def explain(using Context) = ""
31823182
override def actions(using Context) = this.actions
3183-
}
31843183

31853184
object UnusedSymbol:
31863185
def imports(actions: List[CodeAction])(using Context): UnusedSymbol = UnusedSymbol(i"unused import", actions)
31873186
def localDefs(using Context): UnusedSymbol = UnusedSymbol(i"unused local definition")
3188-
def explicitParams(using Context): UnusedSymbol = UnusedSymbol(i"unused explicit parameter")
3189-
def implicitParams(using Context): UnusedSymbol = UnusedSymbol(i"unused implicit parameter")
3187+
def explicitParams(sym: Symbol)(using Context): UnusedSymbol =
3188+
UnusedSymbol(i"unused explicit parameter${paramAddendum(sym)}")
3189+
def implicitParams(sym: Symbol)(using Context): UnusedSymbol =
3190+
UnusedSymbol(i"unused implicit parameter${paramAddendum(sym)}")
31903191
def privateMembers(using Context): UnusedSymbol = UnusedSymbol(i"unused private member")
31913192
def patVars(using Context): UnusedSymbol = UnusedSymbol(i"unused pattern variable")
3192-
def unsetLocals(using Context): UnusedSymbol = UnusedSymbol(i"unset local variable, consider using an immutable val instead")
3193-
def unsetPrivates(using Context): UnusedSymbol = UnusedSymbol(i"unset private variable, consider using an immutable val instead")
3193+
def unsetLocals(using Context): UnusedSymbol =
3194+
UnusedSymbol(i"unset local variable, consider using an immutable val instead")
3195+
def unsetPrivates(using Context): UnusedSymbol =
3196+
UnusedSymbol(i"unset private variable, consider using an immutable val instead")
3197+
private def paramAddendum(sym: Symbol)(using Context): String =
3198+
if sym.denot.owner.is(ExtensionMethod) then i" in extension ${sym.denot.owner}"
3199+
else ""
31943200

31953201
final class QuotedTypeMissing(tpe: Type)(using Context) extends StagingMessage(QuotedTypeMissingID):
31963202

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,8 @@ object CheckUnused:
538538
val warnings = ArrayBuilder.make[MessageInfo]
539539
def warnAt(pos: SrcPos)(msg: UnusedSymbol, origin: String = ""): Unit = warnings.addOne((msg, pos, origin))
540540
val infos = refInfos
541+
//println(infos.defs.mkString("DEFS\n", "\n", "\n---"))
542+
//println(infos.refs.mkString("REFS\n", "\n", "\n---"))
541543

542544
def checkUnassigned(sym: Symbol, pos: SrcPos) =
543545
if sym.isLocalToBlock then
@@ -578,7 +580,7 @@ object CheckUnused:
578580
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor) && !infos.refs(alias.symbol) then
579581
if aliasSym.is(Local) then
580582
if ctx.settings.WunusedHas.explicits then
581-
warnAt(pos)(UnusedSymbol.explicitParams)
583+
warnAt(pos)(UnusedSymbol.explicitParams(aliasSym))
582584
else
583585
if ctx.settings.WunusedHas.privates then
584586
warnAt(pos)(UnusedSymbol.privateMembers)
@@ -592,7 +594,7 @@ object CheckUnused:
592594
&& !sym.name.isInstanceOf[DerivedName]
593595
&& !ctx.platform.isMainMethod(m)
594596
then
595-
warnAt(pos)(UnusedSymbol.explicitParams)
597+
warnAt(pos)(UnusedSymbol.explicitParams(sym))
596598
end checkExplicit
597599
// begin
598600
if !infos.skip(m)
@@ -632,9 +634,9 @@ object CheckUnused:
632634
aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
633635
|| aliasSym.isAllOf(Protected | ParamAccessor, butNot = CaseAccessor) && m.owner.is(Given)
634636
if checking && !infos.refs(alias.symbol) then
635-
warnAt(pos)(UnusedSymbol.implicitParams)
637+
warnAt(pos)(UnusedSymbol.implicitParams(aliasSym))
636638
else
637-
warnAt(pos)(UnusedSymbol.implicitParams)
639+
warnAt(pos)(UnusedSymbol.implicitParams(sym))
638640

639641
def checkLocal(sym: Symbol, pos: SrcPos) =
640642
if ctx.settings.WunusedHas.locals

tests/warn/i15503g.check

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:8:17 ---------------------------------------------------------
2+
8 | private def f2(a: Int) = default_int // warn
3+
| ^
4+
| unused explicit parameter
5+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:9:31 ---------------------------------------------------------
6+
9 | private def f3(a: Int)(using Int) = a // warn
7+
| ^
8+
| unused implicit parameter
9+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:10:17 --------------------------------------------------------
10+
10 | private def f4(a: Int)(using Int) = default_int // warn // warn
11+
| ^
12+
| unused explicit parameter
13+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:10:31 --------------------------------------------------------
14+
10 | private def f4(a: Int)(using Int) = default_int // warn // warn
15+
| ^
16+
| unused implicit parameter
17+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:11:17 --------------------------------------------------------
18+
11 | private def f6(a: Int)(using Int) = summon[Int] // warn
19+
| ^
20+
| unused explicit parameter
21+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:23:18 --------------------------------------------------------
22+
23 | def isAnIssue(y: A): Boolean = x == x // warn
23+
| ^
24+
| unused explicit parameter in extension method isAnIssue
25+
-- [E198] Unused Symbol Warning: tests/warn/i15503g.scala:29:30 --------------------------------------------------------
26+
29 | extension (s: String)(using Show) // warn not used in repeat
27+
| ^
28+
| unused implicit parameter in extension method repeat

tests/warn/i15503g.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//> using options -Wunused:params
1+
//> using options -Wunused:params
22

33
/* This goes around the "trivial method" detection */
44
object Foo {
@@ -15,10 +15,17 @@ object Foo {
1515
private def g2(x: Int) = ??? // OK
1616
}
1717

18-
package foo.test.i17101:
18+
object i17101:
1919
type Test[A] = A
2020
extension[A] (x: Test[A]) { // OK
2121
def value: A = x
2222
def causesIssue: Unit = println("oh no")
2323
def isAnIssue(y: A): Boolean = x == x // warn
2424
}
25+
26+
object i23125:
27+
trait Show:
28+
def show(s: String) = s
29+
extension (s: String)(using Show) // warn not used in repeat
30+
def echo = println(summon[Show].show(s))
31+
def repeat = s * 2

0 commit comments

Comments
 (0)