Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ASTで作るコンストラクタジェネレータ
Search
Takeru Furuse
August 08, 2024
Programming
0
33
ASTで作るコンストラクタジェネレータ
Takeru Furuse
August 08, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
Google I/O recap web編 大分Web祭り2025
kponda
0
2.8k
生成AI、実際どう? - ニーリーの場合
nealle
0
110
STUNMESH-go: Wireguard NAT穿隧工具的源起與介紹
tjjh89017
0
370
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
4
600
画像コンペでのベースラインモデルの育て方
tattaka
3
1.7k
一人でAIプロダクトを作るための工夫 〜技術選定・開発プロセス編〜 / I want AI to work harder
rkaga
12
2.6k
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
720
Android 15以上でPDFのテキスト検索を爆速開発!
tonionagauzzi
0
200
AIレビュアーをスケールさせるには / Scaling AI Reviewers
technuma
2
170
202507_ADKで始めるエージェント開発の基本 〜デモを通じて紹介〜(奥田りさ)The Basics of Agent Development with ADK — A Demo-Focused Introduction
risatube
PRO
6
1.5k
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
200
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
260
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Producing Creativity
orderedlist
PRO
347
40k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Git: the NoSQL Database
bkeepers
PRO
431
65k
Making Projects Easy
brettharned
117
6.3k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Embracing the Ebb and Flow
colly
86
4.8k
Bash Introduction
62gerente
614
210k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Code Review Best Practice
trishagee
69
19k
How STYLIGHT went responsive
nonsquared
100
5.7k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Transcript
ASTで作るコンストラクタジェネレータ 2024/08/08 golang.tokyo #36
About me 古瀬 たける / Takeru Furuse • 株式会社enechain (2023/12〜)
• エンジニア歴は約10年 • Go / Python / Typescriptをよく書きます • https://github.com/tsuperis3112 2024/8/8 1 Introduction
Todayʼs topic • コンストラクタジェネレータを作った話 • go/ast, go/types, golang.org/x/tools/go/packages等の使い分け • Genericsへの対応
• ASTでコード⽣成するときのハマりどころ 2024/8/8 2 Introduction
コンストラクタジェネレータとは What is a Constructor Generator? 3
モチベーション • ドメイン知識が複雑でエンティティのフィールドに変更が多数発 ⽣し構造体の初期化箇所でデグレが頻発 • Pythonのdataclass/pydantic(下図)やJavaのlombokのように⾃動で コンストラクタを⽣成してほしい 2024/8/8 4 コンストラクタジェネレータとは
概要 • 構造体に定義されたフィールド名、型を引数に取る関数 • embedされた構造体の各フィールドについても構造体名+フィール ド名のlower camel-caseを引数に取る • 構造体のポインタを返す •
同名の関数がパッケージ内に存在していれば、⽣成をスキップ 2024/8/8 5 コンストラクタジェネレータとは
出⼒イメージ 2024/8/8 6 コンストラクタジェネレータとは
設計・実装 Design and implementation 7
ファイル単位 パッケージ単位 AST関連のパッケージ群の役割 - 1 • golang.org/x/tools/go/packages • パッケージ情報を持つ •
*types.Scopeや[]*ast.Fileを参照 • go/types • 型情報 • *packages.Packageを参照 • go/ast • 構⽂の情報を持つ • 型の情報は含まない • go/token • リテラルや演算⼦などの構⽂中のトークン 2024/8/8 8 golang.org/x/tools/go/packages go/types go/ast go/token 設計・実装
AST関連のパッケージ群の役割 - 2 • golang.org/x/tools/go/packages • 何よりもまず*packages.Packageが起点になる • Embeddedされた構造体で利⽤されるフィールドの型など、不⾜しているimportを補う際に 利⽤
• Scopeを利⽤してgo/astとgo/typesの紐づけを⾏う • go/types • 構造体やフィールドの型情報を取得するために利⽤ • go/ast • Genericsの型引数に再帰的に値をアサインしていく 2024/8/8 9 設計・実装
型情報をトラ バース 型情報を⽊構 造のノードに 格納 ルートノード から型引数を マッピングし ていく リーフノード
から引数の情 報を⽣成する astutilで関数 を⽣成 全体の処理フロー 2024/8/8 設計・実装 10
構造体の定義 • StructMap • 必要な構造体の情報をキャッシュ • キーは「パッケージパス.構造体名」 • types.TypeName.Idと⼀致 •
依存関係を元に*ast.Fileにimportを追加する • Node • StructMapを元に出⼒される構造体 • この構造体を元にASTを構築してでコンストラクタを⽣成 2024/8/8 設計・実装 11
型情報のトラバース • *packages.Packageを起点にし て依存関係のあるパッケージ に含まれる構造体情報を取得 する 2024/8/8 12 設計・実装
Generics対応 • ここでも再帰的に型引数をアサ インしていく • ここでアサインした型引数を更 にネストされたGenerics構造体 にも適⽤する • 型パラメータ名を取得するため
にStructInfoにtypes.TypeSpecを 持たせている 2024/8/8 設計・実装 13
AST構築 • typeParamsはルートノードか ら取得 • Paramsはリーフノードから ⽣成 • compositeFieldsはルート ノードから再帰的に⽣成する
2024/8/8 設計・実装 14
振り返り Reflection 15
実装してみて • 複数のパッケージをまたぐことで型情報のパースが単純にはでき なかった • embedの循環参照が可能であったりと制約が⽐較的緩めなので、 ⾃前で制御する必要がある箇所が多かった • 再帰、再帰、再帰、再帰、、、 2024/8/8
振り返り 16
今後の展望 • OSS化 • フィールド値の⽣成関数対応 • UUIDなどを⾃動で⽣成してアサインさせる • バリデーション対応 •
現在は⽣成対象外フィールドだけタグで指定できるようにしている • go-playground/validatorなどをラップする形? • プラグイン対応 • 初期化時になにかの処理をHookさせられるようにしたい 2024/8/8 振り返り 17
ご清聴ありがとうございました Thank you for your attention 18