scalaの自動コードフォーマットをするために試した3つの方法

##1.Scalastyleを利用してコードフォーマットチェックする

Scalastyle
http://www.scalastyle.org/

コードフォーマットルールに関しては以下のリンクを参考にxmlを作成する感じです。
http://www.scalastyle.org/rules-0.6.0.html

ちなみに1ファイルの最大の行数が800行にしろというコードフォーマットルールはこんな感じ。

```scalastyle_config.xml
<check enabled="true" class="org.scalastyle.file.FileLengthChecker" level="warning">
 <parameters>
  <parameter name="maxFileLength">800</parameter>
 </parameters>
</check>
```

今回はコマンドラインでチェックしました。
ダウンロードは以下から
http://www.scalastyle.org/command-line.html

実際こんな感じにエラーが出力されます

```Terminal
$ java -jar scalastyle-batch_2.10.jar --config scalastyle_config.xml
src/main/test.scala
warning file=src/main/test.scala message=File length exceeds 800 lines
Processed 1 file(s)
Found 0 errors
Found 1 warnings
Finished in 463 ms
```

(*´∀`*)ﾎﾟｯ> so good!
( ´・ω・｀)> あ、これ結局手動でコード修正しなきゃいけないじゃん。。

(メリット)
・実コードに影響しない
・設定が簡単

(課題)
・チェックはできるが、コードを手動で修正する作業が発生する
・git pre-commit hockを利用してチェックしようとしたが、設定コストがかかる
・コマンドラインに依存
→　結局自動化してねーじゃん。。

##2.scalariformを利用してコードフォーマット変換をする

今回はsbtを利用してcompile時にコードフォーマットしよう。

sbt-scalariform
https://github.com/sbt/sbt-scalariform

```project/plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0")
```

build.sbtと同じ階層にscalariform.sbtを作成してやる

```scalariform.sbt
import scalariform.formatter.preferences._
import ScalariformKeys._

scalariformSettings

preferences := preferences.value
  .setPreference(AlignParameters, true)
  .setPreference(AlignSingleLineCaseStatements, true)
  .setPreference(AlignSingleLineCaseStatements.MaxArrowIndent, 40)
  .setPreference(CompactControlReadability, false)
  .setPreference(CompactStringConcatenation, false)
  .setPreference(DoubleIndentClassDeclaration, true)
  .setPreference(FormatXml, true)
  .setPreference(IndentLocalDefs, false)
  .setPreference(IndentPackageBlocks, true)
  .setPreference(IndentSpaces, 2)
  .setPreference(IndentWithTabs, false)
  .setPreference(MultilineScaladocCommentsStartOnFirstLine, false)
  .setPreference(PreserveDanglingCloseParenthesis, true)
  .setPreference(PlaceScaladocAsterisksBeneathSecondAsterisk, false)
  .setPreference(PreserveSpaceBeforeArguments, false)
  .setPreference(RewriteArrowSymbols, false)
  .setPreference(SpaceBeforeColon, false)
  .setPreference(SpaceInsideBrackets, false)
  .setPreference(SpaceInsideParentheses, false)
  .setPreference(SpacesWithinPatternBinders, true)
```
setPreferenceに書いてる設定は↓を参考にって感じ
https://github.com/mdr/scalariform

```Terminal
$ sbt compile
```

これでscalariform.sbtで設定したコードフォーマットに変換してくれる。
(多分、activator ~runの時に自動フォーマットかける設定も頑張ればできるはず。。)

(*´∀`*)ﾎﾟｯ> so good!
( ´・ω・｀)> あ、でもこれ設定できるコードフォーマットもう少し欲しいな。。

(長所)
・stb、activatorに依存するためどのエディタでどの環境行ってもコードフォーマットは
統一される。
・他のアプリケーション開発に干渉しない
 
(課題)
・コマンドラインに依存する
・git pre-commit hookなどのサービスを利用しなくてはならず、設定コストがかかる
・設定できるフォーマットが若干少ない
・自動で一気にコードが修正されるので怖い


##3.IntelliJで保存する際にコードフォーマットする

おっとここに来てscala云々関係ないじゃんw

参考にしたのがこちら、
『IntelliJ IDEAでファイル保存時にcode formatする』
http://qiita.com/sisidovski/items/bde2d844c3c73457923c

(*´∀`*)ﾎﾟｯ> very good!　これでひとまず解決かな。。

(長所)
・ファイル保存の際に自動フォーマットがかかるので、視覚的に何が変わったかが分かりやすい。
・scalaだけでなく、他の言語のコードスタイルを登録することができる
・IntelliJが用意しているコードスタイルの種類が多い。(コードスタイルは.idea/codeStyleSettings.xmlに吐き出されるのでプロジェクト内共有も可能)

(課題)
・他のアプリケーションに干渉する可能性がある
→　keymap,codestyleの設定を各アプリケーションで独立されることができる
・例えばvimやeclipseのような他のエディタで編集されるとコードフォーマットが崩れる
→　プロジェクトチームメンバーはIntelliJで開発しているからほぼ問題にはならない
 

##まとめ
あれこれ試して見た結果、私のプロジェクトでは「3.IntelliJで保存する際にコードフォーマットする」ことにしました。
課題と書いているのは私のプロジェクトであがった課題であって、ツールやライブラリの課題を言っているわけではありません。(一応誤解がないよう・・)

次回エントリーではIntelliJのCodeStyleの共有方法なんかを丁寧に説明できればと思います。