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
530
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.7k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
84
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
2
470
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
1.3k
OpCode目線で眺める PHPコードのカバレッジ
o0h
PRO
3
590
アプリケーションエンジニアこそ「監視」だよね!と私が考える訳 #phpkansai
o0h
PRO
21
9.3k
#phpcondo 新しくEMやってみる人にオススメしたい本を5分で25冊紹介する
o0h
PRO
25
7.9k
#phpcon 良いコードを書けるようになるコツは「エラーを気にする」 〜プログラマにとってエラーとは何なのか〜
o0h
PRO
0
840
ソフトウェアがバグだらけで何が悪い
o0h
PRO
1
1.2k
Other Decks in Programming
See All in Programming
Jetpack Composeとデザインシステム
rmakiyama
0
240
Long journey of Ruby standard library RubyKaigi 2024
andpad
2
310
Findy - エンジニア向け会社紹介 / Findy Letter for Engineers
findyinc
2
74k
Exploring Type-Informed Lint Rules in Rust based TypeScript Linters
unvalley
3
650
PHPコードの実行モデルを理解する / Understanding-the-PHP-Execution-Model
shin1x1
0
1.1k
Unlocking Potential of Property Based Testing with Ractor
ohbarye
2
640
RailsConf 2024: Riffing on Rails: sketch your way to better designed code
kaspth
1
220
Enjoy Creative Coding with Ruby (RubyKaigi2024)
chobishiba
0
1k
Good first issues of TypeProf
mame
4
940
Slackワークフローで感謝を伝える機能/WiFi 自動接続/Figma to React Component/障害レポート君 Team3@NOT A HOTEL
nakaohiroshi
0
250
Implementing Design Systems in Swift
seyfoyun
2
530
一文字エイリアスのすすめ
fujimura
0
200
Featured
See All Featured
Scaling GitHub
holman
457
140k
Art, The Web, and Tiny UX
lynnandtonic
290
19k
Testing 201, or: Great Expectations
jmmastey
30
6.4k
Adopting Sorbet at Scale
ufuk
69
8.6k
Optimising Largest Contentful Paint
csswizardry
13
2.4k
Clear Off the Table
cherdarchuk
86
310k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
228
16k
The Mythical Team-Month
searls
217
42k
RailsConf 2023
tenderlove
9
590
Building a Scalable Design System with Sketch
lauravandoore
457
32k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
188
16k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
41
4.5k
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ライフを!
おしまい! お付き合いいただき ありがとうございました!!