Magnolia Tech

いつもコードのことばかり考えている人のために。

ScalateのScala 2.13.0非互換への対応を考える

スキルアップのためには、知らないこと、分からないことへチャレンジした方がいいですね。例えば、すぐに答えられそうか分からない質問をわざと受ける、というのも1つの方法です。

ということをツイートしていたら…

質問…というよりガチな依頼が来ましたので、これはこれで対応するしましょう(笑)。OSSへの貢献は、ソフトウェア開発を学ぶ上で必要な要素がたくさん詰まっていますからね。

対象のコードは何か?

元々のコードの意図を探る

  • ScalateではテンプレートをScalaのコードとしてコンパイルする方法を採用
  • コンパイルの際に発生したエラーや警告をConsoleReporterを継承したLoggingReporterを使って独自にエラーを蓄積
  • 最終的にエラーが有ればCompilerExceptionを送出
  • エラーの蓄積のために、printMessageというメソッドをオーバーライド

    (loggerという割にはログ出力は行っていないのは謎ですが…)

クラス構造の変更点を把握する

  • Scala 2.13.0-M5よりConsoleReporterが大幅にリファクタリング
  • クラス構造も変わり、ConsoleReporterに加えて、DisplayReporterというクラスが追加
  • ConsoleReporterとDisplayReporterは、PrintReporterというtraitをmix-in
  • PrintReporterがprintMessageを持つ構成となっているが、privateメソッド化されている
  • printMessageはdisplayメソッドから呼び出される点は変わらず

変更案

  • printMessageではなく、displayメソッドを継承
  • printMessageの中で行っているメッセージ文字列の組み立てをログ出力用にコピペ
  • 最後にエラーの件数を出力するためのprintSummaryメソッドが無くなったので、同等の機能を提供するfinishへの置き換え

github.com

printMessageの中で行っているメッセージ文字列の組み立てをコピペしているのでdryではないので、別の方法が有れば採用したいところですが、一旦素案レベルではできました。

ただし、まだScala 2.13.0-M5に対応したScalatestがリリースされていない関係で、この先のコンパイルでエラーが出るし、テストもできない状態なので、ここで一旦検討は終了です。

ここまで記録を残しておけば、scalatestが動くようになってから検討を再開できるかな。ちょっと面倒ですが、1つ1つ調べたこと、考えたことを記録しておかないとすぐ忘れちゃいますね。

終わりに

今回、お題を頂いた瀬良さんが執筆に参加されたScalaの入門本「 実践Scala入門」が発売されるそうです。これを読んでみんなもScalaOSS開発に参加しよう!!

実践Scala入門

実践Scala入門