Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
PHPのファイルに差分 が あるかを (astを使って)調 べ る君 ୈ157ճ PHPษڧձˏ౦ژ Hideki Kinjyo GitHub: o0h / Twitter: @o0h_
Slide 2
Slide 2 text
自己紹介 • 金城秀樹 / きんじょうひでき • GitHub:@o0h / Twitter:@o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親子丼の写真です
Slide 3
Slide 3 text
PHPは進化してますね
Slide 4
Slide 4 text
コーディング規約だって、変わっていく
Slide 5
Slide 5 text
No content
Slide 6
Slide 6 text
大体どの会社にも1人はいる人 「うちのPJにも コーディング規約入れましょうよ」
Slide 7
Slide 7 text
vendor/bin/phpcs、そして─ とっても落ち着く景色(やったね!)
Slide 8
Slide 8 text
でも、 今やECSやPHP-CS-Fixerがありますもんで。 「過去のコードをきれいにする」も、 省エネで出来ちゃう。
Slide 9
Slide 9 text
???「修正してみました!レビューお願いします!」
Slide 10
Slide 10 text
このPRを「アリ」にする話
Slide 11
Slide 11 text
機械に「OK」って言われたら、 我々は従うことが出来る
Slide 12
Slide 12 text
元ネタ モノタロウさんのブログで見かけて、ずっと気になっていました https://tech-blog.monotaro.com/entry/2018/09/26/142451
Slide 13
Slide 13 text
ASTからPHPの世界を見上げる • いわば「品詞」「文法」の変更だけを見ることが出来る • この世界では、インデントや()の省略は「差分がない」 • AST的な変化がない = プログラムも変わってないよね?
Slide 14
Slide 14 text
スクリプトを 「木」構造に
Slide 15
Slide 15 text
見た目は違うコードも 同じ構造として 解釈される
Slide 16
Slide 16 text
dumpを取ってみている例 (とっても簡単!)
Slide 17
Slide 17 text
これを使って、PRを送る時に 「AST的な差分」を示せたら良いのでは?
Slide 18
Slide 18 text
先達も既にいる https://zenn.dev/snowcait/articles/30f44683fed179
Slide 19
Slide 19 text
作った https://daisuki.nichiyoubi.land/entry/2023/08/15/235930
Slide 20
Slide 20 text
こんなものを作りました • nikic/php-parser を使って • Gitのコミットハッシュを2つ指定して、差分を検出 • コミットとかブランチとかタグとか • PHPファイルのdiffがあったら、ASTのhashを取って比較 • 変更のある無しを出力
Slide 21
Slide 21 text
仕組み • `git diff` で差分の発生したファイルを取得 • `git show` で、比較元・比較先のコミットでのファイル 全体(ソースコード)を取得 • 取得したソースからASTを生成 <= モノタロウさんの方法ママ • 生成したASTをmd5でハッシュ化 <= モノタロウさんの方法ママ • ハッシュを比較
Slide 22
Slide 22 text
こんなdiffに・・
Slide 23
Slide 23 text
こんな結果を出せる 「ast-changed」だけ見ればOK
Slide 24
Slide 24 text
こういうのは差分扱い
Slide 25
Slide 25 text
こういうのを無視できる • 予約語の大文字/小文字 • スペースやタブ、改行 • 「ヒアドキュメント中の行頭スペース」とかを認識でき るのが、git ignore whitespaceとの違い(嬉) • 省略可能な括弧の有無
Slide 26
Slide 26 text
今後やりたい • コードはOSSとしてGitHubに晒したい • GitHub Actionsで、PRに対して動かせるようにしたい
Slide 27
Slide 27 text
まとめ • 安心してクソデカPRを投げられるぞ • 理性的で説明可能な根拠を持って、 レビュアーフレンドリーなPRを投げましょう! • いろんな便利なものを使って(テストとか静的解析とか)、 ウキウキPHPライフを!
Slide 28
Slide 28 text
おしまい! お付き合いいただき ありがとうございました!!