All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalafix.internal.rule.RemoveUnusedTerms.scala Maven / Gradle / Ivy

package scalafix.internal.rule

import scala.meta._
import scalafix.Patch
import scalafix.SemanticdbIndex
import scalafix.rule.RuleCtx
import scalafix.rule.SemanticRule

case class RemoveUnusedTerms(index: SemanticdbIndex)
    extends SemanticRule(index, "RemoveUnusedTerms") {

  override def description: String =
    "Rewrite that removes unused locals or privates by -Ywarn-unused:locals,privates"

  private val unusedTerms = {
    val UnusedLocalVal = """local (.*) is never used""".r
    index.messages.toIterator.collect {
      case Message(pos, _, UnusedLocalVal(_*)) =>
        pos
    }.toSet
  }

  private def isUnused(defn: Defn) =
    unusedTerms.contains(defn.pos)

  private def removeDeclarationTokens(i: Defn, rhs: Term): Tokens = {
    val startDef = i.tokens.start
    val startBody = rhs.tokens.start
    i.tokens.take(startBody - startDef)
  }

  private def tokensToRemove(defn: Defn): Option[Tokens] = defn match {
    case i @ Defn.Val(_, _, _, Lit(_)) => Some(i.tokens)
    case i @ Defn.Val(_, _, _, rhs) => Some(removeDeclarationTokens(i, rhs))
    case i @ Defn.Var(_, _, _, Some(Lit(_))) => Some(i.tokens)
    case i @ Defn.Var(_, _, _, rhs) => rhs.map(removeDeclarationTokens(i, _))
    case _ => None
  }

  override def fix(ctx: RuleCtx): Patch =
    ctx.tree.collect {
      case i: Defn if isUnused(i) =>
        tokensToRemove(i)
          .fold(Patch.empty)(token => ctx.removeTokens(token))
          .atomic
    }.asPatch
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy