PhpFileParser return invalid class name when alias imports are used in class
wojciechuniejewskiworksmile opened this issue · comments
wojciechuniejewskiworksmile commented
When aliased imports are being used in class, PhpFileParser returns invalid class name.
Affected version: 1.3.3
Example class:
<?php
declare(strict_types=1);
namespace SomeCompany\Models\Repositories\Repository\CoffeeSystem\Bonus;
use Phalcon\Db\Enum as PhalconDbEnum;
/**
* @Service()
*/
class BonusDebugRepository extends RepositoryBase
{
}
Result:
SomeCompany\Models\Repositories\Repository\CaSystem\Bonus\as
Expected value:
SomeCompany\Models\Repositories\Repository\CaSystem\Bonus\BonusDebugRepository
Problem essence:
<?php
/* Minimal class stub to reproduce issue */
$subject = '<?php
declare(strict_types=1); namespace SomeCompany\Models\Repositories\Repository\CaSystem\Bonus; use SomeCompany\Models\Repositories\Repository\RepositoryBase; use Phalcon\Db\Enum as PhalconDbEnum; class BonusDebugRepository extends RepositoryBase { } ';
/* As in vendor/composer/class-map-generator/src/PhpFileParser.php:64 */
$pattern = '{
(?:
\b(?<![\$:>])(?P<type>class|interface|trait|enum) \s++ (?P<name>[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+)
| \b(?<![\$:>])(?P<ns>namespace) (?P<nsname>\s++[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\s*+\\\s*+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+)? \s*+ [\{;]
)
}ix';
/* As used in vendor/composer/pcre/src/Preg.php:93 */
preg_match_all($pattern, $subject, $matches, 0, 0);
/* Then matches array is being parsed in loop in vendor/composer/class-map-generator/src/PhpFileParser.php:78 and wrong class name part is assumed to be class name (one-before-last (with value `as`) instead of last (with value `BonusDebugRepository`))*/
var_dump($matches);
/**
* RESULT:
* array (
* 0 =>
* array (
* 0 => 'namespace SomeCompany\\Models\\Repositories\\Repository\\CaSystem\\Bonus;',
* 1 => 'Enum as',
* 2 => 'class BonusDebugRepository',
* ),
* 'type' =>
* array (
* 0 => NULL,
* 1 => 'Enum',
* 2 => 'class',
* ),
* 1 =>
* array (
* 0 => NULL,
* 1 => 'Enum',
* 2 => 'class',
* ),
* 'name' =>
* array (
* 0 => NULL,
* 1 => 'as',
* 2 => 'BonusDebugRepository',
* ),
* 2 =>
* array (
* 0 => NULL,
* 1 => 'as',
* 2 => 'BonusDebugRepository',
* ),
* 'ns' =>
* array (
* 0 => 'namespace',
* 1 => NULL,
* 2 => NULL,
* ),
* 3 =>
* array (
* 0 => 'namespace',
* 1 => NULL,
* 2 => NULL,
* ),
* 'nsname' =>
* array (
* 0 => ' SomeCompany\\Models\\Repositories\\Repository\\CaSystem\\Bonus',
* 1 => NULL,
* 2 => NULL,
* ),
* 4 =>
* array (
* 0 => ' SomeCompany\\Models\\Repositories\\Repository\\CaSystem\\Bonus',
* 1 => NULL,
* 2 => NULL,
* ),
* )
**/
Bartek commented
This also affects us.
Jordi Boggiano commented
Can you please confirm it's gone after a composer self-update --snapshot
?
wojciechuniejewskiworksmile commented
composer self-update --snapshot
alone did not resolve problem, but upgrading composer/class-map-generator
up to 1.3.4
helped indeed. Now the problem's gone. Thanks!
Jordi Boggiano commented
I guess that's because you run composer from your vendor dir somehow.. Or use this lib standalone. Anyway glad it's fixed!