2021-04-13 02:12:48 +02:00
< ? php
2021-05-09 20:15:43 +00:00
declare ( strict_types = 1 );
2021-04-13 02:12:48 +02:00
namespace Rector\NodeNameResolver\Error ;
use PhpParser\Node\Expr\MethodCall ;
use PhpParser\Node\Expr\StaticCall ;
use Rector\Core\Contract\Rector\RectorInterface ;
use Rector\Core\Exception\ShouldNotHappenException ;
use Rector\Core\PhpParser\Printer\BetterStandardPrinter ;
use Rector\Core\Provider\CurrentFileProvider ;
use Rector\Core\ValueObject\Application\File ;
use Symplify\SmartFileSystem\SmartFileInfo ;
final class InvalidNameNodeReporter
{
/**
* @ var string
*/
private const FILE = 'file' ;
/**
2021-05-10 23:39:21 +00:00
* @ var \Rector\Core\Provider\CurrentFileProvider
2021-04-13 02:12:48 +02:00
*/
private $currentFileProvider ;
/**
2021-05-10 23:39:21 +00:00
* @ var \Rector\Core\PhpParser\Printer\BetterStandardPrinter
2021-04-13 02:12:48 +02:00
*/
private $betterStandardPrinter ;
2021-05-10 22:23:08 +00:00
public function __construct ( \Rector\Core\Provider\CurrentFileProvider $currentFileProvider , \Rector\Core\PhpParser\Printer\BetterStandardPrinter $betterStandardPrinter )
2021-05-09 20:15:43 +00:00
{
2021-04-13 02:12:48 +02:00
$this -> currentFileProvider = $currentFileProvider ;
$this -> betterStandardPrinter = $betterStandardPrinter ;
}
/**
2021-08-23 00:20:32 +00:00
* @ param \PhpParser\Node\Expr\MethodCall | \PhpParser\Node\Expr\StaticCall $node
2021-04-13 02:12:48 +02:00
*/
2021-06-29 14:24:45 +00:00
public function reportInvalidNodeForName ( $node ) : void
2021-04-13 02:12:48 +02:00
{
2021-05-09 20:15:43 +00:00
$message = \sprintf ( 'Pick more specific node than "%s", e.g. "$node->name"' , \get_class ( $node ));
2021-04-13 02:12:48 +02:00
$file = $this -> currentFileProvider -> getFile ();
2021-05-10 22:23:08 +00:00
if ( $file instanceof \Rector\Core\ValueObject\Application\File ) {
2021-04-13 02:12:48 +02:00
$smartFileInfo = $file -> getSmartFileInfo ();
2021-05-09 20:15:43 +00:00
$message .= \PHP_EOL . \PHP_EOL ;
$message .= \sprintf ( 'Caused in "%s" file on line %d on code "%s"' , $smartFileInfo -> getRelativeFilePathFromCwd (), $node -> getStartLine (), $this -> betterStandardPrinter -> print ( $node ));
2021-04-13 02:12:48 +02:00
}
2021-05-09 20:15:43 +00:00
$backtrace = \debug_backtrace ();
2021-04-13 02:12:48 +02:00
$rectorBacktrace = $this -> matchRectorBacktraceCall ( $backtrace );
if ( $rectorBacktrace ) {
// issues to find the file in prefixed
2021-05-09 20:15:43 +00:00
if ( \file_exists ( $rectorBacktrace [ self :: FILE ])) {
2021-05-10 22:23:08 +00:00
$smartFileInfo = new \Symplify\SmartFileSystem\SmartFileInfo ( $rectorBacktrace [ self :: FILE ]);
2021-04-13 02:12:48 +02:00
$fileAndLine = $smartFileInfo -> getRelativeFilePathFromCwd () . ':' . $rectorBacktrace [ 'line' ];
} else {
$fileAndLine = $rectorBacktrace [ self :: FILE ] . ':' . $rectorBacktrace [ 'line' ];
}
2021-05-09 20:15:43 +00:00
$message .= \PHP_EOL . \PHP_EOL ;
$message .= \sprintf ( 'Look at "%s"' , $fileAndLine );
2021-04-13 02:12:48 +02:00
}
2021-05-10 22:23:08 +00:00
throw new \Rector\Core\Exception\ShouldNotHappenException ( $message );
2021-04-13 02:12:48 +02:00
}
/**
* @ param mixed [] $backtrace
* @ return string [] | null
*/
2021-05-09 20:15:43 +00:00
private function matchRectorBacktraceCall ( array $backtrace ) : ? array
2021-04-13 02:12:48 +02:00
{
foreach ( $backtrace as $singleBacktrace ) {
2021-05-09 20:15:43 +00:00
if ( ! isset ( $singleBacktrace [ 'object' ])) {
2021-04-13 02:12:48 +02:00
continue ;
}
// match a Rector class
2021-05-10 22:23:08 +00:00
if ( ! \is_a ( $singleBacktrace [ 'object' ], \Rector\Core\Contract\Rector\RectorInterface :: class )) {
2021-04-13 02:12:48 +02:00
continue ;
}
return $singleBacktrace ;
}
return $backtrace [ 1 ] ? ? null ;
}
}