From b7019cece8099dd7f612cf8902aaf72189a4fbad Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Wed, 20 Dec 2017 03:20:38 +0100 Subject: [PATCH] do not reflect on invalid types --- .../src/Reflector/SmartClassReflector.php | 5 ++++ .../PropertyTypeResolver.php | 29 ++++++++++++++++++- .../src/NodeAnalyzer/DocBlockAnalyzer.php | 10 ++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/BetterReflection/src/Reflector/SmartClassReflector.php b/packages/BetterReflection/src/Reflector/SmartClassReflector.php index 914c79852d9..38564902508 100644 --- a/packages/BetterReflection/src/Reflector/SmartClassReflector.php +++ b/packages/BetterReflection/src/Reflector/SmartClassReflector.php @@ -42,6 +42,11 @@ final class SmartClassReflector public function reflect(string $className): ?ReflectionClass { + // invalid class types + if (in_array($className, ['self', 'null', 'array', 'string', 'bool'])) { + return null; + } + try { if ($this->shouldCreateNewClassReflector()) { $this->createNewClassReflector(); diff --git a/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php b/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php index a3736b8053e..e01d5724369 100644 --- a/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php +++ b/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php @@ -12,6 +12,11 @@ use Rector\ReflectionDocBlock\NodeAnalyzer\DocBlockAnalyzer; final class PropertyTypeResolver implements PerNodeTypeResolverInterface { + /** + * @var string[] + */ + private $scalarTypes = ['string', 'bool', 'array', 'int', 'resource', 'iterable', 'callable', 'object']; + /** * @var TypeContext */ @@ -58,10 +63,11 @@ final class PropertyTypeResolver implements PerNodeTypeResolverInterface } $propertyTypes = $this->docBlockAnalyzer->getVarTypes($propertyNode); - if ($propertyTypes === null) { + if ($propertyTypes === null || $propertyTypes === ['string']) { return []; } + $propertyTypes = $this->filterOutScalarTypes($propertyTypes); $propertyTypes = $this->addParentClasses($propertyTypes); $this->typeContext->addPropertyTypes($propertyName, $propertyTypes); @@ -85,4 +91,25 @@ final class PropertyTypeResolver implements PerNodeTypeResolverInterface return array_values(array_unique($propertyTypes)); } + + /** + * @param string[] $propertyTypes + * @return string[] + */ + private function filterOutScalarTypes(array $propertyTypes): array + { + foreach ($propertyTypes as $key => $type) { + if (! in_array($type, $this->scalarTypes, true)) { + continue; + } + + unset($propertyTypes[$key]); + } + + if ($propertyTypes === ['null']) { + return []; + } + + return $propertyTypes; + } } diff --git a/packages/ReflectionDocBlock/src/NodeAnalyzer/DocBlockAnalyzer.php b/packages/ReflectionDocBlock/src/NodeAnalyzer/DocBlockAnalyzer.php index 00f313b596c..51a0d1e809b 100644 --- a/packages/ReflectionDocBlock/src/NodeAnalyzer/DocBlockAnalyzer.php +++ b/packages/ReflectionDocBlock/src/NodeAnalyzer/DocBlockAnalyzer.php @@ -166,9 +166,17 @@ final class DocBlockAnalyzer */ private function normalizeTypes(array $types): array { - return array_map(function (string $type) { + // remove preslash: {\]SomeClass + $types = array_map(function (string $type) { return ltrim(trim($type), '\\'); }, $types); + + // remove arrays: Type{[][][]} + $types = array_map(function (string $type) { + return rtrim($type, '[]'); + }, $types); + + return $types; } /**