Coming from PHPStan¶
These pages show what takes the place of PHPStan, phpstan-drupal and their configuration in a Mago setup with this extension.
- phpstan-drupal: every rule and extension of phpstan-drupal, and the check, rule or analyzer section that takes its place.
- PHPStan identifiers: the Mago issues that report the same finding as a PHPStan identifier.
Moving the configuration¶
phpstan.neon |
Mago |
|---|---|
level |
Levels don't exist in Mago. It reports every issue found, at the issue's own level: error, warning, help or note. minimum-fail-level under [analyzer], or --minimum-fail-level, sets the lowest level that fails the run. Starting from a PHPStan level lists the issue codes by the PHPStan level that reports the same findings. |
| Missing types, from level 6 | check-missing-type-hints = true under [analyzer] reports a missing parameter, return or property type. |
paths |
paths under [source]. |
excludePaths |
excludes under [analyzer], or under [source] to keep a path from every Mago tool. phpstan-drupal leaves out *.api.php files and test fixtures by default, and so does the configuration. |
fileExtensions |
extensions under [source]. phpstan-drupal adds Drupal's extensions itself, and Mago needs them listed, as in Install. |
bootstrapFiles,scanFiles,scanDirectories |
includes under [source]: code read by Mago for its declarations and not reported. Mago doesn't run any code, so a bootstrap file counts only for what it declares. |
phpVersion |
php-version. |
ignoreErrors |
ignore under [analyzer], by issue code, by path, or by a pattern that the text of the issue must match, as Turning rules off shows. |
| A baseline | A PHPStan baseline can't be reused. vendor/bin/mago analyze --generate-baseline --baseline=analyzer-baseline.toml writes a new one, and baseline = "analyzer-baseline.toml" under [analyzer] reads it. |
drupal.drupal_root |
The worker's --root argument, see Finding the Drupal root. |
drupal.entityMapping |
Nothing. The analyzer reads entity types from their attributes and annotations, see The entity type index. |
drupal.rules |
ignore under [analyzer], with the code of the check that ports the rule. phpstan-drupal gives the codes. enabled = false under [linter.rules] turns off a rule ported by this extension as a linter rule. |
Starting from a PHPStan level¶
Mago doesn't have levels, so a project that runs PHPStan at level 6 also gets the issues that
PHPStan reports from level 7 on. The table lists Mago's issue codes under the PHPStan level that
reports the same findings. To leave out the levels above the project's own, add the codes of
their rows to ignore under [analyzer], see
Turning rules off. For level 6, those are the rows
for 7, 8, and 9 and 10. The last row has most of the issues.
| PHPStan level | Mago codes |
|---|---|
| 2 | non-existent-method, non-existent-property, non-documented-property, invalid-property-access, too-few-arguments, too-many-arguments, docblock-type-mismatch |
| 3 | property-type-coercion, less-specific-return-statement, invalid-return-statement, invalid-property-assignment-value, invalid-property-default-value |
| 4 | redundant-logical-operation, redundant-comparison, redundant-type-comparison, impossible-type-comparison, impossible-condition, redundant-condition |
| 5 | invalid-argument, null-argument |
| 6 | imprecise-type |
| 7 | possibly-invalid-argument, possibly-false-argument, possibly-invalid-array-access, possibly-false-array-access, invalid-array-access, invalid-method-access, falsable-return-statement, ambiguous-object-method-access |
| 8 | possible-method-access-on-null, possibly-null-argument, possibly-null-property-access, possibly-null-iterator, possibly-null-array-access, nullable-return-statement |
| 9 and 10 | mixed-argument, mixed-array-access, mixed-array-assignment, mixed-array-index, mixed-method-access, mixed-operand, mixed-property-access, mixed-property-type-coercion, mixed-return-statement, less-specific-nested-argument-type, less-specific-nested-return-statement, invalid-iterator, invalid-destructuring-source, template-constraint-violation |
- Mago reports
imprecise-typeonly withcheck-missing-type-hints = trueunder[analyzer], which is off by default. The setting also turns onmissing-parameter-type,missing-return-type,missing-property-typeandmissing-constant-type. These ask for a native type where PHPStan accepts the type of a docblock, so they don't belong to a level. - Levels 0 and 1 don't have a row. The codes for deprecated code aren't listed, since phpstan-deprecation-rules reports them at every level.
- Level 9 is for a value documented as
mixed, and level 10 for a value without a type, such as the items of a plainarray. Mago has the same codes for both. - PHPStan reports the findings of some codes at more than one level, and the table lists each
code once:
invalid-method-access(levels 2 and 7),invalid-return-statementandinvalid-property-assignment-value(levels 3, 7 and 8) andless-specific-return-statement(levels 3 and 7).
These codes don't belong to a level. PHPStan reports few of their findings, or none:
mixed-assignment, possibly-null-operand, possibly-null-array-index,
less-specific-argument, implicit-to-string-cast, string-member-selector,
undefined-variable, incompatible-parameter-name, ambiguous-object-property-access and
redundant-docblock-type.
Extension packages¶
- phpstan-deprecation-rules: Mago reports deprecated symbols itself. The
drupalplugin drops the reports in the places where a deprecated call is allowed in Drupal, and reports Drupal's deprecations not reported by Mago. See Deprecations. - phpstan-phpunit: the
phpunitplugin types PHPUnit's assertions and mocks. See Tests.
Running both¶
A project can run both tools while it moves. Turn on the
phpstan-ignores plugin, so that the @phpstan-ignore comments
already in the code drop the Mago issues that report the same finding. Mago's own comment for an
issue that should stay is @mago-expect analysis:<code>.