Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions build/baseline-pre-8.0.neon
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ parameters:
count: 2
path: PHPStan/Build/TurboAttributeCollector.php

-
rawMessage: 'Call to an undefined method ReflectionClass<object>::getAttributes().'
identifier: method.notFound
count: 1
path: ../src/DependencyInjection/AutowiredServiceDiscoverer.php

-
rawMessage: 'Call to an undefined method ReflectionParameter::getAttributes().'
identifier: method.notFound
count: 1
path: ../src/DependencyInjection/AutowiredServiceDiscoverer.php

-
rawMessage: 'Call to an undefined method ReflectionClass::isReadOnly().'
identifier: method.notFound
Expand Down
1 change: 1 addition & 0 deletions conf/config.neon
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ parameters:
mixinExcludeClasses: []
scanFiles: []
scanDirectories: []
autowiredServiceDirectories: []
parallel:
jobSize: 20
processTimeout: 600.0
Expand Down
2 changes: 2 additions & 0 deletions conf/parametersSchema.neon
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ parametersSchema:
mixinExcludeClasses: listOf(string())
scanFiles: listOf(string())
scanDirectories: listOf(string())
autowiredServiceDirectories: listOf(string())
editorUrl: schema(string(), nullable())
editorUrlTitle: schema(string(), nullable())
errorFormat: schema(string(), nullable())
Expand Down Expand Up @@ -224,6 +225,7 @@ expandRelativePaths:
- '[parameters][bootstrapFiles][]'
- '[parameters][scanFiles][]'
- '[parameters][scanDirectories][]'
- '[parameters][autowiredServiceDirectories][]'
- '[parameters][tmpDir]'
- '[parameters][pro][tmpDir]'
- '[parameters][memoryLimitFile]'
Expand Down
2 changes: 1 addition & 1 deletion phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ parameters:
-
rawMessage: 'Call to static method expand() of internal class Nette\DI\Helpers from outside its root namespace Nette.'
identifier: staticMethod.internalClass
count: 1
count: 2
path: src/DependencyInjection/ContainerFactory.php

