Skip to content

rectorphp/argtyper

Repository files navigation

Fill Parameter Types based on Passed Values

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 float parameter type is declared but only int arguments 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!

About

Analyze real method argument types, and add them as type declarations

Resources

Stars

Watchers

Forks

Packages

No packages published