Fix analysed files for PHPStan scope resolver (#1817)

Fix analysed files for PHPStan scope resolver
This commit is contained in:
Tomáš Votruba 2019-08-06 09:20:11 +02:00 committed by GitHub
commit e5c0c5df03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 23 deletions

View File

@ -3857,7 +3857,7 @@ services:
- class: `Rector\Php\Rector\FuncCall\PregReplaceEModifierRector`
The /e modifier is no longer supported, use preg_replace_callback instead
The /e modifier is no longer supported, use preg_replace_callback instead
```diff
class SomeClass

View File

@ -917,7 +917,7 @@ if (true) {
```php
?>
<strong>feel</strong><?php
<strong>feel</strong><?php
```
<br>

View File

@ -13,7 +13,6 @@ use Rector\NodeTypeResolver\NodeVisitor\NamespaceNodeVisitor;
use Rector\NodeTypeResolver\NodeVisitor\NodeCollectorNodeVisitor;
use Rector\NodeTypeResolver\NodeVisitor\ParentAndNextNodeVisitor;
use Rector\NodeTypeResolver\PHPStan\Scope\NodeScopeResolver;
use Rector\PhpParser\Node\BetterNodeFinder;
final class NodeScopeAndMetadataDecorator
{
@ -57,11 +56,6 @@ final class NodeScopeAndMetadataDecorator
*/
private $nodeCollectorNodeVisitor;
/**
* @var BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(
NodeScopeResolver $nodeScopeResolver,
ParentAndNextNodeVisitor $parentAndNextNodeVisitor,
@ -70,8 +64,7 @@ final class NodeScopeAndMetadataDecorator
NamespaceNodeVisitor $namespaceNodeVisitor,
ExpressionNodeVisitor $expressionNodeVisitor,
FileInfoNodeVisitor $fileInfoNodeVisitor,
NodeCollectorNodeVisitor $nodeCollectorNodeVisitor,
BetterNodeFinder $betterNodeFinder
NodeCollectorNodeVisitor $nodeCollectorNodeVisitor
) {
$this->nodeScopeResolver = $nodeScopeResolver;
$this->parentAndNextNodeVisitor = $parentAndNextNodeVisitor;
@ -81,7 +74,6 @@ final class NodeScopeAndMetadataDecorator
$this->expressionNodeVisitor = $expressionNodeVisitor;
$this->fileInfoNodeVisitor = $fileInfoNodeVisitor;
$this->nodeCollectorNodeVisitor = $nodeCollectorNodeVisitor;
$this->betterNodeFinder = $betterNodeFinder;
}
/**
@ -97,15 +89,6 @@ final class NodeScopeAndMetadataDecorator
]));
$nodes = $nodeTraverser->traverse($nodes);
// dual run of these is conflicting with anonymous classes, e.g. in \Rector\DeadCode\Rector\ClassMethod\RemoveUnusedParameterRector; solve later
if ($this->betterNodeFinder->findFirstInstanceOf($nodes, Node\Stmt\Trait_::class)) {
// needed for trait scoping
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor($this->namespaceNodeVisitor);
$nodeTraverser->addVisitor($this->classAndMethodNodeVisitor);
$nodes = $nodeTraverser->traverse($nodes);
}
$nodes = $this->nodeScopeResolver->processNodes($nodes, $filePath);
$nodeTraverser = new NodeTraverser();

View File

@ -400,7 +400,6 @@ final class NodeTypeResolver
{
// nodes that cannot be resolver by PHPStan
$nodeClass = get_class($node);
if (isset($this->perNodeTypeResolvers[$nodeClass])) {
return $this->perNodeTypeResolvers[$nodeClass]->resolve($node);
}

View File

@ -69,7 +69,6 @@ final class NodeScopeResolver
{
$this->removeDeepChainMethodCallNodes($nodes);
$this->phpStanNodeScopeResolver->setAnalysedFiles([$filePath]);
$scope = $this->scopeFactory->createFromFile($filePath);
// skip chain method calls, performance issue: https://github.com/phpstan/phpstan/issues/254

View File

@ -3,6 +3,7 @@
namespace Rector\Application;
use PHPStan\AnalysedCodeException;
use PHPStan\Analyser\NodeScopeResolver;
use Rector\Application\FileSystem\RemovedAndAddedFilesCollector;
use Rector\Application\FileSystem\RemovedAndAddedFilesProcessor;
use Rector\Configuration\Configuration;
@ -68,6 +69,11 @@ final class RectorApplication
*/
private $enabledRectorsProvider;
/**
* @var NodeScopeResolver
*/
private $nodeScopeResolver;
public function __construct(
SymfonyStyle $symfonyStyle,
FileSystemFileProcessor $fileSystemFileProcessor,
@ -76,7 +82,8 @@ final class RectorApplication
FileProcessor $fileProcessor,
EnabledRectorsProvider $enabledRectorsProvider,
RemovedAndAddedFilesCollector $removedAndAddedFilesCollector,
RemovedAndAddedFilesProcessor $removedAndAddedFilesProcessor
RemovedAndAddedFilesProcessor $removedAndAddedFilesProcessor,
NodeScopeResolver $nodeScopeResolver
) {
$this->symfonyStyle = $symfonyStyle;
$this->fileSystemFileProcessor = $fileSystemFileProcessor;
@ -86,6 +93,7 @@ final class RectorApplication
$this->removedAndAddedFilesCollector = $removedAndAddedFilesCollector;
$this->removedAndAddedFilesProcessor = $removedAndAddedFilesProcessor;
$this->enabledRectorsProvider = $enabledRectorsProvider;
$this->nodeScopeResolver = $nodeScopeResolver;
}
/**
@ -103,6 +111,9 @@ final class RectorApplication
$this->symfonyStyle->progressStart($fileCount * 3);
}
// PHPStan has to know about all files!
$this->configurePHPStanNodeScopeResolver($fileInfos);
// 1. parse files to nodes
foreach ($fileInfos as $fileInfo) {
$this->tryCatchWrapper($fileInfo, function (SmartFileInfo $smartFileInfo): void {
@ -192,4 +203,17 @@ final class RectorApplication
$this->symfonyStyle->progressAdvance();
}
}
/**
* @param SmartFileInfo[] $fileInfos
*/
private function configurePHPStanNodeScopeResolver(array $fileInfos): void
{
$filePaths = [];
foreach ($fileInfos as $fileInfo) {
$filePaths[] = $fileInfo->getRealPath();
}
$this->nodeScopeResolver->setAnalysedFiles($filePaths);
}
}