GoのASTからソースコードを生成する

Goの標準ライブラリを用いてAST(抽象構文木)からソースコードを生成する方法のメモです。

ASTの取得

文字列からGoのASTを取得する例

import (
  "fmt"
  "go/ast"
  "go/parser"
  "go/token"
)
src := `
package main

import "fmt"

func main() {
  fmt.Println("Hello, World!")
}
`
// ソースファイル群を表すデータの作成
// ソースファイルデータにはファイル名やファイル内の構文の位置などの情報を持つ
// たとえばパッケージ単位でコードの解析を行う場合は同一ディレクトリのソースファイルをまとめて扱う必要があるのでソースファイル群という単位でソース情報を持っているものと思われる
fset := token.NewFileSet()
// ソースコードを構文木に変換
// 第二引数にファイル名を渡すとファイルを、第三引数にソースコードの文字列を渡すと文字列を変換する
f, err := parser.ParseFile(fset, "", src, 0)
if err != nil {
  fmt.Println(err)
  os.Exit(1)
}

ast.Print(fset, f)

go/parserParseFileの戻り値がASTになっている。
go/astPrintを利用して読みやすいように表示させている。

Travis CIでOCamlを使う時の設定

2020年6月6日 現在 Travis CIではOcamlの環境に対応していません。

自分でaptやbrewを使ってOCamlをインストールしても良いのですが、それだと最新のバージョンのOCamlを使いづらいので、OCamlコミュニティが提供してくれているスクリプトを利用して設定を行います。

GitHubでcommitにissueを紐付ける

GitHubで使えるちょっと便利な小技のメモ

関連するissueへのリンクを自動で貼る

commitメッセージに#issue番号とすることで自動的にそのissueへのリンクを貼ってくれます。

kotlinのEnumに拡張関数を定義する

kotlinのenum classはJavaのenumと同様にvalueOf(String)で当該のEnumを取得できる関数があるのですが、とある事情からこれをStringではなくenumのordinal(Int)から取得したいという要求がありました。