Pred nejakým časom som sa rozhodol vylepšiť kódovú základňu jedného z mojich väčších aktívne vyvíjaných Laravel projektov tak, aby vyhovovala prísnym pravidlám larastan na úrovni 9. Pri prvom spustení analýza nahlásila viac ako 1200 chýb – absolútne obrovská záležitosť pre jedného človeka.
Začal som pred viac ako rokom, pomaly okusujúc chyby popri osobnom živote, vývoji nových funkcií a iných projektoch, a zo začiatku to bolo dosť bolestivé.
Backend projektu je dôkladne pokrytý testami, ktoré som osobne napísal. V
čase písania tohto príspevku je ich viac ako 600 s viac ako 3400
assertionmi. Táto skutočnosť mi dáva istotu pri náhlych zmenách v kódovej
základni, či už cez sed (alebo jeho modernejšiu alternatívu sd), alebo
cez lintery ako php-cs-fixer.
Pokrytie testami mi tiež dáva veľkú istotu pri používaní umelej
inteligencie na zmeny v kódovej základni, najmä preto, že som teraz objavil
spôsob, ako prejsť stovkami larastan chýb za deň namiesto mesiaca. Postup
po spustení aider s obľúbeným modelom:
- spustiť analýzu manuálne
- skopírovať 3-7 chýb z 1-3 súborov do chatu
- vložiť chyby priamo do chatu a stlačiť Enter niekoľkokrát
- sledovať, ako sa chyby bez námahy vyriešia
- napísať
/dropna odstránenie súborov z chatu - zopakovať!
Väčšinou to funguje bez problémov, keďže výstup chýb phpstan obsahuje
názvy súborov a aider vás sám vyzve, aby ste ich pridali do chatu. Ako
pri všetkých modeloch, niekedy je navrhnuté riešenie úplný nezmysel a je
potrebný manuálny zásah, no takto som sa zbavil asi 200 chýb na úrovniach
6 - 8 za dva dni a cítil sa výborne. Všetky testy stále prechádzajú, len
som sa uistil, že som skontroloval všetky zmeny, ktoré model urobil,
namiesto toho, aby som ich vymýšľal sám. Obrovská úspora času! Len dávajte
pozor na kontext modelu.
Nižšie je výstup takéhoto procesu pre ilustráciu, no nie cez kopírovanie a
vkladanie. Namiesto toho sa používa príkaz aider /run, ktorý ho naučí,
ako spustiť analýzu na jedinom súbore, pretože predvolene neposkytuje
parameter --memory-limit
parameter ani správny
spôsob pre Laravel Sail (ak ho používate), čím analýza zlyháva/padá.
$ aider --model sonnet dev
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Aider v0.85.1
Main model: anthropic/claude-sonnet-4-20250514 with diff edit format, infinite output
Weak model: anthropic/claude-3-5-haiku-20241022
Git repo: .git with 456 files
Repo-map: using 4096 tokens, auto refresh
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
> /run ./vendor/bin/sail exec laravel.test vendor/bin/phpstan --memory-limit=24G analyse tests/Feature/ItemTest.php
Note: Using configuration file /var/www/html/phpstan.neon.
1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
------ ---------------------------------------------------------------------
Line ItemTest.php
------ ---------------------------------------------------------------------
272 Casting to int something that's already int.
🪪 cast.useless
💡 Because the type is coming from a PHPDoc, you can turn off this
check by setting treatPhpDocTypesAsCertain: false in your
phpstan.neon.
417 Casting to int something that's already int.
🪪 cast.useless
💡 Because the type is coming from a PHPDoc, you can turn off this
check by setting treatPhpDocTypesAsCertain: false in your
phpstan.neon.
------ ---------------------------------------------------------------------
[ERROR] Found 2 errors
Add 1.1k tokens of command output to the chat? (Y)es/(N)o [Yes]:
Added 22 lines of output to the chat.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
> What's wrong? Fix
The PHPStan error shows there are useless int casts on lines 272 and 417 in tests/Feature/ItemTest.php. These lines are casting values that are already integers.
To fix this, I need you to add the file tests/Feature/ItemTest.php to the chat so I can see the specific lines and remove the unnecessary (int) casts.
Tokens: 11k sent, 76 received. Cost: $0.04 message, $0.04 session.
tests/Feature/ItemTest.php
Add file to the chat? (Y)es/(N)o/(D)on't ask again [Yes]:
Looking at the PHPStan errors, I need to remove the unnecessary (int) casts on lines 272 and 417. These are casting $item->internal_number which is already an integer according to the type system.
tests/Feature/ItemTest.php
<<<<<<< SEARCH
'internal_number' => (int) $item->internal_number,
=======
'internal_number' => $item->internal_number,
>>>>>>> REPLACE
tests/Feature/ItemTest.php
<<<<<<< SEARCH
'internal_number' => (int) $item->internal_number,
=======
'internal_number' => $item->internal_number,
>>>>>>> REPLACE
./vendor/bin/sail exec laravel.test vendor/bin/phpstan --memory-limit=24G analyse tests/Feature/ItemTest.php
Tokens: 12k sent, 171 received. Cost: $0.04 message, $0.07 session.
Applied edit to tests/Feature/ItemTest.php
Commit 7b8b075 refactor: remove unnecessary int casts in ItemTest.php
./vendor/bin/sail exec laravel.test vendor/bin/phpstan --memory-limit=24G analyse tests/Feature/ItemTest.php
Run shell command? (Y)es/(N)o/(D)on't ask again [Yes]:
Running ./vendor/bin/sail exec laravel.test vendor/bin/phpstan --memory-limit=24G analyse tests/Feature/ItemTest.php
Note: Using configuration file /var/www/html/phpstan.neon.
1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
[OK] No errors
Enjoy!