Skip to content

Commit 239291a

Browse files
committed
[BCB] PHPStanTestCase - TypeSpecifier extensions can no longer be provided by overriding methods from PHPStanTestCase. Use getAdditionalConfigFiles() instead.
1 parent f8ecb19 commit 239291a

7 files changed

+10
-180
lines changed

src/Testing/PHPStanTestCase.php

+4-109
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,23 @@
22

33
namespace PHPStan\Testing;
44

5-
use Composer\Autoload\ClassLoader;
6-
use PhpParser\PrettyPrinter\Standard;
75
use PHPStan\Analyser\DirectScopeFactory;
86
use PHPStan\Analyser\MutatingScope;
97
use PHPStan\Analyser\NodeScopeResolver;
108
use PHPStan\Analyser\ScopeFactory;
119
use PHPStan\Analyser\TypeSpecifier;
12-
use PHPStan\Analyser\TypeSpecifierFactory;
1310
use PHPStan\BetterReflection\Reflector\ClassReflector;
1411
use PHPStan\BetterReflection\Reflector\ConstantReflector;
1512
use PHPStan\BetterReflection\Reflector\FunctionReflector;
16-
use PHPStan\BetterReflection\SourceLocator\Ast\Locator;
17-
use PHPStan\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber;
18-
use PHPStan\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber;
19-
use PHPStan\BetterReflection\SourceLocator\Type\AggregateSourceLocator;
20-
use PHPStan\BetterReflection\SourceLocator\Type\EvaledCodeSourceLocator;
21-
use PHPStan\BetterReflection\SourceLocator\Type\MemoizingSourceLocator;
22-
use PHPStan\BetterReflection\SourceLocator\Type\PhpInternalSourceLocator;
2313
use PHPStan\DependencyInjection\Container;
2414
use PHPStan\DependencyInjection\ContainerFactory;
2515
use PHPStan\DependencyInjection\Reflection\ClassReflectionExtensionRegistryProvider;
2616
use PHPStan\DependencyInjection\Type\DynamicReturnTypeExtensionRegistryProvider;
2717
use PHPStan\DependencyInjection\Type\OperatorTypeSpecifyingExtensionRegistryProvider;
2818
use PHPStan\File\FileHelper;
2919
use PHPStan\Parser\CachedParser;
30-
use PHPStan\Parser\PhpParserDecorator;
3120
use PHPStan\PhpDoc\TypeNodeResolver;
3221
use PHPStan\PhpDoc\TypeStringResolver;
33-
use PHPStan\Reflection\BetterReflection\Reflector\MemoizingClassReflector;
34-
use PHPStan\Reflection\BetterReflection\Reflector\MemoizingConstantReflector;
35-
use PHPStan\Reflection\BetterReflection\Reflector\MemoizingFunctionReflector;
36-
use PHPStan\Reflection\BetterReflection\SourceLocator\AutoloadSourceLocator;
37-
use PHPStan\Reflection\BetterReflection\SourceLocator\ComposerJsonAndInstalledJsonSourceLocatorMaker;
38-
use PHPStan\Reflection\BetterReflection\SourceLocator\FileNodesFetcher;
3922
use PHPStan\Reflection\ReflectionProvider;
4023
use PHPStan\Rules\Properties\PropertyReflectionFinder;
4124
use PHPStan\Type\TypeAliasResolver;
@@ -50,12 +33,6 @@ abstract class PHPStanTestCase extends \PHPUnit\Framework\TestCase
5033
/** @var array<string, Container> */
5134
private static array $containers = [];
5235

53-
/** @var array{ClassReflector, FunctionReflector, ConstantReflector}|null */
54-
private static $reflectors;
55-
56-
/** @var PhpStormStubsSourceStubber|null */
57-
private static $phpStormStubsSourceStubber;
58-
5936
/** @api */
6037
public static function getContainer(): Container
6138
{
@@ -118,74 +95,16 @@ public function createReflectionProvider(): ReflectionProvider
11895
return self::getContainer()->getByType(ReflectionProvider::class);
11996
}
12097

