From a4650f246bb927eaf6c317157ab6b2c2576f14e3 Mon Sep 17 00:00:00 2001 From: Laurent Laville Date: Sat, 18 Jul 2020 17:38:18 +0000 Subject: [PATCH] fix AnonymousClassSniff following code reorganization applied to solve issue GH-186 --- .../Analyser/CompatibilityAnalyser.php | 2 +- .../Sniffs/Classes/AnonymousClassSniff.php | 87 +++++++++++++++++++ .../Sniffs/PHP/AnonymousClassSniff.php | 81 ----------------- tests/AnonymousClassSniffTest.php | 1 + .../{ => classes}/anonymous_classes.php | 0 5 files changed, 89 insertions(+), 82 deletions(-) create mode 100644 src/Bartlett/CompatInfo/Sniffs/Classes/AnonymousClassSniff.php delete mode 100644 src/Bartlett/CompatInfo/Sniffs/PHP/AnonymousClassSniff.php rename tests/fixtures/sniffs/{ => classes}/anonymous_classes.php (100%) diff --git a/src/Bartlett/CompatInfo/Analyser/CompatibilityAnalyser.php b/src/Bartlett/CompatInfo/Analyser/CompatibilityAnalyser.php index b0938131..bf2217d3 100644 --- a/src/Bartlett/CompatInfo/Analyser/CompatibilityAnalyser.php +++ b/src/Bartlett/CompatInfo/Analyser/CompatibilityAnalyser.php @@ -11,9 +11,9 @@ namespace Bartlett\CompatInfo\Analyser; +use Bartlett\CompatInfo\Sniffs\Classes\AnonymousClassSniff; use Bartlett\CompatInfo\Sniffs\ControlStructures\DeclareSniff; use Bartlett\CompatInfo\Sniffs\Keywords\ReservedSniff; -use Bartlett\CompatInfo\Sniffs\PHP\AnonymousClassSniff; use Bartlett\CompatInfo\Sniffs\PHP\ReturnTypeDeclarationSniff; use Bartlett\CompatInfo\Util\Database; use Bartlett\CompatInfo\Collection\ReferenceCollection; diff --git a/src/Bartlett/CompatInfo/Sniffs/Classes/AnonymousClassSniff.php b/src/Bartlett/CompatInfo/Sniffs/Classes/AnonymousClassSniff.php new file mode 100644 index 00000000..f7216822 --- /dev/null +++ b/src/Bartlett/CompatInfo/Sniffs/Classes/AnonymousClassSniff.php @@ -0,0 +1,87 @@ +anonymousClass = []; + } + + /** + * {@inheritDoc} + */ + public function leaveSniff(): void + { + parent::leaveSniff(); + + if (!empty($this->anonymousClass)) { + $versions = $this->anonymousClass['versions']; + $versions['matches'] = count($this->anonymousClass['spots']); + $this->visitor->updateElementVersion('classes', 'class', $versions); + $this->visitor->updateGlobalVersion($versions['php.min'], '', $versions['php.min']); + } + } + + /** + * Process this sniff only on this scope. + * + * @param Node $node + * @return int|Node|void|null + */ + public function enterNode(Node $node) + { + if (!$this->isAnonymousClass($node)) { + return null; + } + + $name = 'class'; + + if (empty($this->anonymousClass)) { + $version = '7.0.0alpha1'; + + $versions = [ + 'php.min' => $version, + ]; + + $this->anonymousClass = array_merge( + [ + 'spots' => [], + ], + ['versions' => $versions] + ); + $this->visitor->updateElementVersion('classes', $name, $versions); + $this->visitor->updateContextVersion($versions); + + // inform analyser (in real-time; do not wait leaveSniff) that some sniffs were found + $this->visitor->setMetrics( + [get_class($this) => $this->anonymousClass] + ); + } + $this->anonymousClass['spots'][] = $this->getCurrentSpot($node); + } + + private function isAnonymousClass(Node $node): bool + { + return ($node instanceof Node\Expr\New_ + && $node->class instanceof Node\Stmt\Class_ + ); + } +} diff --git a/src/Bartlett/CompatInfo/Sniffs/PHP/AnonymousClassSniff.php b/src/Bartlett/CompatInfo/Sniffs/PHP/AnonymousClassSniff.php deleted file mode 100644 index 855a2ee2..00000000 --- a/src/Bartlett/CompatInfo/Sniffs/PHP/AnonymousClassSniff.php +++ /dev/null @@ -1,81 +0,0 @@ -anonymousClass = []; - } - - public function leaveSniff(): void - { - parent::leaveSniff(); - - if (!empty($this->anonymousClass)) { - // inform analyser that some sniffs were found - $this->visitor->setMetrics( - array(AnonymousClassSniff::class => $this->anonymousClass) - ); - - $versions = $this->anonymousClass['versions']; - $versions['matches'] = count($this->anonymousClass['spots']); - $this->visitor->updateElementVersion('classes', 'class', $versions); - $this->visitor->updateGlobalVersion($versions['php.min'], '', $versions['php.min']); - } - } - - /** - * @param Node $node - * @return void - */ - public function enterNode(Node $node): void - { - parent::enterNode($node); - - if ($this->isAnonymousClass($node)) { - $name = 'class'; - - if (empty($this->anonymousClass)) { - $version = '7.0.0alpha1'; - - $versions = [ - 'php.min' => $version, - 'php.max' => '', - ]; - - $this->anonymousClass = array_merge( - [ - 'severity' => $this->getCurrentSeverity($version), - 'spots' => [], - ], - ['versions' => $versions] - ); - $this->visitor->updateElementVersion('classes', $name, $versions); - $this->visitor->updateContextVersion($versions); - } - $this->anonymousClass['spots'][] = $this->getCurrentSpot($node); - } - } - - protected function isAnonymousClass(Node $node): bool - { - return ($node instanceof Node\Expr\New_ - && $node->class instanceof Node\Stmt\Class_ - ); - } -} diff --git a/tests/AnonymousClassSniffTest.php b/tests/AnonymousClassSniffTest.php index 1585f52c..3d5b02f7 100644 --- a/tests/AnonymousClassSniffTest.php +++ b/tests/AnonymousClassSniffTest.php @@ -37,6 +37,7 @@ public static function setUpBeforeClass(): void self::$fixtures = __DIR__ . DIRECTORY_SEPARATOR . 'fixtures' . DIRECTORY_SEPARATOR . 'sniffs' . DIRECTORY_SEPARATOR + . 'classes' . DIRECTORY_SEPARATOR ; self::$analyserId = CompatibilityAnalyser::class; diff --git a/tests/fixtures/sniffs/anonymous_classes.php b/tests/fixtures/sniffs/classes/anonymous_classes.php similarity index 100% rename from tests/fixtures/sniffs/anonymous_classes.php rename to tests/fixtures/sniffs/classes/anonymous_classes.php