rector / argtyper
Analyze real method argument types, and add them as type declarations
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/rector/argtyper
Requires
- php: ^8.2
- phpstan/phpstan: ^2.1
- rector/rector: ^2.2
- symfony/console: ^7.3
- symfony/finder: ^7.3
- symfony/process: ^7.3
- webmozart/assert: ^1.11
Requires (Dev)
- php-parallel-lint/php-parallel-lint: ^1.4
- phpecs/phpecs: ^2.2
- phpunit/phpunit: ^11.5
- tomasvotruba/class-leak: ^2.0
- tracy/tracy: ^2.10
README
There are often more known types in your project than meets the eye.
This tool detects the real types passed into method and function calls using PHPStan.
$this->hotelOverview->makeRoomAvailable(324);
Later in the code...
public function roomDetail(int $roomNumber) { $this->hotelOverview->makeRoomAvailable($roomNumber); }
Later in tests...
public function test(int $roomNumber): void { $this->hotelOverview->makeRoomAvailable($roomNumber); }
✅ Three times an int value is passed into makeRoomAvailable().
Then Rector runs and fills in the missing type declarations:
final class HotelOverview
{
- public function makeRoomAvailable($roomNumber)
+ public function makeRoomAvailable(int $roomNumber)
{
}
}
✅ An int parameter type is added to the makeRoomAvailable() method.
That’s it.
Install
composer require rector/argtyper --dev
Usage
Run it in your project directory:
vendor/bin/argtyper .
Or on another project:
vendor/bin/argtyper project
To see more details during the process, add the --debug option.
How It Works
At first, a set of custom PHPStan rules scans your code and records the argument types passed to method calls, static calls, new expressions, and function calls. It stores this data in temporary *.json files in the following format:
[
{
"class": "HotelOverview",
"method": "makeRoomAvailable",
"position": 0,
"type": "PHPStan\\Type\\IntegerType"
}
]
Then, custom Rector rules go through the codebase and fill in the known parameter types based on the collected data — but only where they’re missing.
With a few exceptions:
- If multiple types are found → it’s skipped.
- If union or intersection types are found → it’s skipped as ambiguous.
- If a
floatparameter type is declared but onlyintarguments are passed (e.g.30.0) → it’s skipped to avoid losing decimal precision.
Verify the Results
It’s not 100 % perfect, but in our tests it fills in about 95 % of the data correctly and saves a huge amount of manual work.
You can fix the remaining cases manually based on PHPStan or test feedback.
Happy coding!