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
510
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_odawara
o0h
PRO
27
8.3k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
78
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
2
410
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
1.2k
OpCode目線で眺める PHPコードのカバレッジ
o0h
PRO
3
540
アプリケーションエンジニアこそ「監視」だよね!と私が考える訳 #phpkansai
o0h
PRO
21
9.2k
#phpcondo 新しくEMやってみる人にオススメしたい本を5分で25冊紹介する
o0h
PRO
23
7.7k
#phpcon 良いコードを書けるようになるコツは「エラーを気にする」 〜プログラマにとってエラーとは何なのか〜
o0h
PRO
0
820
ソフトウェアがバグだらけで何が悪い
o0h
PRO
1
1.1k
Other Decks in Programming
See All in Programming
障害対応を起点としたもっといい開発と運用のサイクル作りのためにできること / Hatena Enginner Seminar #29
polamjag
0
250
Polars入門
daikikatsuragawa
1
100
大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~
kj455
4
980
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
0
250
try!Swift Tokyo 2024 参加報告 LT
akidon0000
1
220
SIMD Parallel Programming with the Vector API
josepaumard
0
200
DMMプラットフォームがTiDB Cloudを採用した背景
pospome
9
4.1k
2 週間で Twitter Bot を作ってみた
contour_gara
0
660
使ってみよう Azure AI Document Intelligence
kosmosebi
2
330
Scalable Customer Journey Orchestration (CJO)
lewuathe
0
350
TCAとKMPを用いた新規動画配信アプリ 「ABEMA Live」の設計
tomu28
1
120
PHPはいつから死んでいるかの調査
chiroruxx
1
400
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
79
43k
The Pragmatic Product Professional
lauravandoore
25
5.8k
Unsuck your backbone
ammeep
663
57k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Product Roadmaps are Hard
iamctodd
44
9.7k
Fantastic passwords and where to find them - at NoRuKo
philnash
37
2.5k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
The World Runs on Bad Software
bkeepers
PRO
61
6.7k
Agile that works and the tools we love
rasmusluckow
325
20k
What’s in a name? Adding method to the madness
productmarketing
PRO
16
2.7k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
The Invisible Side of Design
smashingmag
294
49k
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ライフを!
おしまい! お付き合いいただき ありがとうございました!!