aboutsummaryrefslogtreecommitdiff
path: root/plugins/scalariform/Scalariform.scala
blob: 83a8bbfd0f12faa21e4a409295f87879e7305a5a (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
package cbt

import java.io.File
import java.nio.file.FileSystems
import java.nio.file.Files._

import scalariform.formatter.ScalaFormatter
import scalariform.formatter.preferences.{ FormattingPreferences, Preserve }
import scalariform.parser.ScalaParserException

trait Scalariform extends BaseBuild {
  def scalariform = Scalariform.apply(lib, scalaVersion).config(sourceFiles.filter(_.string endsWith ".scala"))
}

object Scalariform{
  val defaultPreferences: FormattingPreferences = {
    import scalariform.formatter.preferences._
    FormattingPreferences()
      .setPreference(AlignParameters, true)
      .setPreference(AlignArguments, true)
      .setPreference(AlignSingleLineCaseStatements, true)
      .setPreference(MultilineScaladocCommentsStartOnFirstLine, true)
      .setPreference(SpaceInsideParentheses, true)
      .setPreference(SpacesWithinPatternBinders, true)
      .setPreference(SpacesAroundMultiImports, true)
      .setPreference(DoubleIndentClassDeclaration, false)
      //.setPreference(NewlineAtEndOfFile, true)
      .setPreference(DanglingCloseParenthesis, Preserve)
      .setPreference(PlaceScaladocAsterisksBeneathSecondAsterisk, true)
  }

  case class apply( lib: Lib, scalaVersion: String ){
    case class config(
      files: Seq[File], preferences: FormattingPreferences = Scalariform.defaultPreferences
    ) extends (() => Seq[File]){
      def apply = {
        val (successes, errors) = lib.transformFilesOrError( files, in =>
          try{
            Right( ScalaFormatter.format( in, preferences, Some(scalaVersion) ) )
          } catch {
            case e: ScalaParserException => Left( e )
          }
        )
        if(errors.nonEmpty)
          throw new RuntimeException(
            "Scalariform failed to parse some files:\n" ++ errors.map{
              case (file, error) => file.string ++ ": " ++ error.getMessage
            }.mkString("\n"),
            errors.head._2
          )
        successes
      }
    }
  }
}