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
PHPのファイルに差分があるかを(astを使って)調べる君
Search
hideki kinjyo
PRO
November 29, 2023
Programming
0
850
PHPのファイルに差分があるかを(astを使って)調べる君
第157回 PHP勉強会@東京での発表資料です。
https://daisuki.nichiyoubi.land/entry/2023/08/15/235930
をベースにしたLTをしてきました
hideki kinjyo
PRO
November 29, 2023
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
500
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
260
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
3
490
SPLから始める「データ構造」入門
o0h
PRO
7
1.8k
PHPUnit11の新しい仲間たち
o0h
PRO
3
370
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
61
20k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
150
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
3
1.3k
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
2.6k
Other Decks in Programming
See All in Programming
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
440
急成長期の品質とスピードを両立するフロントエンド技術基盤
soarteclab
0
930
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
180
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
130
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
160
tidymodelsによるtidyな生存時間解析 / Japan.R2024
dropout009
1
770
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
How to train your dragon (web standard)
notwaldorf
88
5.7k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
RailsConf 2023
tenderlove
29
940
The Invisible Side of Design
smashingmag
298
50k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Statistics for Hackers
jakevdp
796
220k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Transcript
PHPのファイルに差分 が あるかを (astを使って)調 べ る君 ୈ157ճ PHPษڧձˏ౦ژ Hideki Kinjyo
GitHub: o0h / Twitter: @o0h_
自己紹介 • 金城秀樹 / きんじょうひでき • GitHub:@o0h / Twitter:@o0h_ •
好きなFWはCakePHP • アイコンは 美味しい鮭親子丼の写真です
PHPは進化してますね
コーディング規約だって、変わっていく
None
大体どの会社にも1人はいる人 「うちのPJにも コーディング規約入れましょうよ」
vendor/bin/phpcs、そして─ とっても落ち着く景色(やったね!)
でも、 今やECSやPHP-CS-Fixerがありますもんで。 「過去のコードをきれいにする」も、 省エネで出来ちゃう。
???「修正してみました!レビューお願いします!」
このPRを「アリ」にする話
機械に「OK」って言われたら、 我々は従うことが出来る
元ネタ モノタロウさんのブログで見かけて、ずっと気になっていました https://tech-blog.monotaro.com/entry/2018/09/26/142451
ASTからPHPの世界を見上げる • いわば「品詞」「文法」の変更だけを見ることが出来る • この世界では、インデントや()の省略は「差分がない」 • AST的な変化がない = プログラムも変わってないよね?
スクリプトを 「木」構造に
見た目は違うコードも 同じ構造として 解釈される
dumpを取ってみている例 (とっても簡単!)
これを使って、PRを送る時に 「AST的な差分」を示せたら良いのでは?
先達も既にいる https://zenn.dev/snowcait/articles/30f44683fed179
作った https://daisuki.nichiyoubi.land/entry/2023/08/15/235930
こんなものを作りました • nikic/php-parser を使って • Gitのコミットハッシュを2つ指定して、差分を検出 • コミットとかブランチとかタグとか • PHPファイルのdiffがあったら、ASTのhashを取って比較
• 変更のある無しを出力
仕組み • `git diff` で差分の発生したファイルを取得 • `git show` で、比較元・比較先のコミットでのファイル 全体(ソースコード)を取得
• 取得したソースからASTを生成 <= モノタロウさんの方法ママ • 生成したASTをmd5でハッシュ化 <= モノタロウさんの方法ママ • ハッシュを比較
こんなdiffに・・
こんな結果を出せる 「ast-changed」だけ見ればOK
こういうのは差分扱い
こういうのを無視できる • 予約語の大文字/小文字 • スペースやタブ、改行 • 「ヒアドキュメント中の行頭スペース」とかを認識でき るのが、git ignore whitespaceとの違い(嬉)
• 省略可能な括弧の有無
今後やりたい • コードはOSSとしてGitHubに晒したい • GitHub Actionsで、PRに対して動かせるようにしたい
まとめ • 安心してクソデカPRを投げられるぞ • 理性的で説明可能な根拠を持って、 レビュアーフレンドリーなPRを投げましょう! • いろんな便利なものを使って(テストとか静的解析とか)、
ウキウキPHPライフを!
おしまい! お付き合いいただき ありがとうございました!!