Slide 10
Slide 10 text
静的単一代入形式への変換
■ 依存するパッケージも変換する
● (*ssa.Program).CreatePackageメソッドで*ssa.Packageを作る
● 抽象構文木と型情報をまとめておく
○ packages.Load関数の結果はパッケージごと
// デバッグ情報を付加しながら生成する
prog := ssa.NewProgram(fset, ssa.GlobalDebug)
created := make(map[*types.Package]bool)
var createAll func(pkgs []*types.Package)
createAll = func(pkgs []*types.Package) {
for _, p := range pkgs {
if created[p] { continue }
created[p] = true
prog.CreatePackage(p, nil, nil, true)
createAll(p.Imports())
}
}
var mainPkg *packages.Package
var files []*ast.File
info := &types.Info{ /* 初期化(略) */ }
for _, pkg := range pkgs { // packages.Load関数で得た結果
createAll(pkg.Types.Imports()) // 依存パッケージを処理
mergeTypesInfo(info, pkg.TypesInfo) // 型情報をまとめる
files = append(files, pkg.Syntax...) // 抽象構文木をまとめる
if pkg.Module != nil && pkg.Module.Main { mainPkg = pkg }
}
if mainPkg == nil { /* エラー処理 */ }
ssapkg := prog.CreatePackage(mainPkg.Types, files, info, true)
ssapkg.Build()