refactor: fix all 105 PHPStan 2 strict type findings across core and modules

Resolve all non-false-positive PHPStan 2 findings, reducing the baseline
from 486 to 382 entries (only unused-public false positives remain).

Categories fixed:
- Remove 39 redundant type checks (is_string, is_array, is_object, method_exists)
- Remove 12 no-op array_values() on already-sequential lists
- Simplify 13 null-coalesce on guaranteed offsets
- Remove 8 always-true instanceof checks
- Replace 12 redundant test assertions (assertTrue(true) → addToAssertionCount)
- Simplify 6 unnecessary nullsafe operators (?-> → ->)
- Fix 6 always-true !== '' comparisons
- Fix remaining: unset.offset, return.unusedType, staticMethod narrowing

53 files changed across core/, modules/, pages/, and tests/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-14 12:54:20 +02:00
parent a736566071
commit 3f0db68b27
53 changed files with 90 additions and 640 deletions

View File

@@ -268,7 +268,7 @@ final class InMemoryPermissionRepository implements PermissionRepositoryInterfac
return null;
}
public function create(array $data): ?int
public function create(array $data): int
{
$id = $this->nextId++;
$this->rows[$id] = [

View File

@@ -75,7 +75,6 @@ final class ModuleManifestContractTest extends AbstractModuleStructureContractTe
{
foreach (self::$modules as $module) {
foreach ($module['manifest']->requires as $index => $requiredId) {
self::assertIsString($requiredId);
self::assertNotEmpty(
trim($requiredId),
"Module '{$module['id']}' requires[{$index}] must be a non-empty string"

View File

@@ -95,7 +95,7 @@ final class ModuleUiContractTest extends AbstractModuleStructureContractTestCase
"Module '{$module['id']}' scheduler_jobs[{$index}] default_schedule_type invalid"
);
$allowedTypes = array_values($job['allowed_schedule_types']);
$allowedTypes = $job['allowed_schedule_types'];
self::assertNotEmpty($allowedTypes, "Module '{$module['id']}' scheduler_jobs[{$index}] allowed_schedule_types must be non-empty");
foreach ($allowedTypes as $allowedType) {
self::assertContains(

View File

@@ -99,8 +99,8 @@ class ErrorHandlerTest extends TestCase
{
putenv('APP_VENDOR_PHP_ISSUES_MODE=suppress_deprecations');
$result = ErrorHandler::handleError(E_DEPRECATED, 'deprecated', '/var/www/vendor/mintyphp/core/src/Router.php', 69);
$this->assertTrue($result);
ErrorHandler::handleError(E_DEPRECATED, 'deprecated', '/var/www/vendor/mintyphp/core/src/Router.php', 69);
$this->addToAssertionCount(1);
}
public function testHandleErrorSuppressesVendorWarningsOnlyInWarningMode(): void
@@ -115,8 +115,8 @@ class ErrorHandlerTest extends TestCase
}
putenv('APP_VENDOR_PHP_ISSUES_MODE=suppress_deprecations_warnings');
$result = ErrorHandler::handleError(E_WARNING, 'warning', '/var/www/vendor/mintyphp/core/src/Router.php', 69);
$this->assertTrue($result);
ErrorHandler::handleError(E_WARNING, 'warning', '/var/www/vendor/mintyphp/core/src/Router.php', 69);
$this->addToAssertionCount(1);
}
public function testHandleErrorNeverSuppressesNonVendorWarnings(): void

View File

@@ -11,7 +11,6 @@ class HotkeyServiceTest extends TestCase
{
$result = HotkeyService::list();
$this->assertIsArray($result);
$this->assertNotEmpty($result);
}
@@ -42,7 +41,6 @@ class HotkeyServiceTest extends TestCase
{
$result = HotkeyService::searchKeywords();
$this->assertIsArray($result);
$this->assertNotEmpty($result);
}
@@ -60,7 +58,6 @@ class HotkeyServiceTest extends TestCase
$result = HotkeyService::searchKeywords();
foreach ($result as $keyword) {
$this->assertIsString($keyword);
$this->assertNotEmpty($keyword);
}
}

View File

@@ -9,7 +9,7 @@ final class AppContainerIsolationTraitTest extends TestCase
{
public function testPushAndRestoreRoundTripKeepsOriginalGlobalContainer(): void
{
$original = $GLOBALS['minty_app_container'] ?? null;
$original = $GLOBALS['minty_app_container'];
self::assertInstanceOf(AppContainer::class, $original);
$harness = new class () {
@@ -29,16 +29,16 @@ final class AppContainerIsolationTraitTest extends TestCase
$replacement = new AppContainer();
$harness->push($replacement);
self::assertSame($replacement, $GLOBALS['minty_app_container'] ?? null);
self::assertSame($replacement, $GLOBALS['minty_app_container']);
$harness->restore();
self::assertSame($original, $GLOBALS['minty_app_container'] ?? null);
self::assertSame($original, $GLOBALS['minty_app_container']);
}
public function testMultiplePushesRestoreToInitialContainer(): void
{
$original = $GLOBALS['minty_app_container'] ?? null;
$original = $GLOBALS['minty_app_container'];
self::assertInstanceOf(AppContainer::class, $original);
$harness = new class () {
@@ -61,10 +61,10 @@ final class AppContainerIsolationTraitTest extends TestCase
$harness->push($first);
$harness->push($second);
self::assertSame($second, $GLOBALS['minty_app_container'] ?? null);
self::assertSame($second, $GLOBALS['minty_app_container']);
$harness->restore();
self::assertSame($original, $GLOBALS['minty_app_container'] ?? null);
self::assertSame($original, $GLOBALS['minty_app_container']);
}
}