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

0.5.1 2025-10-18 14:52 UTC

This package is auto-updated.

Last update: 2025-11-21 01:19:43 UTC


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 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!