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

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

The newest version!
package scalafix.internal.rule

import scala.meta._

import scalafix.v1._

class NoAutoTupling extends SemanticRule("NoAutoTupling") {

  override def description: String =
    "Inserts explicit tuples for adapted argument lists for compatibility with -Yno-adapted-args"
  override def isRewrite: Boolean = true

  private[this] def addWrappingParens(args: Seq[Term]): Patch =
    Patch.addLeft(args.head.tokens.head, "(") +
      Patch.addRight(args.last.tokens.last, ")")

  private[this] def insertUnit(t: Term.Apply): Patch =
    Patch.addRight(t.tokens.init.last, "()")

  override def fix(implicit doc: SemanticDocument): Patch = {
    val unitAdaptations: Set[Position] =
      doc.diagnostics.collect {
        case message
            if message.message.startsWith(
              "Adaptation of argument list by inserting ()"
            ) || message.message.startsWith(
              "adaptation of an empty argument list by inserting ()"
            ) =>
          message.position
      }.toSet

    val tupleAdaptations: Set[Position] =
      doc.diagnostics.collect {
        case message
            if message.message.startsWith(
              "Adapting argument list by creating"
            ) || message.message.startsWith(
              "adapted the argument list to the expected"
            ) =>
          message.position
      }.toSet
    doc.tree
      .collect {
        case t: Term.Apply if tupleAdaptations.contains(t.pos) =>
          addWrappingParens(t.args)
        case t: Term.Apply
            if t.args.isEmpty && unitAdaptations.contains(t.pos) =>
          insertUnit(t)
      }
      .map(_.atomic)
      .asPatch
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy