rector / argtyper
Analyze real method argument types, and add them as type declarations
Installs: 192
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/rector/argtyper
Requires
- php: >=7.4
- phpstan/phpstan: ^2.0
- rector/rector: ^2.0
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 add-types .
Or on another project:
vendor/bin/argtyper add-types 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!