25
27

More than 5 years have passed since last update.

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

Posted at

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

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

$ 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

$ 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の共有方法なんかを丁寧に説明できればと思います。

25
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
27