composer / class-map-generator

Utilities to scan PHP code and generate class maps.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

PhpFileParser return invalid class name when alias imports are used in class

wojciechuniejewskiworksmile opened this issue · comments

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,
 * ),
 * )
 **/

This also affects us.

Can you please confirm it's gone after a composer self-update --snapshot?

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!

I guess that's because you run composer from your vendor dir somehow.. Or use this lib standalone. Anyway glad it's fixed!