Open9

elm-review悪用でコード自動生成

miyamomiyamo

https://package.elm-lang.org/packages/jfmengels/elm-review/latest/
周知の通りelm-reviewはlint的ルールの作成を支援し実行するフレームワークだが、昨今のElm開発ではコード自動生成をするためのツールとして悪用されている(要出典)

これがまた意外と簡単にできるのでみなさんもどんどん使いましょう

悪用の意味:ここでは本来lintツールであるのに自動生成を目的に使っていることを指して悪用と呼ぶ

miyamomiyamo

前提: Fix

elm-reviewにはFixというものがある
検知したエラーを直すための提案のことで、自動生成ではこれを悪用する

ある式を別の式に変換するのが素朴な例だ

  • 1 + 1 -> 2
  • g (f a) -> f a |> g

式変換の範囲だけでもやろうと思えば悪用できる

https://package.elm-lang.org/packages/dillonkearns/elm-review-html-to-elm/latest/

このpackageではDebug.todoで書いた文字列中のHTMLをElmのHTML表現に変換している
タノシイネ

miyamomiyamo

前提:elm-syntax-dsl

elm-reviewでコード生成したい場合はelm-syntax-dslも併用することになる

https://package.elm-lang.org/packages/the-sett/elm-syntax-dsl/latest/

elm-syntaxの型はコード上の位置情報を持っているので生で組み立てようとすると煩雑になってしまう
elm-syntax-dslはそこらへんを使いやすいようにしてくれてる

  • 組み立てのときに位置情報を気にしなくていい
  • importが一つで済む
  • a |> b |> cなどを生成するショートカットがある
  • elm-formatかけても影響がないように最初から整えてくれる
    • elm-reviewでもelm-formatかけてくれてる気がする
miyamomiyamo

やり方:空ファイルを作っておく

elm-reviewはlintツールなので無から有を生み出せないため、生成したコード吐き出すための空ファイルを作っておく必要があります

ほんとに何も書いてないファイルだと、elm-reviewさんが成り立ってないと怒るのでモジュール宣言だけ入れておきましょう

module ForAutoGeneration exposing (..)
miyamomiyamo

解析する

生成したいコードはアプリケーションによってまちまちだと思いますが、ここではページモジュールなどを結線するボイラープレートコードを生成すること考えます

より分かりやすい説明のためにそれっぽいサンプルコードや状況、具体的な説明が必要かもしれませんがそんなもの後続の誰かに頼むよ

miyamomiyamo

生成する

解析した情報を使ってコードを生成します
生成先は最初に作った空ファイルの1行目から全部です
elm-syntaxは能力的に1ファイル丸ごと生成できるためですね

Fixの範囲指定を具体的にしないといけないので(最初から最後までみたいな指定を本当はしたい)生成先ファイルは毎回空にしておくのが望ましいです
適当にshellとかでやっといてください

miyamomiyamo

そもそもなんで自動生成したいのか

ボイラープレートコードが多いから

miyamomiyamo

自前elm-pagesみたいなのを作ってる気分

今触ってるコードではPageモジュールを作ってPageModule msg model型のpageを定義しておき、コマンド叩くとmainに結線されるようにしている
収斂を感じる