Skip to content

Commit

Permalink
Fix a test that would sometimes fail
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Jun 16, 2021
1 parent 93693f9 commit f0e112b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 45 deletions.
5 changes: 0 additions & 5 deletions build/baseline-7.4.neon
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,3 @@ parameters:
message: "#^Class PHPStan\\\\Reflection\\\\ReflectionProvider\\\\SetterReflectionProviderProvider has an uninitialized property \\$reflectionProvider\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/Reflection/ReflectionProvider/SetterReflectionProviderProvider.php

-
message: "#^Class class@anonymous/src/Testing/TestCase\\.php\\:\\d+ has an uninitialized property \\$reflectionProvider\\. Give it default value or assign it in the constructor\\.$#"
count: 1
path: ../src/Testing/TestCase.php
24 changes: 13 additions & 11 deletions src/Reflection/Php/PhpClassReflectionExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class PhpClassReflectionExtension

private bool $inferPrivatePropertyTypeFromConstructor;

private \PHPStan\Reflection\ReflectionProvider $reflectionProvider;
private ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider;

private FileTypeMapper $fileTypeMapper;

Expand Down Expand Up @@ -102,7 +102,7 @@ class PhpClassReflectionExtension
* @param \PHPStan\Reflection\SignatureMap\SignatureMapProvider $signatureMapProvider
* @param \PHPStan\Parser\Parser $parser
* @param \PHPStan\PhpDoc\StubPhpDocProvider $stubPhpDocProvider
* @param \PHPStan\Reflection\ReflectionProvider $reflectionProvider
* @param ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider
* @param FileTypeMapper $fileTypeMapper
* @param bool $inferPrivatePropertyTypeFromConstructor
* @param string[] $universalObjectCratesClasses
Expand All @@ -117,7 +117,7 @@ public function __construct(
SignatureMapProvider $signatureMapProvider,
Parser $parser,
StubPhpDocProvider $stubPhpDocProvider,
ReflectionProvider $reflectionProvider,
ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider,
FileTypeMapper $fileTypeMapper,
bool $inferPrivatePropertyTypeFromConstructor,
array $universalObjectCratesClasses
Expand All @@ -132,7 +132,7 @@ public function __construct(
$this->signatureMapProvider = $signatureMapProvider;
$this->parser = $parser;
$this->stubPhpDocProvider = $stubPhpDocProvider;
$this->reflectionProvider = $reflectionProvider;
$this->reflectionProviderProvider = $reflectionProviderProvider;
$this->fileTypeMapper = $fileTypeMapper;
$this->inferPrivatePropertyTypeFromConstructor = $inferPrivatePropertyTypeFromConstructor;
$this->universalObjectCratesClasses = $universalObjectCratesClasses;
Expand Down Expand Up @@ -319,10 +319,11 @@ private function createProperty(
}

$declaringTrait = null;
$reflectionProvider = $this->reflectionProviderProvider->getReflectionProvider();
if (
$declaringTraitName !== null && $this->reflectionProvider->hasClass($declaringTraitName)
$declaringTraitName !== null && $reflectionProvider->hasClass($declaringTraitName)
) {
$declaringTrait = $this->reflectionProvider->getClass($declaringTraitName);
$declaringTrait = $reflectionProvider->getClass($declaringTraitName);
}

return new PhpPropertyReflection(
Expand Down Expand Up @@ -369,7 +370,7 @@ public function hasNativeMethod(ClassReflection $classReflection, string $method
}

if ($methodName === '__get' && UniversalObjectCratesClassReflectionExtension::isUniversalObjectCrate(
$this->reflectionProvider,
$this->reflectionProviderProvider->getReflectionProvider(),
$this->universalObjectCratesClasses,
$classReflection
)) {
Expand All @@ -393,7 +394,7 @@ public function getNativeMethod(ClassReflection $classReflection, string $method
if (
$methodName !== '__get'
|| !UniversalObjectCratesClassReflectionExtension::isUniversalObjectCrate(
$this->reflectionProvider,
$this->reflectionProviderProvider->getReflectionProvider(),
$this->universalObjectCratesClasses,
$classReflection
)) {
Expand Down Expand Up @@ -554,7 +555,7 @@ private function createMethod(
$hasSideEffects = TrinaryLogic::createMaybe();
}
return new NativeMethodReflection(
$this->reflectionProvider,
$this->reflectionProviderProvider->getReflectionProvider(),
$declaringClass,
$methodReflection,
$variants,
Expand Down Expand Up @@ -597,10 +598,11 @@ private function createMethod(
}

$declaringTrait = null;
$reflectionProvider = $this->reflectionProviderProvider->getReflectionProvider();
if (
$declaringTraitName !== null && $this->reflectionProvider->hasClass($declaringTraitName)
$declaringTraitName !== null && $reflectionProvider->hasClass($declaringTraitName)
) {
$declaringTrait = $this->reflectionProvider->getClass($declaringTraitName);
$declaringTrait = $reflectionProvider->getClass($declaringTraitName);
}

$templateTypeMap = TemplateTypeMap::createEmpty();
Expand Down
57 changes: 28 additions & 29 deletions src/Testing/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -178,12 +178,16 @@ public function createBroker(
/** @api */
public function createReflectionProvider(): ReflectionProvider
{
$staticReflectionProvider = $this->createStaticReflectionProvider();
return $this->createReflectionProviderByParameters(
$this->createRuntimeReflectionProvider($staticReflectionProvider),
$setterReflectionProviderProvider = new ReflectionProvider\SetterReflectionProviderProvider();
$staticReflectionProvider = $this->createStaticReflectionProvider($setterReflectionProviderProvider);
$reflectionProvider = $this->createReflectionProviderByParameters(
$this->createRuntimeReflectionProvider($setterReflectionProviderProvider),
$staticReflectionProvider,
self::$useStaticReflectionProvider
);
$setterReflectionProviderProvider->setReflectionProvider($reflectionProvider);

return $reflectionProvider;
}

private function createReflectionProviderByParameters(
Expand All @@ -192,16 +196,13 @@ private function createReflectionProviderByParameters(
bool $disableRuntimeReflectionProvider
): ReflectionProvider
{
$setterReflectionProviderProvider = new ReflectionProvider\SetterReflectionProviderProvider();
$reflectionProviderFactory = new ReflectionProviderFactory(
$runtimeReflectionProvider,
$staticReflectionProvider,
$disableRuntimeReflectionProvider
);
$reflectionProvider = $reflectionProviderFactory->create();
$setterReflectionProviderProvider->setReflectionProvider($reflectionProvider);

return $reflectionProvider;
return $reflectionProviderFactory->create();
}

private static function getPhpStormStubsSourceStubber(): PhpStormStubsSourceStubber
Expand All @@ -213,7 +214,9 @@ private static function getPhpStormStubsSourceStubber(): PhpStormStubsSourceStub
return self::$phpStormStubsSourceStubber;
}

private function createRuntimeReflectionProvider(ReflectionProvider $actualReflectionProvider): ReflectionProvider
private function createRuntimeReflectionProvider(
ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider
): ReflectionProvider
{
$functionCallStatementFinder = new FunctionCallStatementFinder();
$parser = $this->getParser();
Expand All @@ -223,16 +226,15 @@ private function createRuntimeReflectionProvider(ReflectionProvider $actualRefle
$currentWorkingDirectory = $this->getCurrentWorkingDirectory();
$fileHelper = new FileHelper($currentWorkingDirectory);
$anonymousClassNameHelper = new AnonymousClassNameHelper(new FileHelper($currentWorkingDirectory), new SimpleRelativePathHelper($fileHelper->normalizePath($currentWorkingDirectory, '/')));
$setterReflectionProviderProvider = new ReflectionProvider\SetterReflectionProviderProvider();
$fileTypeMapper = new FileTypeMapper($setterReflectionProviderProvider, $parser, $phpDocStringResolver, $phpDocNodeResolver, $cache, $anonymousClassNameHelper);
$fileTypeMapper = new FileTypeMapper($reflectionProviderProvider, $parser, $phpDocStringResolver, $phpDocNodeResolver, $cache, $anonymousClassNameHelper);
$classReflectionExtensionRegistryProvider = $this->getClassReflectionExtensionRegistryProvider();
$functionReflectionFactory = $this->getFunctionReflectionFactory(
$functionCallStatementFinder,
$cache
);
$reflectionProvider = new ClassBlacklistReflectionProvider(
new RuntimeReflectionProvider(
$setterReflectionProviderProvider,
$reflectionProviderProvider,
$classReflectionExtensionRegistryProvider,
$functionReflectionFactory,
$fileTypeMapper,
Expand All @@ -250,8 +252,7 @@ private function createRuntimeReflectionProvider(ReflectionProvider $actualRefle
null
);
$this->setUpReflectionProvider(
$actualReflectionProvider,
$setterReflectionProviderProvider,
$reflectionProviderProvider,
$classReflectionExtensionRegistryProvider,
$functionCallStatementFinder,
$parser,
Expand All @@ -263,34 +264,35 @@ private function createRuntimeReflectionProvider(ReflectionProvider $actualRefle
}

private function setUpReflectionProvider(
ReflectionProvider $actualReflectionProvider,
ReflectionProvider\SetterReflectionProviderProvider $setterReflectionProviderProvider,
ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider,
DirectClassReflectionExtensionRegistryProvider $classReflectionExtensionRegistryProvider,
FunctionCallStatementFinder $functionCallStatementFinder,
\PHPStan\Parser\Parser $parser,
Cache $cache,
FileTypeMapper $fileTypeMapper
): void
{
$methodReflectionFactory = new class($parser, $functionCallStatementFinder, $cache) implements PhpMethodReflectionFactory {
$methodReflectionFactory = new class($parser, $functionCallStatementFinder, $cache, $reflectionProviderProvider) implements PhpMethodReflectionFactory {

private \PHPStan\Parser\Parser $parser;

private \PHPStan\Parser\FunctionCallStatementFinder $functionCallStatementFinder;

private \PHPStan\Cache\Cache $cache;

public ReflectionProvider $reflectionProvider;
private ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider;

public function __construct(
Parser $parser,
FunctionCallStatementFinder $functionCallStatementFinder,
Cache $cache
Cache $cache,
ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider
)
{
$this->parser = $parser;
$this->functionCallStatementFinder = $functionCallStatementFinder;
$this->cache = $cache;
$this->reflectionProviderProvider = $reflectionProviderProvider;
}

/**
Expand Down Expand Up @@ -329,7 +331,7 @@ public function create(
$declaringClass,
$declaringTrait,
$reflection,
$this->reflectionProvider,
$this->reflectionProviderProvider->getReflectionProvider(),
$this->parser,
$this->functionCallStatementFinder,
$this->cache,
Expand All @@ -351,8 +353,7 @@ public function create(
$annotationsMethodsClassReflectionExtension = new AnnotationsMethodsClassReflectionExtension();
$annotationsPropertiesClassReflectionExtension = new AnnotationsPropertiesClassReflectionExtension();
$signatureMapProvider = self::getContainer()->getByType(SignatureMapProvider::class);
$methodReflectionFactory->reflectionProvider = $actualReflectionProvider;
$phpExtension = new PhpClassReflectionExtension(self::getContainer()->getByType(ScopeFactory::class), self::getContainer()->getByType(NodeScopeResolver::class), $methodReflectionFactory, $phpDocInheritanceResolver, $annotationsMethodsClassReflectionExtension, $annotationsPropertiesClassReflectionExtension, $signatureMapProvider, $parser, self::getContainer()->getByType(StubPhpDocProvider::class), $actualReflectionProvider, $fileTypeMapper, true, []);
$phpExtension = new PhpClassReflectionExtension(self::getContainer()->getByType(ScopeFactory::class), self::getContainer()->getByType(NodeScopeResolver::class), $methodReflectionFactory, $phpDocInheritanceResolver, $annotationsMethodsClassReflectionExtension, $annotationsPropertiesClassReflectionExtension, $signatureMapProvider, $parser, self::getContainer()->getByType(StubPhpDocProvider::class), $reflectionProviderProvider, $fileTypeMapper, true, []);
$classReflectionExtensionRegistryProvider->addPropertiesClassReflectionExtension($phpExtension);
$classReflectionExtensionRegistryProvider->addPropertiesClassReflectionExtension(new UniversalObjectCratesClassReflectionExtension([\stdClass::class]));
$classReflectionExtensionRegistryProvider->addPropertiesClassReflectionExtension(new MixinPropertiesClassReflectionExtension([]));
Expand All @@ -362,11 +363,11 @@ public function create(
$classReflectionExtensionRegistryProvider->addMethodsClassReflectionExtension(new MixinMethodsClassReflectionExtension([]));
$classReflectionExtensionRegistryProvider->addMethodsClassReflectionExtension($annotationsMethodsClassReflectionExtension);
$classReflectionExtensionRegistryProvider->addMethodsClassReflectionExtension(new SoapClientMethodsClassReflectionExtension());

$setterReflectionProviderProvider->setReflectionProvider($actualReflectionProvider);
}

private function createStaticReflectionProvider(): ReflectionProvider
private function createStaticReflectionProvider(
ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider
): ReflectionProvider
{
$parser = $this->getParser();
$phpDocStringResolver = self::getContainer()->getByType(PhpDocStringResolver::class);
Expand All @@ -376,8 +377,7 @@ private function createStaticReflectionProvider(): ReflectionProvider
$fileHelper = new FileHelper($currentWorkingDirectory);
$relativePathHelper = new SimpleRelativePathHelper($currentWorkingDirectory);
$anonymousClassNameHelper = new AnonymousClassNameHelper($fileHelper, new SimpleRelativePathHelper($fileHelper->normalizePath($currentWorkingDirectory, '/')));
$setterReflectionProviderProvider = new ReflectionProvider\SetterReflectionProviderProvider();
$fileTypeMapper = new FileTypeMapper($setterReflectionProviderProvider, $parser, $phpDocStringResolver, $phpDocNodeResolver, $cache, $anonymousClassNameHelper);
$fileTypeMapper = new FileTypeMapper($reflectionProviderProvider, $parser, $phpDocStringResolver, $phpDocNodeResolver, $cache, $anonymousClassNameHelper);
$functionCallStatementFinder = new FunctionCallStatementFinder();
$functionReflectionFactory = $this->getFunctionReflectionFactory(
$functionCallStatementFinder,
Expand All @@ -389,7 +389,7 @@ private function createStaticReflectionProvider(): ReflectionProvider
$classReflectionExtensionRegistryProvider = $this->getClassReflectionExtensionRegistryProvider();

$reflectionProvider = new BetterReflectionProvider(
$setterReflectionProviderProvider,
$reflectionProviderProvider,
$classReflectionExtensionRegistryProvider,
$classReflector,
$fileTypeMapper,
Expand All @@ -407,8 +407,7 @@ private function createStaticReflectionProvider(): ReflectionProvider
);

$this->setUpReflectionProvider(
$reflectionProvider,
$setterReflectionProviderProvider,
$reflectionProviderProvider,
$classReflectionExtensionRegistryProvider,
$functionCallStatementFinder,
$parser,
Expand Down

0 comments on commit f0e112b

Please sign in to comment.