diff --git a/Classes/Console/Parser/PhpParser.php b/Classes/Console/Parser/PhpParser.php index 78f89cdf..28b50f1b 100644 --- a/Classes/Console/Parser/PhpParser.php +++ b/Classes/Console/Parser/PhpParser.php @@ -96,7 +96,7 @@ protected function parseNamespace($classContent): string */ protected function parseClassNameRaw($classContent): string { - preg_match('/^\\s*(abstract)*\\s*(class|interface) ([a-zA-Z_\x7f-\xff][a-zA-Z0-9\\\\_\x7f-\xff]*)/ims', $classContent, $matches); + preg_match('/^\\s*(abstract|final)*\\s*(class|interface) ([a-zA-Z_\x7f-\xff][a-zA-Z0-9\\\\_\x7f-\xff]*)/ims', $classContent, $matches); if (!isset($matches[2])) { throw new ParsingException('Class file does not contain a class or interface definition', 1399285302); } diff --git a/Tests/Console/Unit/Parser/PhpParserTest.php b/Tests/Console/Unit/Parser/PhpParserTest.php index 650ba63a..73d5d672 100644 --- a/Tests/Console/Unit/Parser/PhpParserTest.php +++ b/Tests/Console/Unit/Parser/PhpParserTest.php @@ -118,6 +118,7 @@ public function nonNamespacedClassesDataProvider() return [ 'normal class' => ['class Tx_Ext_Bar {', ['className' => 'Bar', 'namespace' => 'Tx_Ext', 'separator' => '_', 'full' => 'Tx_Ext_Bar']], 'abstract class' => ['abstract class Tx_Ext_BarAbstract {', ['className' => 'BarAbstract', 'namespace' => 'Tx_Ext', 'separator' => '_', 'full' => 'Tx_Ext_BarAbstract']], + 'final class' => ['final class Tx_Ext_BarFinal {', ['className' => 'BarFinal', 'namespace' => 'Tx_Ext', 'separator' => '_', 'full' => 'Tx_Ext_BarFinal']], 'without namespace' => ['class TxExtBar {', ['className' => 'TxExtBar', 'namespace' => '', 'separator' => '', 'full' => 'TxExtBar']], ]; }