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
760
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
430
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
230
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
3
420
SPLから始める「データ構造」入門
o0h
PRO
7
1.6k
PHPUnit11の新しい仲間たち
o0h
PRO
3
290
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
60
19k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
130
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
3
1.1k
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
2.3k
Other Decks in Programming
See All in Programming
Re:proS_案内資料
rect
0
250
Java ジェネリクス入門 2024
nagise
0
480
讓數據說話:用 Python、Prometheus 和 Grafana 講故事
eddie
0
310
Identifying User Idenity
moro
4
5.1k
Vertical Architectures for Scalable Angular Applications
manfredsteyer
PRO
0
270
CSC509 Lecture 07
javiergs
PRO
0
140
ActiveRecordの力でDBのメタデータを迅速に解析する
lnit
5
2.2k
テスト駆動開発✅️
akitoshiga
1
200
Prompt Engineering for Developers @ AWS Community Day Adria 2024
slobodan
0
110
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
330
詳細解説! ArrayListの仕組みと実装
yujisoftware
0
400
推し活の ハイトラフィックに立ち向かう Railsとアーキテクチャ - Kaigi on Rails 2024
falcon8823
6
1.1k
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1365
200k
The Invisible Side of Design
smashingmag
297
50k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
The Cost Of JavaScript in 2023
addyosmani
45
6k
Docker and Python
trallard
40
3k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Teambox: Starting and Learning
jrom
132
8.7k
Documentation Writing (for coders)
carmenintech
65
4.4k
Building an army of robots
kneath
302
42k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
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ライフを!
おしまい! お付き合いいただき ありがとうございました!!