121-
private static function getPhpStormStubsSourceStubber(): PhpStormStubsSourceStubber
122-
{
123-
if (self::$phpStormStubsSourceStubber === null) {
124-
self::$phpStormStubsSourceStubber = self::getContainer()->getByType(PhpStormStubsSourceStubber::class);
125-
}
126-
127-
return self::$phpStormStubsSourceStubber;
128-
}
129-
13098
/**
13199
* @return array{ClassReflector, FunctionReflector, ConstantReflector}
132100
*/
133101
public static function getReflectors(): array
134102
{
135-
if (self::$reflectors !== null) {
136-
return self::$reflectors;
137-
}
138-
139-
if (!class_exists(ClassLoader::class)) {
140-
self::fail('Composer ClassLoader is unknown');
141-
}
142-
143-
$classLoaderReflection = new \ReflectionClass(ClassLoader::class);
144-
if ($classLoaderReflection->getFileName() === false) {
145-
self::fail('Unknown ClassLoader filename');
146-
}
147-
148-
$composerProjectPath = dirname($classLoaderReflection->getFileName(), 3);
149-
if (!is_file($composerProjectPath . '/composer.json')) {
150-
self::fail(sprintf('composer.json not found in directory %s', $composerProjectPath));
151-
}
152-
153-
$composerJsonAndInstalledJsonSourceLocatorMaker = self::getContainer()->getByType(ComposerJsonAndInstalledJsonSourceLocatorMaker::class);
154-
$composerSourceLocator = $composerJsonAndInstalledJsonSourceLocatorMaker->create($composerProjectPath);
155-
if ($composerSourceLocator === null) {
156-
self::fail('Could not create composer source locator');
157-
}
158-
159-
// these need to be synced with TestCase-staticReflection.neon file and TestCaseSourceLocatorFactory
160-
161-
$locators = [
162-
$composerSourceLocator,
103+
return [
104+
self::getContainer()->getService('betterReflectionClassReflector'),
105+
self::getContainer()->getService('betterReflectionFunctionReflector'),
106+
self::getContainer()->getService('betterReflectionConstantReflector'),
163107
];
164-
165-
$phpParser = new PhpParserDecorator(self::getContainer()->getByType(CachedParser::class));
166-
167-
/** @var FunctionReflector $functionReflector */
168-
$functionReflector = null;
169-
$astLocator = new Locator($phpParser, static function () use (&$functionReflector): FunctionReflector {
170-
return $functionReflector;
171-
});
172-
$astPhp8Locator = new Locator(self::getContainer()->getService('php8PhpParser'), static function () use (&$functionReflector): FunctionReflector {
173-
return $functionReflector;
174-
});
175-
$reflectionSourceStubber = new ReflectionSourceStubber();
176-
$locators[] = new PhpInternalSourceLocator($astPhp8Locator, self::getPhpStormStubsSourceStubber());
177-
$locators[] = new AutoloadSourceLocator(self::getContainer()->getByType(FileNodesFetcher::class));
178-
$locators[] = new PhpInternalSourceLocator($astLocator, $reflectionSourceStubber);
179-
$locators[] = new EvaledCodeSourceLocator($astLocator, $reflectionSourceStubber);
180-
$sourceLocator = new MemoizingSourceLocator(new AggregateSourceLocator($locators));
181-
182-
$classReflector = new MemoizingClassReflector($sourceLocator);
183-
$functionReflector = new MemoizingFunctionReflector($sourceLocator, $classReflector);
184-
$constantReflector = new MemoizingConstantReflector($sourceLocator, $classReflector);
185-
186-
self::$reflectors = [$classReflector, $functionReflector, $constantReflector];
187-
188-
return self::$reflectors;
189108
}
190109

191110
public function getClassReflectionExtensionRegistryProvider(): ClassReflectionExtensionRegistryProvider
@@ -233,30 +152,6 @@ protected function shouldTreatPhpDocTypesAsCertain(): bool
233152
return true;
234153
}
235154

