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:

  1. spustiť analýzu manuálne
  2. skopírovať 3-7 chýb z 1-3 súborov do chatu
  3. vložiť chyby priamo do chatu a stlačiť Enter niekoľkokrát
  4. sledovať, ako sa chyby bez námahy vyriešia
  5. napísať /drop na odstránenie súborov z chatu
  6. 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!

Odkazy #