[TOOLS][PHPStan] Add support for deducing the correct entity type from a table name. Needs refactoring and can only run inside container, as it connects to the database itself
This commit is contained in:
parent
4e30e5aad9
commit
ddb9702b1c
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
root="$(git rev-parse --show-toplevel)"
|
root="$(git rev-parse --show-toplevel)"
|
||||||
|
|
||||||
|
10
config/phpstan-bootstrap.php
Normal file
10
config/phpstan-bootstrap.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'bootstrap.php';
|
||||||
|
|
||||||
|
use App\Kernel;
|
||||||
|
use Symfony\Component\Dotenv\Dotenv;
|
||||||
|
|
||||||
|
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
|
||||||
|
$kernel->boot();
|
||||||
|
return $kernel->getContainer()->get('doctrine')->getManager();
|
@ -10,3 +10,12 @@ parameters:
|
|||||||
message: '/Access to an undefined property App\\Util\\Bitmap::\$\w+/'
|
message: '/Access to an undefined property App\\Util\\Bitmap::\$\w+/'
|
||||||
paths:
|
paths:
|
||||||
- *
|
- *
|
||||||
|
|
||||||
|
services:
|
||||||
|
-
|
||||||
|
class: App\PHPStan\ClassFromTableNameDynamicStaticMethodReturnTypeExtension
|
||||||
|
tags:
|
||||||
|
- phpstan.broker.dynamicStaticMethodReturnTypeExtension
|
||||||
|
|
||||||
|
-
|
||||||
|
class: App\PHPStan\ObjectManagerResolver
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\PHPStan;
|
||||||
|
|
||||||
|
use App\Core\DB\DB;
|
||||||
|
use App\Util\Formatting;
|
||||||
|
use Doctrine\Persistence\ObjectManager;
|
||||||
|
use PhpParser\Node\Expr\StaticCall;
|
||||||
|
use PhpParser\Node\Scalar\String_;
|
||||||
|
use PhpParser\Node\Name;
|
||||||
|
use PHPStan\Analyser\Scope;
|
||||||
|
use PHPStan\Reflection\MethodReflection;
|
||||||
|
use PHPStan\Type\DynamicStaticMethodReturnTypeExtension;
|
||||||
|
use PHPStan\Type\Constant\ConstantStringType;
|
||||||
|
|
||||||
|
class ClassFromTableNameDynamicStaticMethodReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension
|
||||||
|
{
|
||||||
|
private ?ObjectManager $manager = null;
|
||||||
|
public function __construct(ObjectManagerResolver $resolver)
|
||||||
|
{
|
||||||
|
$this->manager = $resolver->getManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getClass(): string
|
||||||
|
{
|
||||||
|
return \App\Core\DB\DB::class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isStaticMethodSupported(MethodReflection $methodReflection): bool
|
||||||
|
{
|
||||||
|
return in_array($methodReflection->getName(), DB::METHODS_ACCEPTING_TABLE_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTypeFromStaticMethodCall(
|
||||||
|
MethodReflection $methodReflection,
|
||||||
|
StaticCall $staticCall,
|
||||||
|
Scope $scope
|
||||||
|
): \PHPStan\Type\Type
|
||||||
|
{
|
||||||
|
if (count($staticCall->args) === 0) {
|
||||||
|
return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $staticCall->args, $methodReflection->getVariants())->getReturnType();
|
||||||
|
}
|
||||||
|
$arg = $staticCall->args[0]->value;
|
||||||
|
if ($arg instanceof String_) {
|
||||||
|
DB::setManager($this->manager);
|
||||||
|
DB::initTableMap();
|
||||||
|
$class = DB::filterTableName($staticCall->name, [$arg->value]);
|
||||||
|
return $scope->resolveTypeByName(new Name($class));
|
||||||
|
} else {
|
||||||
|
return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $staticCall->args, $methodReflection->getVariants())->getReturnType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
src/PHPStan/ObjectManagerResolver.php
Normal file
20
src/PHPStan/ObjectManagerResolver.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\PHPStan;
|
||||||
|
|
||||||
|
use Doctrine\Persistence\ObjectManager;
|
||||||
|
|
||||||
|
class ObjectManagerResolver
|
||||||
|
{
|
||||||
|
private ?ObjectManager $objectManager = null;
|
||||||
|
|
||||||
|
public function getManager(): ObjectManager
|
||||||
|
{
|
||||||
|
if ($this->objectManager !== null) {
|
||||||
|
return $this->objectManager;
|
||||||
|
} else {
|
||||||
|
$this->objectManager = require __DIR__ . '/../../config/phpstan-bootstrap.php';
|
||||||
|
return $this->objectManager;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user