mirror of
https://github.com/danog/psalm.git
synced 2024-12-14 02:07:37 +01:00
118 lines
2.7 KiB
PHP
118 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace Psalm\Internal\Scanner;
|
|
|
|
use PhpParser;
|
|
use PhpParser\NodeTraverser;
|
|
use Psalm\Aliases;
|
|
use Psalm\Codebase;
|
|
use Psalm\FileSource;
|
|
use Psalm\Internal\PhpVisitor\ReflectorVisitor;
|
|
use Psalm\Progress\Progress;
|
|
use Psalm\Progress\VoidProgress;
|
|
use Psalm\Storage\FileStorage;
|
|
|
|
/**
|
|
* @internal
|
|
* @psalm-consistent-constructor
|
|
*/
|
|
class FileScanner implements FileSource
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
public $file_path;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
public $file_name;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
public $will_analyze;
|
|
|
|
public function __construct(string $file_path, string $file_name, bool $will_analyze)
|
|
{
|
|
$this->file_path = $file_path;
|
|
$this->file_name = $file_name;
|
|
$this->will_analyze = $will_analyze;
|
|
}
|
|
|
|
public function scan(
|
|
Codebase $codebase,
|
|
FileStorage $file_storage,
|
|
bool $storage_from_cache = false,
|
|
?Progress $progress = null
|
|
): void {
|
|
if ($progress === null) {
|
|
$progress = new VoidProgress();
|
|
}
|
|
|
|
if ((!$this->will_analyze || $file_storage->deep_scan)
|
|
&& $storage_from_cache
|
|
&& !$codebase->register_stub_files
|
|
) {
|
|
return;
|
|
}
|
|
|
|
$stmts = $codebase->statements_provider->getStatementsForFile(
|
|
$file_storage->file_path,
|
|
$codebase->analysis_php_version_id,
|
|
$progress
|
|
);
|
|
|
|
foreach ($stmts as $stmt) {
|
|
if (!$stmt instanceof PhpParser\Node\Stmt\ClassLike
|
|
&& !$stmt instanceof PhpParser\Node\Stmt\Function_
|
|
&& !($stmt instanceof PhpParser\Node\Stmt\Expression
|
|
&& $stmt->expr instanceof PhpParser\Node\Expr\Include_)
|
|
) {
|
|
$file_storage->has_extra_statements = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ($this->will_analyze) {
|
|
$progress->debug('Deep scanning ' . $file_storage->file_path . "\n");
|
|
} else {
|
|
$progress->debug('Scanning ' . $file_storage->file_path . "\n");
|
|
}
|
|
|
|
$traverser = new NodeTraverser();
|
|
$traverser->addVisitor(
|
|
new ReflectorVisitor($codebase, $this, $file_storage)
|
|
);
|
|
|
|
$traverser->traverse($stmts);
|
|
|
|
$file_storage->deep_scan = $this->will_analyze;
|
|
}
|
|
|
|
public function getFilePath(): string
|
|
{
|
|
return $this->file_path;
|
|
}
|
|
|
|
public function getFileName(): string
|
|
{
|
|
return $this->file_name;
|
|
}
|
|
|
|
public function getRootFilePath(): string
|
|
{
|
|
return $this->file_path;
|
|
}
|
|
|
|
public function getRootFileName(): string
|
|
{
|
|
return $this->file_name;
|
|
}
|
|
|
|
public function getAliases(): Aliases
|
|
{
|
|
return new Aliases();
|
|
}
|
|
}
|