Hledám nástroj pro statickou statistickou analýzu kódu

David Grudl
Nette Core | 7777
+
+8
-

Tohle nosím v hlavě už mnoho let, ale teď se mi zdá, že by mohlo být relativně snadno realizovatelné. Jednak možná už něco takového existuje, nebo by se k tomu dal „znásilnit“ PHPStan či Rector.

Hledám nástroj, který spustím nad vlastním kódem, a on vygeneruje statistiku počtu vytváření objektů a volání metod u tříd spadajících pod nějaký namespace.

Příklad výstupu pro namespace Nette\*:

Nette\Utils\Strings::substring()  153x
Nette\Utils\ArrayList::__construct() 57x
Nette\Utils\ArrayList::count() 57x
Nette\Forms\Form::__construct() 3x
...

Dokonalé by bylo, kdyby dokázal do statistiky zahrnout i kolikrát se u jednotlivých metod používají jednotlivé parametry, nejlépe s rozlišením na poziční a pojmenované, a jestli se využívá návratová hodnota.

A úplně nejdokonalejší by bylo, kdyby dokázal říct, od kterých tříd spadajících do namespace se dědí a které metody se přepisují.

K čemu by to bylo dobré?

Jednou ročně bych požádal co nejvíc uživatelů o vygenerování statistik z jejich codebase a anonymizované odeslání. Získal bych tak perfektní představu, které featury jsou používané a který kód je naopak mrtvý. Jaké API uživatelům vyhovuje a jaké ne. Což by bylo hodně důležité vodítko při dalším vývoji.

Existuje už něco takového? Nebo dokážete takový nástroj vytvořit?

uživatel-p
Člen | 553
+
0
-

Určitě by něco takového šlo vytvořit. Minimálně nad PHP 8 v tom nevidím problém. Jestli to existuje nevím, ale dokážu si představit, že pokud se něco takového vytvoří, tak by k tomu mohlo být volitelné rozšíření, které se bude spouštět cronem a jednou za rok bude automaticky projíždět kód a odesílat anonymně data na mail samo, takže uživatelé nebudou muset spouštět a odesílat statistiku ručně.

Jediný problém, kdy by statistika nemusela být přesná si myslím, že je použití proměnných místo názvů:

function foo(string $class, string $method, string $value): string
{
	return $class::$method($value);
}

Kde třída a metoda se načítají například z databáze apod.

matyx
Člen | 9
+
+5
-

@DavidGrudl Zajímavý nápad. Šel by na to použít psalm (asi by to šlo i s phpstanem). Zkusil jsem vytvořit PoC nad nette-sandboxem, výsledek můžeš vidět tady.

Má to určité limity – výsledek silně závisí na kvalitě zkoumaného kódu (když se nepodaří statické analýze určit typ, tak to (asi?) nic nevypíše). Ale pro statistické účely by to nemuselo vadit. S trochou práce by se to dalo naučit i počítání použitých argumentů.

David Grudl
Nette Core | 7777
+
0
-

@matyx wow, díky.