-
Expand Down
21 changes: 14 additions & 7 deletions src/DependencyInjection/AutowiredAttributeServicesExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use ReflectionClass;
use stdClass;
use function array_key_exists;
use function array_merge;
use function array_slice;
use function count;
use function explode;
Expand Down Expand Up @@ -51,8 +52,12 @@ public function loadConfiguration(): void
{
require_once __DIR__ . '/../../vendor/attributes.php';
$builder = $this->getContainerBuilder();
$discoverer = AutowiredServiceDiscoverer::createFromContainerBuilder($builder);

$autowiredParameters = Attributes::findTargetMethodParameters(AutowiredParameter::class);
$autowiredParameters = array_merge(
Attributes::findTargetMethodParameters(AutowiredParameter::class),
$discoverer->findTargetMethodParameters(AutowiredParameter::class),
);
$constructorParameters = [];
foreach ($autowiredParameters as $parameter) {
if (strcasecmp($parameter->method, '__construct') !== 0) {
Expand All @@ -63,7 +68,9 @@ public function loadConfiguration(): void
$constructorParameters[$lowerClass][] = $parameter;
}

foreach (Attributes::findTargetClasses(AutowiredService::class) as $class) {
$interfaceTagMapping = ValidateServiceTagsExtension::getInterfaceTagMapping($builder);

foreach (array_merge(Attributes::findTargetClasses(AutowiredService::class), $discoverer->findTargetClasses(AutowiredService::class)) as $class) {
$reflection = new ReflectionClass($class->name);
$attribute = $class->attribute;

Expand All @@ -82,7 +89,7 @@ public function loadConfiguration(): void
continue;
}

foreach (ValidateServiceTagsExtension::getInterfaceTagMapping() as $interface => $tag) {
foreach ($interfaceTagMapping as $interface => $tag) {
if (!$reflection->implementsInterface($interface)) {
continue;
}
Expand All @@ -91,7 +98,7 @@ public function loadConfiguration(): void
}
}

foreach (Attributes::findTargetClasses(NonAutowiredService::class) as $class) {
foreach (array_merge(Attributes::findTargetClasses(NonAutowiredService::class), $discoverer->findTargetClasses(NonAutowiredService::class)) as $class) {
$attribute = $class->attribute;

$definition = $builder->addDefinition($attribute->name)
Expand All @@ -106,7 +113,7 @@ public function loadConfiguration(): void
self::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
}

foreach (Attributes::findTargetClasses(GenerateFactory::class) as $class) {
foreach (array_merge(Attributes::findTargetClasses(GenerateFactory::class), $discoverer->findTargetClasses(GenerateFactory::class)) as $class) {
$attribute = $class->attribute;
$definition = $builder->addFactoryDefinition(null)
->setImplement($attribute->interface);
Expand All @@ -125,7 +132,7 @@ public function loadConfiguration(): void
return;
}

foreach (Attributes::findTargetClasses(RegisteredRule::class) as $class) {
foreach (array_merge(Attributes::findTargetClasses(RegisteredRule::class), $discoverer->findTargetClasses(RegisteredRule::class)) as $class) {
$attribute = $class->attribute;
if ($attribute->level > $config->level) {
continue;
Expand All @@ -139,7 +146,7 @@ public function loadConfiguration(): void
self::processConstructorParameters($builder, $class->name, $definition, $constructorParameters);
}

foreach (Attributes::findTargetClasses(RegisteredCollector::class) as $class) {
foreach (array_merge(Attributes::findTargetClasses(RegisteredCollector::class), $discoverer->findTargetClasses(RegisteredCollector::class)) as $class) {
$attribute = $class->attribute;
if ($attribute->level > $config->level) {
continue;
Expand Down
5 changes: 5 additions & 0 deletions src/DependencyInjection/AutowiredExtensions.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
*
* Works thanks to https://github.com/ondrejmirtes/composer-attribute-collector
* and AutowiredExtensionsExtension.
*
* Extensions distributed outside phpstan-src list the directories to look for
* this attribute in through the `autowiredServiceDirectories` parameter.
*
* @api
*/
#[Attribute(flags: Attribute::TARGET_PARAMETER)]
final class AutowiredExtensions
Expand Down
11 changes: 8 additions & 3 deletions src/DependencyInjection/AutowiredExtensionsExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use ReflectionMethod;
use ReflectionNamedType;
use function array_key_exists;
use function array_merge;
use function is_string;
use function sprintf;
use function str_replace;
Expand Down Expand Up @@ -40,7 +41,7 @@ public static function getCollectionServiceName(string $extensionInterfaceName):
public function loadConfiguration(): void
{
$builder = $this->getContainerBuilder();
foreach (ValidateServiceTagsExtension::getInterfaceTagMapping() as $interface => $tag) {
foreach (ValidateServiceTagsExtension::getInterfaceTagMapping($builder) as $interface => $tag) {
$builder->addDefinition(self::getCollectionServiceName($interface))
->setType(LazyExtensionsCollection::class)
->setArgument('tagName', $tag)
Expand All @@ -53,10 +54,14 @@ public function beforeCompile(): void
{
require_once __DIR__ . '/../../vendor/attributes.php';
$builder = $this->getContainerBuilder();
$mapping = ValidateServiceTagsExtension::getInterfaceTagMapping();
$mapping = ValidateServiceTagsExtension::getInterfaceTagMapping($builder);

$parametersByClass = [];
foreach (Attributes::findTargetMethodParameters(AutowiredExtensions::class) as $parameter) {
$autowiredExtensions = array_merge(
Attributes::findTargetMethodParameters(AutowiredExtensions::class),
AutowiredServiceDiscoverer::createFromContainerBuilder($builder)->findTargetMethodParameters(AutowiredExtensions::class),
);
foreach ($autowiredExtensions as $parameter) {
if (strcasecmp($parameter->method, '__construct') !== 0) {
throw new ShouldNotHappenException(sprintf('Attribute #[AutowiredExtensions] is only supported on constructor parameters, found on %s::%s() $%s.', $parameter->class, $parameter->method, $parameter->name));
}
Expand Down
5 changes: 5 additions & 0 deletions src/DependencyInjection/AutowiredParameter.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
*
* Works thanks to https://github.com/ondrejmirtes/composer-attribute-collector
* and AutowiredAttributeServicesExtension.
*
* Extensions distributed outside phpstan-src list the directories to look for
* this attribute in through the `autowiredServiceDirectories` parameter.
*
* @api
*/
#[Attribute(flags: Attribute::TARGET_PARAMETER)]
final class AutowiredParameter
Expand Down
5 changes: 5 additions & 0 deletions src/DependencyInjection/AutowiredService.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@
*
* Works thanks to https://github.com/ondrejmirtes/composer-attribute-collector
* and AutowiredAttributeServicesExtension.
*
* Extensions distributed outside phpstan-src list the directories to look for
* this attribute in through the `autowiredServiceDirectories` parameter.
*
* @api
*/
#[Attribute(flags: Attribute::TARGET_CLASS)]
final class AutowiredService
Expand Down
Loading
Loading