aboutsummaryrefslogblamecommitdiff
path: root/plugins/scalafix/Scalafix.scala
blob: e95840cec72603405e00bfa23f69b2cc9fbcbb71 (plain) (tree)

































































                                                                                                                       
package cbt

import java.io.File

import scala.meta._
import scala.meta.semantic.v1._
import scala.meta.{ Symbol => _, _ }
import scalafix._, rewrite._, config._, util._
import org.scalameta.{logger => scalametaLogger}

import cbt._

trait Scalafix extends Scalameta{
  def scalafix = Scalafix.apply( lib ).config(
    classpath,
    sourceFiles zip sourceFiles
  )
}

object Scalafix{
  case class apply( lib: Lib ){
    case class config(
      classpath: ClassPath,
      files: Seq[(File,File)],
      patches: Seq[Patch] = Seq(),
      rewrites: Seq[ Rewrite[ScalafixMirror] ] = Seq(),
      allowEmpty: Boolean = false
    ){
      def mirror =
        Mirror(
          classpath.string,
          files.map(_._1).mkString(File.pathSeparator)
        )

      def context(file: File): ( RewriteCtx[Mirror], RewriteCtx[ScalafixMirror] ) = (
        scalafix.rewrite.RewriteCtx(
          mirror.dialect(file).parse[Source].get, ScalafixConfig(), mirror
        ),
        scalafix.rewrite.RewriteCtx(
          mirror.dialect(file).parse[Source].get, ScalafixConfig(), ScalafixMirror.fromMirror( mirror )
        )
      )

      def apply: Unit = {
        require(
          allowEmpty || rewrites.nonEmpty || patches.nonEmpty,
          "You need to provide some rewrites via: `override def scalafix = super.scalafix.copy( rewrites = Seq(...) )`"
        )
        files.foreach{ case (from, to) =>
          implicit val ( ctx, ctx2 ) = context(from)
          lib.writeIfChanged(
            to,
            Patch(
              (
                patches
                ++ rewrites.flatMap(
                  _.rewrite( ctx2 ).to
                )
              ).to
            )
          )
        }
      }
    }
  }
}