2019-10-13 05:59:52 +00:00
< ? php
2021-05-09 20:15:43 +00:00
declare ( strict_types = 1 );
2022-06-06 17:12:56 +00:00
namespace Rector\NodeTypeResolver\DependencyInjection ;
2018-08-06 10:31:17 +00:00
2022-06-06 17:12:56 +00:00
use PhpParser\Lexer ;
use PHPStan\Analyser\NodeScopeResolver ;
use PHPStan\Analyser\ScopeFactory ;
use PHPStan\Dependency\DependencyResolver ;
use PHPStan\DependencyInjection\Container ;
use PHPStan\DependencyInjection\ContainerFactory ;
use PHPStan\ExtensionInstaller\GeneratedConfig ;
use PHPStan\File\FileHelper ;
use PHPStan\Parser\Parser ;
use PHPStan\PhpDoc\TypeNodeResolver ;
use PHPStan\Reflection\ReflectionProvider ;
use Rector\Core\Configuration\Option ;
use Rector\Core\Exception\ShouldNotHappenException ;
use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider ;
2021-10-04 21:24:17 +00:00
use ReflectionClass ;
2022-06-07 06:40:10 +00:00
use RectorPrefix20220607\Symplify\PackageBuilder\Parameter\ParameterProvider ;
2020-01-14 14:25:42 +00:00
/**
* Factory so Symfony app can use services from PHPStan container
*/
2018-08-06 10:31:17 +00:00
final class PHPStanServicesFactory
{
/**
2021-12-04 12:47:17 +00:00
* @ readonly
2021-08-23 00:20:32 +00:00
* @ var \PHPStan\DependencyInjection\Container
2018-08-06 10:31:17 +00:00
*/
private $container ;
2022-06-07 06:40:10 +00:00
public function __construct ( \RectorPrefix20220607\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider )
2018-08-06 10:31:17 +00:00
{
2022-06-06 17:12:56 +00:00
$containerFactory = new \PHPStan\DependencyInjection\ContainerFactory ( \getcwd ());
2019-07-28 13:46:37 +00:00
$additionalConfigFiles = [];
2022-06-06 17:12:56 +00:00
if ( $parameterProvider -> hasParameter ( \Rector\Core\Configuration\Option :: PHPSTAN_FOR_RECTOR_PATH )) {
$additionalConfigFiles [] = $parameterProvider -> provideStringParameter ( \Rector\Core\Configuration\Option :: PHPSTAN_FOR_RECTOR_PATH );
2022-05-27 13:38:07 +00:00
}
2021-03-12 01:21:29 +00:00
$additionalConfigFiles [] = __DIR__ . '/../../../config/phpstan/static-reflection.neon' ;
$additionalConfigFiles [] = __DIR__ . '/../../../config/phpstan/better-infer.neon' ;
2021-10-27 19:25:02 +00:00
$additionalConfigFiles [] = __DIR__ . '/../../../config/phpstan/parser.neon' ;
2021-10-04 21:24:17 +00:00
$extensionConfigFiles = $this -> resolveExtensionConfigs ();
$additionalConfigFiles = \array_merge ( $additionalConfigFiles , $extensionConfigFiles );
2021-05-09 20:15:43 +00:00
$existingAdditionalConfigFiles = \array_filter ( $additionalConfigFiles , 'file_exists' );
$this -> container = $containerFactory -> create ( \sys_get_temp_dir (), $existingAdditionalConfigFiles , []);
2018-08-06 10:31:17 +00:00
}
2020-03-28 23:06:05 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createReflectionProvider () : \PHPStan\Reflection\ReflectionProvider
2018-08-06 10:31:17 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \PHPStan\Reflection\ReflectionProvider :: class );
2018-08-06 10:31:17 +00:00
}
2021-10-27 19:25:02 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createEmulativeLexer () : \PhpParser\Lexer
2021-10-27 19:25:02 +00:00
{
return $this -> container -> getService ( 'currentPhpVersionLexer' );
}
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createPHPStanParser () : \PHPStan\Parser\Parser
2021-10-27 19:25:02 +00:00
{
return $this -> container -> getService ( 'currentPhpVersionRichParser' );
}
2020-03-28 23:06:05 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createNodeScopeResolver () : \PHPStan\Analyser\NodeScopeResolver
2018-08-06 10:31:17 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \PHPStan\Analyser\NodeScopeResolver :: class );
2018-08-06 10:31:17 +00:00
}
2020-03-28 23:06:05 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createScopeFactory () : \PHPStan\Analyser\ScopeFactory
2018-08-06 10:31:17 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \PHPStan\Analyser\ScopeFactory :: class );
2018-08-06 10:31:17 +00:00
}
2020-04-01 01:55:44 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createDependencyResolver () : \PHPStan\Dependency\DependencyResolver
2020-04-01 01:55:44 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \PHPStan\Dependency\DependencyResolver :: class );
2020-04-01 01:55:44 +00:00
}
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createFileHelper () : \PHPStan\File\FileHelper
2020-04-01 01:55:44 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \PHPStan\File\FileHelper :: class );
2020-04-01 01:55:44 +00:00
}
2020-03-28 23:06:05 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createTypeNodeResolver () : \PHPStan\PhpDoc\TypeNodeResolver
2020-01-14 14:25:42 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \PHPStan\PhpDoc\TypeNodeResolver :: class );
2020-01-14 14:25:42 +00:00
}
2021-02-28 07:47:48 +00:00
/**
* @ api
*/
2022-06-06 17:12:56 +00:00
public function createDynamicSourceLocatorProvider () : \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider
2021-02-28 07:47:48 +00:00
{
2022-06-06 17:12:56 +00:00
return $this -> container -> getByType ( \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider :: class );
2021-02-28 07:47:48 +00:00
}
2021-10-04 21:24:17 +00:00
/**
* @ return string []
*/
private function resolveExtensionConfigs () : array
{
// same logic as in PHPStan for extension installed - https://github.com/phpstan/phpstan-src/blob/5956ec4f6cd09c8d7db9466ed4e7f25706f37a43/src/Command/CommandHelper.php#L195-L222
2022-06-06 17:12:56 +00:00
if ( ! \class_exists ( \PHPStan\ExtensionInstaller\GeneratedConfig :: class )) {
2021-10-04 21:24:17 +00:00
return [];
}
2022-06-06 17:12:56 +00:00
$reflectionClass = new \ReflectionClass ( \PHPStan\ExtensionInstaller\GeneratedConfig :: class );
2021-10-04 21:24:17 +00:00
$generatedConfigClassFileName = $reflectionClass -> getFileName ();
if ( $generatedConfigClassFileName === \false ) {
2022-06-06 17:12:56 +00:00
throw new \Rector\Core\Exception\ShouldNotHappenException ();
2021-10-04 21:24:17 +00:00
}
$generatedConfigDirectory = \dirname ( $generatedConfigClassFileName );
$extensionConfigFiles = [];
2022-06-06 17:12:56 +00:00
foreach ( \PHPStan\ExtensionInstaller\GeneratedConfig :: EXTENSIONS as $extension ) {
2021-10-04 21:24:17 +00:00
$fileNames = $extension [ 'extra' ][ 'includes' ] ? ? [];
foreach ( $fileNames as $fileName ) {
$configFilePath = $generatedConfigDirectory . '/' . $extension [ 'relative_install_path' ] . '/' . $fileName ;
if ( ! \file_exists ( $configFilePath )) {
continue ;
}
$extensionConfigFiles [] = $configFilePath ;
}
}
return $extensionConfigFiles ;
}
2018-08-06 10:31:17 +00:00
}