2015-08-18 00:00:26 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\ClassLoader ;
2018-11-23 12:29:20 +00:00
@ trigger_error ( 'The ' . __NAMESPACE__ . '\ClassMapGenerator class is deprecated since Symfony 3.3 and will be removed in 4.0. Use Composer instead.' , E_USER_DEPRECATED );
2015-08-18 00:00:26 +00:00
/**
* ClassMapGenerator .
*
* @ author Gyula Sallai < salla016 @ gmail . com >
2018-11-23 12:29:20 +00:00
*
* @ deprecated since version 3.3 , to be removed in 4.0 .
2015-08-18 00:00:26 +00:00
*/
class ClassMapGenerator
{
/**
* Generate a class map file .
*
* @ param array | string $dirs Directories or a single path to search in
* @ param string $file The name of the class map file
*/
public static function dump ( $dirs , $file )
{
$dirs = ( array ) $dirs ;
$maps = array ();
foreach ( $dirs as $dir ) {
$maps = array_merge ( $maps , static :: createMap ( $dir ));
}
file_put_contents ( $file , sprintf ( '<?php return %s;' , var_export ( $maps , true )));
}
/**
* Iterate over all files in the given directory searching for classes .
*
* @ param \Iterator | string $dir The directory to search in or an iterator
*
* @ return array A class map array
*/
public static function createMap ( $dir )
{
2018-11-23 12:29:20 +00:00
if ( \is_string ( $dir )) {
2015-08-18 00:00:26 +00:00
$dir = new \RecursiveIteratorIterator ( new \RecursiveDirectoryIterator ( $dir ));
}
$map = array ();
foreach ( $dir as $file ) {
if ( ! $file -> isFile ()) {
continue ;
}
2017-02-03 00:28:38 +00:00
$path = $file -> getRealPath () ? : $file -> getPathname ();
2015-08-18 00:00:26 +00:00
2018-11-23 12:29:20 +00:00
if ( 'php' !== pathinfo ( $path , PATHINFO_EXTENSION )) {
2015-08-18 00:00:26 +00:00
continue ;
}
$classes = self :: findClasses ( $path );
2017-07-03 15:47:07 +00:00
if ( \PHP_VERSION_ID >= 70000 ) {
2016-04-20 16:56:34 +00:00
// PHP 7 memory manager will not release after token_get_all(), see https://bugs.php.net/70098
gc_mem_caches ();
}
2015-08-18 00:00:26 +00:00
foreach ( $classes as $class ) {
$map [ $class ] = $path ;
}
}
return $map ;
}
/**
* Extract the classes in the given file .
*
* @ param string $path The file to check
*
* @ return array The found classes
*/
private static function findClasses ( $path )
{
$contents = file_get_contents ( $path );
$tokens = token_get_all ( $contents );
$classes = array ();
$namespace = '' ;
2016-04-20 16:56:34 +00:00
for ( $i = 0 ; isset ( $tokens [ $i ]); ++ $i ) {
2015-08-18 00:00:26 +00:00
$token = $tokens [ $i ];
2016-04-20 16:56:34 +00:00
if ( ! isset ( $token [ 1 ])) {
2015-08-18 00:00:26 +00:00
continue ;
}
$class = '' ;
switch ( $token [ 0 ]) {
case T_NAMESPACE :
$namespace = '' ;
// If there is a namespace, extract it
2016-04-20 16:56:34 +00:00
while ( isset ( $tokens [ ++ $i ][ 1 ])) {
2018-11-23 12:29:20 +00:00
if ( \in_array ( $tokens [ $i ][ 0 ], array ( T_STRING , T_NS_SEPARATOR ))) {
2016-04-20 16:56:34 +00:00
$namespace .= $tokens [ $i ][ 1 ];
2015-08-18 00:00:26 +00:00
}
}
$namespace .= '\\' ;
break ;
case T_CLASS :
case T_INTERFACE :
2018-11-23 12:29:20 +00:00
case T_TRAIT :
2015-10-08 18:40:12 +00:00
// Skip usage of ::class constant
$isClassConstant = false ;
for ( $j = $i - 1 ; $j > 0 ; -- $j ) {
2016-04-20 16:56:34 +00:00
if ( ! isset ( $tokens [ $j ][ 1 ])) {
2015-10-08 18:40:12 +00:00
break ;
}
if ( T_DOUBLE_COLON === $tokens [ $j ][ 0 ]) {
$isClassConstant = true ;
break ;
2018-11-23 12:29:20 +00:00
} elseif ( ! \in_array ( $tokens [ $j ][ 0 ], array ( T_WHITESPACE , T_DOC_COMMENT , T_COMMENT ))) {
2015-10-08 18:40:12 +00:00
break ;
}
}
if ( $isClassConstant ) {
2016-04-20 16:56:34 +00:00
break ;
2015-10-08 18:40:12 +00:00
}
2015-08-18 00:00:26 +00:00
// Find the classname
2016-04-20 16:56:34 +00:00
while ( isset ( $tokens [ ++ $i ][ 1 ])) {
$t = $tokens [ $i ];
2015-08-18 00:00:26 +00:00
if ( T_STRING === $t [ 0 ]) {
$class .= $t [ 1 ];
2016-04-20 16:56:34 +00:00
} elseif ( '' !== $class && T_WHITESPACE === $t [ 0 ]) {
2015-08-18 00:00:26 +00:00
break ;
}
}
$classes [] = ltrim ( $namespace . $class , '\\' );
break ;
default :
break ;
}
}
return $classes ;
}
}