Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .github/workflows/phpstan.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ jobs:
tools: cs2pr
- run: composer install --no-progress
# turn the phpstan errors (formatted in checkstyle-format) into github pull request check annotations
- run: composer phpstan -- --error-format=checkstyle | cs2pr
- run: composer phpstan # -- --error-format=checkstyle | cs2pr
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Disabled because it kept breaking the builds

2 changes: 1 addition & 1 deletion compiler/build/scoper.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

foreach ($stubFinder->getIterator() as $fileInfo) {
// mirrors https://github.com/phpstan/phpstan-src/commit/04f777bc4445725d17dac65c989400485454b145
if ($file->getPathName() === '../../vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php') {
if ($fileInfo->getPathName() === '../../vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php') {
continue;
}

Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@
"Rector\\Symfony\\": "packages/symfony/src",
"Rector\\Twig\\": "packages/twig/src",
"Rector\\TypeDeclaration\\": "packages/type-declaration/src",
"Rector\\VendorLocker\\": "packages/vendor-locker/src",
"Rector\\ZendToSymfony\\": "packages/zend-to-symfony/src",
"Rector\\RectorGenerator\\": "packages/rector-generator/src",
"Rector\\StrictCodeQuality\\": "packages/strict-code-quality/src",
Expand Down
7 changes: 4 additions & 3 deletions docs/AllRectorsOverview.md
Original file line number Diff line number Diff line change
Expand Up @@ -4512,7 +4512,9 @@ services:

```diff
class SomeServiceTest extends \PHPUnit\Framework\TestCase
use PHPUnit\Framework\TestCase;

class SomeServiceTest extends TestCase
{
- public function test()
+ /**
Expand Down Expand Up @@ -8781,12 +8783,11 @@ Change $this->_view->assign = 5; to $this->render("...", $templateData);
public function someAction()
{
- $this->_view->value = 5;
-}
+ $templateData = [];
+ $templateData['value']; = 5;
+
+ return $this->render("...", $templateData);
+}
}
```

<br>
Expand Down
66 changes: 12 additions & 54 deletions ecs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,61 +73,19 @@ parameters:
# hidden API
- 'src/Rector/AbstractRector.php'

# @todo resolve!!!
Symplify\CodingStandard\Sniffs\CleanCode\CognitiveComplexitySniff:
- 'src/NodeContainer/NodeCollector/ParsedFunctionLikeNodesByType.php'
- 'src/NodeContainer/NodeCollector/ParsedFunctionLikeNodeCollector.php'
- 'packages/solid/src/Rector/ClassConst/PrivatizeLocalClassConstantRector.php'
- 'packages/type-declaration/src/TypeInferer/PropertyTypeInferer/ConstructorPropertyTypeInferer.php'
- 'packages/node-type-resolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php'
- 'packages/minimal-scope/src/Rector/Class_/ChangeLocalPropertyToVariableRector.php'
- 'packages/coding-style/src/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.php'
# solve later
- 'src/Console/Command/ScreenFileCommand.php'
- 'packages/doctrine/src/Rector/ClassMethod/AddMethodCallBasedParamTypeRector.php'
- 'packages/type-declaration/src/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInferer.php'
- 'packages/node-type-resolver/src/NodeTypeResolver.php'
- 'packages/node-type-resolver/src/PerNodeTypeResolver/VariableTypeResolver.php'
- 'packages/php-71/src/Rector/FuncCall/RemoveExtraParametersRector.php'
- 'packages/solid/src/Analyzer/ClassConstantFetchAnalyzer.php'
# tough logic
- 'packages/autodiscovery/src/Analyzer/ClassAnalyzer.php'
- 'packages/coding-style/src/Imports/ImportSkipper.php'
- 'packages/phpunit/src/Rector/Class_/ArrayArgumentInTestToDataProviderRector.php'
- 'packages/better-php-doc-parser/src/Ast/PhpDoc/*/*TagValueNode.php'
- 'packages/node-type-resolver/src/PhpDoc/NodeAnalyzer/FqnNamePhpDocNodeDecorator.php'
- 'packages/node-type-resolver/src/PHPStan/Type/StaticTypeAnalyzer.php'
- 'src/NodeContainer/ParsedNodesByType.php'

- 'packages/phpstan-static-type-mapper/src/PHPStanStaticTypeMapper.php'
- 'packages/node-type-resolver/src/StaticTypeMapper.php'

- 'packages/phpstan/src/Rector/Node/RemoveNonExistingVarAnnotationRector.php'
- 'packages/architecture/src/Rector/Class_/ConstructorInjectionToActionInjectionRector.php'
- 'src/PhpParser/Node/Commander/NodeRemovingCommander.php'
- 'packages/better-php-doc-parser/src/*'
- 'packages/symfony/src/Rector/Class_/MakeCommandLazyRector.php'
- 'packages/legacy/src/Rector/ClassMethod/ChangeSingletonToServiceRector.php'
- 'packages/coding-style/src/Rector/Use_/RemoveUnusedAliasRector.php'
- 'packages/nette-to-symfony/src/Route/RouteInfoFactory.php'
- 'utils/*/DumpNodesCommand.php'
- 'packages/code-quality/src/Rector/Identical/SimplifyBoolIdenticalTrueRector.php'
- 'packages/better-php-doc-parser/src/Attributes/Ast/AttributeAwareNodeFactory.php'
- 'packages/laravel/src/Rector/FuncCall/HelperFunctionToConstructorInjectionRector.php'
- 'packages/php-spec-to-phpunit/src/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php'
- 'packages/nette-tester-to-phpunit/src/AssertManipulator.php'
- 'packages/legacy/src/NodeAnalyzer/SingletonClassMethodAnalyzer.php'
- 'src/Rector/Psr4/MultipleClassFileToPsr4ClassesRector.php'
- 'src/PhpParser/Node/Resolver/NameResolver.php'
- 'src/Rector/MethodBody/NormalToFluentRector.php'
- 'src/Rector/AbstractRector/ComplexRemovalTrait.php'
- 'src/PhpParser/Node/Manipulator/IfManipulator.php'
- 'packages/type-declaration/src/VendorLock/VendorLockResolver.php'
- 'packages/type-declaration/src/PhpParserTypeAnalyzer.php'
- 'packages/dead-code/src/Rector/ClassMethod/RemoveDelegatingParentCallRector.php'
# aliases
- 'packages/coding-style/src/Rector/Namespace_/ImportFullyQualifiedNamesRector.php'

# todo
- "packages/node-type-resolver/src/NodeTypeResolver.php"
- "packages/better-php-doc-parser/src/Printer/OriginalSpacingRestorer.php"
# @todo split to multiple rectors
- "packages/php-spec-to-phpunit/src/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php"

- "packages/better-php-doc-parser/src/PhpDocNode/Doctrine/Property_/ColumnTagValueNode.php"
- "packages/better-php-doc-parser/src/PhpDocNode/Doctrine/Property_/JoinColumnTagValueNode.php"
- "packages/coding-style/src/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.php"

# per node logic
- 'utils/DocumentationGenerator/src/Command/DumpNodesCommand.php'
# copied 3rd party logic
- 'packages/php-70/src/EregToPcreTransformer.php'
# dev
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,22 +112,13 @@ public function refactor(Node $node): ?Node
{
$this->reset();

// only in controllers
if (! $this->isName($node, '*Controller')) {
return null;
}

if ($node->isAbstract()) {
return null;
}

$constructMethod = $node->getMethod('__construct');
// no constructor, nothing to do
if ($constructMethod === null) {
if ($this->shouldSkip($node)) {
return null;
}

// traverse constructor dependencies and names of their properties
/** @var ClassMethod $constructMethod */
$constructMethod = $node->getMethod('__construct');
$this->collectPropertyFetchToParams($constructMethod);

// replace them in property fetches with particular class methods and use variable instead
Expand Down Expand Up @@ -220,23 +211,20 @@ private function changePropertyUsageToParameter(ClassMethod $classMethod, string
$param,
&$currentlyAddedLocalVariables
): ?Variable {
if (! $node instanceof PropertyFetch) {
if ($this->shouldSkipClassMethod($node)) {
return null;
}

if (! $this->isName($node->var, 'this')) {
/** @var PropertyFetch $node */
if (! $this->isName($node, $propertyName)) {
return null;
}

if ($this->isName($node, $propertyName)) {
$currentlyAddedLocalVariables[] = $param;
$currentlyAddedLocalVariables[] = $param;

/** @var string $paramName */
$paramName = $this->getName($param);
return new Variable($paramName);
}

return null;
/** @var string $paramName */
$paramName = $this->getName($param);
return new Variable($paramName);
});

foreach ($currentlyAddedLocalVariables as $param) {
Expand Down Expand Up @@ -330,4 +318,30 @@ private function removeConstructIfEmpty(Class_ $class, ClassMethod $constructCla

$this->removeNodeFromStatements($class, $constructClassMethod);
}

private function shouldSkipClassMethod(Node $node): bool
{
if (! $node instanceof PropertyFetch) {
return true;
}

return ! $this->isName($node->var, 'this');
}

private function shouldSkip(Class_ $class): bool
{
// only in controllers
if (! $this->isName($class, '*Controller')) {
return true;
}

if ($class->isAbstract()) {
return true;
}

$constructMethod = $class->getMethod('__construct');
// no constructor, nothing to do

return $constructMethod === null;
}
}
36 changes: 21 additions & 15 deletions packages/autodiscovery/src/Analyzer/ClassAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocNode\JMS\SerializerTypeTagValueNode;
use Rector\Core\NodeContainer\NodeCollector\ParsedNodeCollector;
use Rector\Core\PhpParser\Node\Resolver\NameResolver;
use Rector\Core\PhpParser\Node\Resolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\NodeTypeResolver;

Expand All @@ -22,9 +22,9 @@ final class ClassAnalyzer
private $valueObjectStatusByClassName = [];

/**
* @var NameResolver
* @var NodeNameResolver
*/
private $nameResolver;
private $nodeNameResolver;

/**
* @var NodeTypeResolver
Expand All @@ -37,11 +37,11 @@ final class ClassAnalyzer
private $parsedNodeCollector;

public function __construct(
NameResolver $nameResolver,
NodeNameResolver $nodeNameResolver,
ParsedNodeCollector $parsedNodeCollector,
NodeTypeResolver $nodeTypeResolver
) {
$this->nameResolver = $nameResolver;
$this->nodeNameResolver = $nodeNameResolver;
$this->parsedNodeCollector = $parsedNodeCollector;
$this->nodeTypeResolver = $nodeTypeResolver;
}
Expand All @@ -52,7 +52,8 @@ public function isValueObjectClass(Class_ $class): bool
return false;
}

$className = $this->nameResolver->getName($class);
/** @var string $className */
$className = $this->nodeNameResolver->getName($class);

if (isset($this->valueObjectStatusByClassName[$className])) {
return $this->valueObjectStatusByClassName[$className];
Expand All @@ -61,15 +62,7 @@ public function isValueObjectClass(Class_ $class): bool
$constructClassMethod = $class->getMethod('__construct');

if ($constructClassMethod === null) {
// A. has all properties with serialize?
if ($this->hasAllPropertiesWithSerialize($class)) {
$this->valueObjectStatusByClassName[$className] = true;
return true;
}

// probably not a value object
$this->valueObjectStatusByClassName[$className] = false;
return false;
return $this->analyseWithoutConstructor($class, $className);
}

// resolve constructor types
Expand Down Expand Up @@ -116,4 +109,17 @@ private function hasAllPropertiesWithSerialize(Class_ $class)

return true;
}

private function analyseWithoutConstructor(Class_ $class, ?string $className): bool
{
// A. has all properties with serialize?
if ($this->hasAllPropertiesWithSerialize($class)) {
$this->valueObjectStatusByClassName[$className] = true;
return true;
}

// probably not a value object
$this->valueObjectStatusByClassName[$className] = false;
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use Rector\Core\PhpParser\Node\Resolver\NameResolver;
use Rector\Core\PhpParser\Node\Resolver\NodeNameResolver;
use Rector\NodeTypeResolver\ClassExistenceStaticHelper;
use Rector\NodeTypeResolver\Node\AttributeKey;
use ReflectionClass;
Expand All @@ -25,14 +25,14 @@ final class NodeAnnotationReader
private $reader;

/**
* @var NameResolver
* @var NodeNameResolver
*/
private $nameResolver;
private $nodeNameResolver;

public function __construct(Reader $reader, NameResolver $nameResolver)
public function __construct(Reader $reader, NodeNameResolver $nodeNameResolver)
{
$this->reader = $reader;
$this->nameResolver = $nameResolver;
$this->nodeNameResolver = $nodeNameResolver;
}

/**
Expand All @@ -44,7 +44,7 @@ public function readMethodAnnotation(ClassMethod $classMethod, string $annotatio
$className = $classMethod->getAttribute(AttributeKey::CLASS_NAME);

/** @var string $methodName */
$methodName = $this->nameResolver->getName($classMethod);
$methodName = $this->nodeNameResolver->getName($classMethod);

$reflectionMethod = new ReflectionMethod($className, $methodName);

Expand Down Expand Up @@ -82,15 +82,15 @@ public function readPropertyAnnotation(Property $property, string $annotationCla
private function createClassReflectionFromNode(Class_ $class): ReflectionClass
{
/** @var string $className */
$className = $this->nameResolver->getName($class);
$className = $this->nodeNameResolver->getName($class);

return new ReflectionClass($className);
}

private function createPropertyReflectionFromPropertyNode(Property $property): ?ReflectionProperty
{
/** @var string $propertyName */
$propertyName = $this->nameResolver->getName($property);
$propertyName = $this->nodeNameResolver->getName($property);

/** @var string|null $className */
$className = $property->getAttribute(AttributeKey::CLASS_NAME);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,20 +113,20 @@ public function __toString(): string
$contentItems['scale'] = sprintf('scale=%s', $this->scale);
}

if ($this->unique !== null) {
$contentItems['unique'] = sprintf('unique=%s', $this->unique ? 'true' : 'false');
}

if ($this->nullable !== null) {
$contentItems['nullable'] = sprintf('nullable=%s', $this->nullable ? 'true' : 'false');
if ($this->columnDefinition !== null) {
$contentItems['columnDefinition'] = sprintf('columnDefinition="%s"', $this->columnDefinition);
}

if ($this->options) {
$contentItems['options'] = $this->printArrayItem($this->options, 'options');
}

if ($this->columnDefinition !== null) {
$contentItems['columnDefinition'] = sprintf('columnDefinition="%s"', $this->columnDefinition);
if ($this->unique !== null) {
$contentItems['unique'] = sprintf('unique=%s', $this->unique ? 'true' : 'false');
}

if ($this->nullable !== null) {
$contentItems['nullable'] = sprintf('nullable=%s', $this->nullable ? 'true' : 'false');
}

return $this->printContentItems($contentItems);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,17 +119,6 @@ public function __toString(): string
return $this->printContentItems($contentItems);
}

public function changeNullable(bool $nullable): void
{
$this->nullable = $nullable;
}

public function changeReferencedColumnName(string $referencedColumnName): void
{
$this->orderedVisibleItems[] = 'referencedColumnName';
$this->referencedColumnName = $referencedColumnName;
}

public function isNullable(): ?bool
{
return $this->nullable;
Expand Down
Loading