[PHPStan] Only run custom PHPStan extensions if environment vairable PHPSTAN_BOOT_KERNEL is defined (since it requires having the whole social setup available)

This commit is contained in:
Hugo Sales 2021-09-13 13:52:44 +01:00
parent a21b0afb70
commit 1adde913c6
No known key found for this signature in database
GPG Key ID: 7D0C7EAFC9D835A0
6 changed files with 30 additions and 12 deletions

3
.dir-locals.el Normal file
View File

@ -0,0 +1,3 @@
((nil . ((php-project-root . auto)
(phpstan-config-file . (root . "phpstan.neon"))
(phpstan-memory-limit . "2G"))))

View File

@ -4,4 +4,4 @@ cd /var/www/social || exit 1
yes yes | php bin/console doctrine:fixtures:load || exit 1
runuser -u www-data -- vendor/bin/simple-phpunit -vvv --coverage-html .test_coverage_report
runuser -u www-data -- vendor/bin/simple-phpunit --ansi -vvv --coverage-html .test_coverage_report

View File

@ -2,4 +2,6 @@
cd /var/www/social || exit 1
vendor/bin/phpstan --ansi --no-interaction --memory-limit=2G analyse src tests components plugins
rm -rf /var/www/social/var/cache/*
PHPSTAN_BOOT_KERNEL=1 vendor/bin/phpstan --ansi --no-interaction --memory-limit=2G analyse
rm -rf /var/www/social/var/cache/*

View File

@ -2,6 +2,11 @@ parameters:
level: 3
bootstrapFiles:
- config/bootstrap.php
paths:
- src
- tests
- components
- plugins
earlyTerminatingMethodCalls:
App\Core\Log:
- unexpected_exception

View File

@ -28,12 +28,18 @@ class ClassFromTableNameDynamicStaticMethodReturnTypeExtension implements Dynami
return in_array($methodReflection->getName(), DB::METHODS_ACCEPTING_TABLE_NAME);
}
/**
* For calls to DB::find and such, if the first argument is a
* constant string, it's a table name, so convert it to the
* corresponding entity. Only run if the environment variable
* PHPSTAN_BOOT_KERNEL is defined
*/
public function getTypeFromStaticMethodCall(
MethodReflection $methodReflection,
StaticCall $staticCall,
Scope $scope
): \PHPStan\Type\Type {
if (count($staticCall->args) >= 1 && ($arg = $staticCall->args[0]->value) instanceof String_) {
if (isset($_ENV['PHPSTAN_BOOT_KERNEL']) && count($staticCall->args) >= 1 && ($arg = $staticCall->args[0]->value) instanceof String_) {
// If called with the first argument as a string, it's a table name
return $scope->resolveTypeByName(new Name(DB::filterTableName($staticCall->name, [$arg->value])));
} else {

View File

@ -14,15 +14,17 @@ class GNUsocialProvider
public function __construct()
{
$this->kernel = require __DIR__ . '/../../config/phpstan-bootstrap.php';
$container = $this->kernel->getContainer()->get('test.service_container');
$services = F\map(
(new \ReflectionClass(GNUsocial::class))->getMethod('__construct')->getParameters(),
fn ($p) => $container->get((string) $p->getType())
);
$this->gnu_social = new GNUsocial(...$services);
$this->gnu_social->initialize();
Event::handle('InitializeModule');
if (isset($_ENV['PHPSTAN_BOOT_KERNEL'])) {
$this->kernel = require __DIR__ . '/../../config/phpstan-bootstrap.php';
$container = $this->kernel->getContainer()->get('test.service_container');
$services = F\map(
(new \ReflectionClass(GNUsocial::class))->getMethod('__construct')->getParameters(),
fn ($p) => $container->get((string) $p->getType())
);
$this->gnu_social = new GNUsocial(...$services);
$this->gnu_social->initialize();
Event::handle('InitializeModule');
}
}
public function getGNUsocial(): GNUsocial