@@ -20,7 +20,7 @@ import scala.util.control.Exception.ultimately
2020import symtab .Flags ._
2121import PartialFunction .{cond , condOpt }
2222import scala .annotation .{nowarn , tailrec }
23- import scala .tools .nsc .Reporting .WarningCategory
23+ import scala .tools .nsc .Reporting .{ MessageFilter , Suppression , WarningCategory }
2424
2525/** An interface to enable higher configurability of diagnostic messages
2626 * regarding type errors. This is barely a beginning as error messages are
@@ -500,10 +500,20 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
500500 val ignoreNames : Set [TermName ] = Set (
501501 " readResolve" , " readObject" , " writeObject" , " writeReplace"
502502 ).map(TermName (_))
503+
504+ // is this a getter-setter pair? cf g.setterIn(g.owner) == s
505+ def sameReference (g : Symbol , s : Symbol ) =
506+ if (g.accessed.exists && s.accessed.exists) g.accessed == s.accessed
507+ else g.owner == s.owner && g.setterName == s.name // sympos(g) == sympos(s)
508+
509+ def sympos (s : Symbol ): Int =
510+ if (s.pos.isDefined) s.pos.point else if (s.isTerm) s.asTerm.referenced.pos.point else - 1
511+ def treepos (t : Tree ): Int =
512+ if (t.pos.isDefined) t.pos.point else sympos(t.symbol)
503513 }
504514
505515 class UnusedPrivates extends Traverser {
506- import UnusedPrivates .ignoreNames
516+ import UnusedPrivates ._
507517 def isEffectivelyPrivate (sym : Symbol ): Boolean = false
508518 val defnTrees = ListBuffer [MemberDef ]()
509519 val targets = mutable.Set [Symbol ]()
@@ -538,6 +548,11 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
538548
539549 override def traverse (t : Tree ): Unit = {
540550 val sym = t.symbol
551+ if (sym != null && sym.pos.isDefined)
552+ sym.getAnnotation(UnusedClass ).foreach { annot =>
553+ if (! runReporting.suppressionExists(annot.pos))
554+ runReporting.addSuppression(Suppression (annot.pos, List (MessageFilter .Category (WarningCategory .Unused )), sym.pos.start, sym.pos.end, synthetic = true ))
555+ }
541556 t match {
542557 case m : MemberDef if qualifies(sym) && ! t.isErrorTyped =>
543558 t match {
@@ -594,10 +609,8 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
594609 }
595610 super .traverse(t)
596611 }
597- def isSuppressed (sym : Symbol ): Boolean = sym.hasAnnotation(UnusedClass )
598612 def isUnusedType (m : Symbol ): Boolean = (
599613 m.isType
600- && ! isSuppressed(m)
601614 && ! m.isTypeParameterOrSkolem // would be nice to improve this
602615 && (m.isPrivate || m.isLocalToBlock || isEffectivelyPrivate(m))
603616 && ! (treeTypes.exists(_.exists(_.typeSymbolDirect == m)))
@@ -612,7 +625,6 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
612625 }
613626 def isUnusedTerm (m : Symbol ): Boolean = (
614627 m.isTerm
615- && ! isSuppressed(m)
616628 && (! m.isSynthetic || isSyntheticWarnable(m))
617629 && ((m.isPrivate && ! (m.isConstructor && m.owner.isAbstract)) || m.isLocalToBlock || isEffectivelyPrivate(m))
618630 && ! targets(m)
@@ -631,26 +643,16 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
631643 && s.name == m.name && s.owner.isConstructor && s.owner.owner == m.owner) // exclude ctor params
632644 ))
633645 )
634- def sympos (s : Symbol ): Int =
635- if (s.pos.isDefined) s.pos.point else if (s.isTerm) s.asTerm.referenced.pos.point else - 1
636- def treepos (t : Tree ): Int =
637- if (t.pos.isDefined) t.pos.point else sympos(t.symbol)
638-
639646 def unusedTypes = defnTrees.toList.filter(t => isUnusedType(t.symbol)).sortBy(treepos)
640647 def unusedTerms = {
641648 val all = defnTrees.toList.filter(v => isUnusedTerm(v.symbol))
642649
643- // is this a getter-setter pair? and why is this a difficult question for traits?
644- def sameReference (g : Symbol , s : Symbol ) =
645- if (g.accessed.exists && s.accessed.exists) g.accessed == s.accessed
646- else g.owner == s.owner && g.setterName == s.name // sympos(g) == sympos(s)
647-
648650 // filter out setters if already warning for getter.
649651 val clean = all.filterNot(v => v.symbol.isSetter && all.exists(g => g.symbol.isGetter && sameReference(g.symbol, v.symbol)))
650652 clean.sortBy(treepos)
651653 }
652654 // local vars which are never set, except those already returned in unused
653- def unsetVars = varsWithoutSetters.filter(v => ! isSuppressed(v) && ! setVars(v) && ! isUnusedTerm(v)).toList.sortBy(sympos)
655+ def unsetVars = varsWithoutSetters.filter(v => ! setVars(v) && ! isUnusedTerm(v)).toList.sortBy(sympos)
654656 def unusedParams = params.iterator.filter(isUnusedParam).toList.sortBy(sympos)
655657 def inDefinedAt (p : Symbol ) = p.owner.isMethod && p.owner.name == nme.isDefinedAt && p.owner.owner.isAnonymousFunction
656658 def unusedPatVars = patvars.toList.filter(p => isUnusedTerm(p) && ! inDefinedAt(p)).sortBy(sympos)
@@ -681,7 +683,8 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
681683
682684 // `checkUnused` is invoked after type checking. we have to avoid using `typer.context.warning`, which uses
683685 // `context.owner` as the `site` of the warning, but that's the root symbol at this point.
684- def emitUnusedWarning (pos : Position , msg : String , category : WarningCategory , site : Symbol ): Unit = runReporting.warning(pos, msg, category, site)
686+ def emitUnusedWarning (pos : Position , msg : String , category : WarningCategory , site : Symbol ): Unit =
687+ runReporting.warning(pos, msg, category, site)
685688
686689 def run (unusedPrivates : UnusedPrivates )(body : Tree ): Unit = {
687690 unusedPrivates.traverse(body)
@@ -723,9 +726,8 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
723726 for (defn <- unusedPrivates.unusedTerms if shouldWarnOn(defn.symbol)) { termWarning(defn) }
724727 for (defn <- unusedPrivates.unusedTypes if shouldWarnOn(defn.symbol)) { typeWarning(defn) }
725728
726- for (v <- unusedPrivates.unsetVars) {
729+ for (v <- unusedPrivates.unsetVars)
727730 emitUnusedWarning(v.pos, s " local var ${v.name} in ${v.owner} ${valAdvice}" , WarningCategory .UnusedPrivates , v)
728- }
729731 }
730732 if (settings.warnUnusedPatVars) {
731733 for (v <- unusedPrivates.unusedPatVars)
@@ -774,7 +776,6 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
774776 }
775777 }
776778
777-
778779 trait TyperDiagnostics {
779780 self : Typer =>
780781
0 commit comments