aboutsummaryrefslogtreecommitdiff
path: root/plugins/scalafix/Scalafix.scala
blob: e95840cec72603405e00bfa23f69b2cc9fbcbb71 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
            )
          )
        }
      }
    }
  }
}