currentFileProvider = $currentFileProvider; $this->betterStandardPrinter = $betterStandardPrinter; } /** * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $node */ public function reportInvalidNodeForName($node) : void { $message = \sprintf('Pick more specific node than "%s", e.g. "$node->name"', \get_class($node)); $file = $this->currentFileProvider->getFile(); if ($file instanceof \Rector\Core\ValueObject\Application\File) { $smartFileInfo = $file->getSmartFileInfo(); $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)); } $backtrace = \debug_backtrace(); $rectorBacktrace = $this->matchRectorBacktraceCall($backtrace); if ($rectorBacktrace) { // issues to find the file in prefixed if (\file_exists($rectorBacktrace[self::FILE])) { $smartFileInfo = new \Symplify\SmartFileSystem\SmartFileInfo($rectorBacktrace[self::FILE]); $fileAndLine = $smartFileInfo->getRelativeFilePathFromCwd() . ':' . $rectorBacktrace['line']; } else { $fileAndLine = $rectorBacktrace[self::FILE] . ':' . $rectorBacktrace['line']; } $message .= \PHP_EOL . \PHP_EOL; $message .= \sprintf('Look at "%s"', $fileAndLine); } throw new \Rector\Core\Exception\ShouldNotHappenException($message); } /** * @param mixed[] $backtrace * @return string[]|null */ private function matchRectorBacktraceCall(array $backtrace) : ?array { foreach ($backtrace as $singleBacktrace) { if (!isset($singleBacktrace['object'])) { continue; } // match a Rector class if (!\is_a($singleBacktrace['object'], \Rector\Core\Contract\Rector\RectorInterface::class)) { continue; } return $singleBacktrace; } return $backtrace[1] ?? null; } }