236-
/**
237-
* @param \PhpParser\PrettyPrinter\Standard $printer
238-
* @param \PHPStan\Reflection\ReflectionProvider $reflectionProvider
239-
* @param \PHPStan\Type\MethodTypeSpecifyingExtension[] $methodTypeSpecifyingExtensions
240-
* @param \PHPStan\Type\StaticMethodTypeSpecifyingExtension[] $staticMethodTypeSpecifyingExtensions
241-
* @return \PHPStan\Analyser\TypeSpecifier
242-
*/
243-
public function createTypeSpecifier(
244-
Standard $printer,
245-
ReflectionProvider $reflectionProvider,
246-
array $methodTypeSpecifyingExtensions = [],
247-
array $staticMethodTypeSpecifyingExtensions = []
248-
): TypeSpecifier
249-
{
250-
return new TypeSpecifier(
251-
$printer,
252-
$reflectionProvider,
253-
true,
254-
self::getContainer()->getServicesByTag(TypeSpecifierFactory::FUNCTION_TYPE_SPECIFYING_EXTENSION_TAG),
255-
array_merge($methodTypeSpecifyingExtensions, self::getContainer()->getServicesByTag(TypeSpecifierFactory::METHOD_TYPE_SPECIFYING_EXTENSION_TAG)),
256-
array_merge($staticMethodTypeSpecifyingExtensions, self::getContainer()->getServicesByTag(TypeSpecifierFactory::STATIC_METHOD_TYPE_SPECIFYING_EXTENSION_TAG))
257-
);
258-
}
259-
260155
public function getFileHelper(): FileHelper
261156
{
262157
return self::getContainer()->getByType(FileHelper::class);

src/Testing/RuleTestCase.php

+2-13
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,7 @@ abstract protected function getRule(): Rule;
3434

3535
protected function getTypeSpecifier(): TypeSpecifier
3636
{
37-
return $this->createTypeSpecifier(
38-
new \PhpParser\PrettyPrinter\Standard(),
39-
$this->createReflectionProvider(),
40-
$this->getMethodTypeSpecifyingExtensions(),
41-
$this->getStaticMethodTypeSpecifyingExtensions()
42-
);
37+
return self::getContainer()->getService('typeSpecifier');
4338
}
4439

4540
private function getAnalyser(): Analyser
@@ -50,13 +45,7 @@ private function getAnalyser(): Analyser
5045
]);
5146

5247
$broker = $this->createBroker();
53-
$printer = new \PhpParser\PrettyPrinter\Standard();
54-
$typeSpecifier = $this->createTypeSpecifier(
55-
$printer,
56-
$broker,
57-
$this->getMethodTypeSpecifyingExtensions(),
58-
$this->getStaticMethodTypeSpecifyingExtensions()
59-
);
48+
$typeSpecifier = $this->getTypeSpecifier();
6049
$nodeScopeResolver = new NodeScopeResolver(
6150
$broker,
6251
self::getReflectors()[0],

src/Testing/TypeInferenceTestCase.php

+1-6
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,16 @@ abstract class TypeInferenceTestCase extends \PHPStan\Testing\PHPStanTestCase
2525
/**
2626
* @param string $file
2727
* @param callable(\PhpParser\Node, \PHPStan\Analyser\Scope): void $callback
28-
* @param \PHPStan\Type\MethodTypeSpecifyingExtension[] $methodTypeSpecifyingExtensions
29-
* @param \PHPStan\Type\StaticMethodTypeSpecifyingExtension[] $staticMethodTypeSpecifyingExtensions
3028
* @param string[] $dynamicConstantNames
3129
*/
3230
public function processFile(
3331
string $file,
3432
callable $callback,
35-
array $methodTypeSpecifyingExtensions = [],
36-
array $staticMethodTypeSpecifyingExtensions = [],
3733
array $dynamicConstantNames = []
3834
): void
3935
{
40-
$printer = new \PhpParser\PrettyPrinter\Standard();
4136
$reflectionProvider = $this->createReflectionProvider();
42-
$typeSpecifier = $this->createTypeSpecifier($printer, $reflectionProvider, $methodTypeSpecifyingExtensions, $staticMethodTypeSpecifyingExtensions);
37+
$typeSpecifier = self::getContainer()->getService('typeSpecifier');
4338
$fileHelper = self::getContainer()->getByType(FileHelper::class);
4439
$resolver = new NodeScopeResolver(
4540
$reflectionProvider,

tests/PHPStan/Analyser/AnalyserTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ private function createAnalyser(bool $reportUnmatchedIgnoredErrors): \PHPStan\An
487487
$printer = new \PhpParser\PrettyPrinter\Standard();
488488
$fileHelper = $this->getFileHelper();
489489

490-
$typeSpecifier = $this->createTypeSpecifier($printer, $broker);
490+
$typeSpecifier = self::getContainer()->getService('typeSpecifier');
491491
$fileTypeMapper = self::getContainer()->getByType(FileTypeMapper::class);
492492
$phpDocInheritanceResolver = new PhpDocInheritanceResolver($fileTypeMapper);
493493

0 commit comments

Comments
 (0)