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

fix.OptionForallExists.scala Maven / Gradle / Ivy

There is a newer version: 0.6.7
Show newest version
package fix

import scala.meta.Case
import scala.meta.Lit
import scala.meta.Pat
import scala.meta.Term
import scala.meta.Term.Block
import scala.meta.XtensionClassifiable
import scala.meta.XtensionCollectionLikeUI
import scala.meta.tokens.Token
import scalafix.Patch
import scalafix.v1.SyntacticDocument
import scalafix.v1.SyntacticRule
import scalafix.v1.XtensionSeqPatch

/**
 * [[https://github.com/scala/scala/blob/v2.13.12/src/library/scala/Option.scala#L396-L402]]
 * [[https://github.com/scala/scala/blob/v2.13.12/src/library/scala/Option.scala#L411-L417]]
 */
class OptionForallExists extends SyntacticRule("OptionForallExists") {
  override def fix(implicit doc: SyntacticDocument): Patch = {
    doc.tree.collect {
      case t @ Term.Match.After_4_4_5(
            expr,
            List(
              Case(
                Pat.Extract.Initial(Term.Name("Some"), Pat.Var(Term.Name(a1)) :: Nil),
                None,
                predicate
              ),
              Case(
                Pat.Wildcard() | Term.Name("None"),
                None,
                Lit.Boolean(bool)
              )
            ),
            _
          ) =>
        val method = if (bool) "forall" else "exists"
        val (open, close) = {
          predicate match {
            case Block(stats) if stats.size > 1 && !predicate.tokens.forall(_.is[Token.LeftBrace]) =>
              "{" -> "}"
            case _ =>
              "(" -> ")"
          }
        }
        Patch.replaceTree(t, s"${expr}.${method}${open}${a1} => ${predicate}${close}")
    }.asPatch
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy