Skip to content

Comments

[TASK] Upgrade PHPStan ecosystem to 2.x#4

Open
CybotTM wants to merge 4 commits intomainfrom
feature/phpstan-2
Open

[TASK] Upgrade PHPStan ecosystem to 2.x#4
CybotTM wants to merge 4 commits intomainfrom
feature/phpstan-2

Conversation

@CybotTM
Copy link
Owner

@CybotTM CybotTM commented Feb 22, 2026

Summary

Coordinated upgrade of the PHPStan ecosystem to major version 2:

  • phpstan/phpstan: ^1.12 -> ^2.1
  • phpstan/phpstan-strict-rules: ^1.6 -> ^2.0
  • symplify/phpstan-rules: ^13.0 -> ^14.9
  • Removed deprecated symplify regex rules (dropped in 14.x)
  • Updated phpstan.neon config: strictCalls -> strictFunctionCalls (renamed in 2.x)
  • Regenerated phpstan-baseline.neon — reduced from 13 entries (main) to 9 entries

Baseline reduction approach

All PHPStan errors were fixed with genuine code changes (no @phpstan-ignore suppressions):

  • Return type narrowing: Changed Node|nullNode on NodeTransformer implementations (valid PHP covariance)
  • Input validation: Added is_string()/is_array() guards for mixed Symfony Console inputs
  • JSON/YAML parsing: Step-by-step type validation of json_decode()/Yaml::parse() results
  • Type annotations: Fixed array type annotations (array<string, mixed> instead of array<mixed>)
  • DOM handling: Proper DOMNodeList access in SiteSetSettingsDirective

Remaining 9 baseline entries are unfixable external library constraints:

  • 7 entries: phpDocumentor interfaces returning mixed from getId(), getAdditionalIds(), etc.
  • 2 entries: Symfony ExtensionInterface::load() parameter contravariance

PHPStan 2.x works on PHP ^7.4|^8.0, no PHP minimum bump needed.

Test plan

  • PHPStan analysis passes (0 errors with baseline)
  • PHP CS Fixer clean (0 fixes)
  • Unit tests pass (83/83)
  • Integration tests pass
  • CI passes

- phpstan/phpstan: ^1.12 -> ^2.1
- phpstan/phpstan-strict-rules: ^1.6 -> ^2.0
- symplify/phpstan-rules: ^13.0 -> ^14.9
- Removed deprecated symplify regex rules (dropped in 14.x)
- Updated strictRules config: strictCalls -> strictFunctionCalls
- Regenerated phpstan-baseline.neon for stricter 2.x rules
Copilot AI review requested due to automatic review settings February 22, 2026 11:30
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Upgrades the project’s PHP static analysis toolchain to PHPStan 2.x, updating configuration and baseline to match the new rule/parameter set while keeping CI coverage current.

Changes:

  • Bumped PHPStan + related rule packages to 2.x-compatible versions (and updated composer.lock accordingly).
  • Updated phpstan.neon for PHPStan 2.x config changes and removed deprecated Symplify regex rules.
  • Regenerated phpstan-baseline.neon to reflect the new/stricter rule set.
  • Expanded CI test matrix to include PHP 8.5.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
phpstan.neon Adjusts PHPStan 2.x config (strictFunctionCalls) and removes rules no longer available in Symplify 14.x.
phpstan-baseline.neon Updates baseline to the new set of reported issues under PHPStan 2.x.
composer.json Upgrades PHPStan ecosystem dependencies to 2.x-compatible versions.
composer.lock Locks upgraded dependency graph for the PHPStan ecosystem and transitive updates.
.github/workflows/main.yaml Adds PHP 8.5 to the CI matrix to keep runtime coverage current.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Reduce PHPStan baseline from 102 to 55 errors (46% reduction)
across 31 files by applying targeted fixes:

- Fix @param type on Typo3DocsThemeExtension::load() (15 errors)
- Add array_values() wrappers where list<> expected (12 errors)
- Add @phpstan-ignore return.unusedType on NodeTransformers (9 errors)
- Cast $input->getArgument() to (string) in CLI commands (7 errors)
- Fix dead code bug: missing $guides in operateOnXmlGuides() (4 errors)
- Remove unnecessary @var in TwigExtension (2 errors)
- Add @return list<string> to collectUnmigratedLegacySettings() (1 error)
- Cast $errno to (string) in XmlValidator (1 error)
- Fix nullsafe ?->textContent to -> in SiteSetSettingsDirective (1 error)
- Cast $answer to (string) in InitCommand validators (3 errors)
- Add type annotations for return.type entries (3 errors)
- Type-hint RunDecorator process callback parameters (3 errors)
- Cast $_SERVER['argv'] to array in AddThemeSettingsToProjectNode (1 error)
…ssions

Replace inline @phpstan-ignore annotations with genuine code fixes:
- Narrow return types from Node|null to Node (valid PHP covariance)
- Add is_string()/is_array() guards for mixed Symfony Console inputs
- Type-safe extraction of JSON/YAML parsed data with step-by-step validation
- Fix array type annotations (array<string, mixed> instead of array<mixed>)
- Properly handle DOMNodeList access in SiteSetSettingsDirective

Baseline reduced from 41 to 9 entries (vs 13 on main). Remaining 9 are
unfixable external library constraints (phpDocumentor interfaces returning
mixed, Symfony ExtensionInterface contravariance).
… tests

The previous commit incorrectly replaced getValue() with getChildren()
in ViewHelperDirective. These access different properties on CompoundNode
(value vs children), causing the ViewHelper description/examples/sections
to be empty in rendered output.

Restore getValue() with proper is_array() type narrowing to satisfy
PHPStan without changing runtime behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant