Index: branches/5.3.x/core/kernel/utility/ClassDiscovery/ClassMapBuilder.php =================================================================== diff -u -N -r16156 -r16163 --- branches/5.3.x/core/kernel/utility/ClassDiscovery/ClassMapBuilder.php (.../ClassMapBuilder.php) (revision 16156) +++ branches/5.3.x/core/kernel/utility/ClassDiscovery/ClassMapBuilder.php (.../ClassMapBuilder.php) (revision 16163) @@ -25,7 +25,7 @@ class ClassMapBuilder { - const CACHE_FORMAT = 1; + const CACHE_FORMAT = 2; const CACHE_FILE_STRUCTURE = 'class_structure.php'; @@ -53,13 +53,20 @@ protected $classToFileMap = array(); /** - * List of classes, declared in each file (key - file, value - class list). + * Class information used during cache building (file > class > class_info). * * @var array */ - protected $fileToClassMap = array(); + protected $buildingCache = array(); /** + * Class information (type, extends, implements, etc.). + * + * @var array + */ + protected $classInfo = array(); + + /** * Stores hash of each file on given path. * * @var array @@ -152,15 +159,15 @@ } /** - * Returns class map, that was build previously. + * Returns class map and class information, that was built previously. * * @return array */ public function get() { $this->load(self::CACHE_FILE_STRUCTURE, false); - return $this->classToFileMap; + return array($this->classToFileMap, $this->classInfo); } /** @@ -172,8 +179,8 @@ public function build() { if ( !class_exists('PhpParser\Parser') ) { - $error_msg = 'PHP Parser not found. '; - $error_msg .= 'Make sure, that Composer dependencies were installed using "php composer.phar install --dev" command.'; + $error_msg = 'PHP Parser not found. Make sure, that Composer dependencies were '; + $error_msg .= 'installed using "php composer.phar install --dev" command.'; throw new \RuntimeException($error_msg); } @@ -201,6 +208,7 @@ ksort($this->classToFileMap); ksort($this->fileHashes); + ksort($this->classInfo); $this->store(self::CACHE_FILE_STRUCTURE); $this->store(self::CACHE_FILE_HASHES); @@ -237,22 +245,25 @@ $cache = include $file_path; - if ( $cache['cache_format'] < self::CACHE_FORMAT ) { + if ( $cache['cache_format'] != self::CACHE_FORMAT ) { return; } if ( $filename === self::CACHE_FILE_STRUCTURE ) { + $class_info = $cache['class_info']; + if ( $for_writing ) { foreach ( $cache['classes'] as $class => $file ) { - if ( !isset($this->fileToClassMap[$file]) ) { - $this->fileToClassMap[$file] = array(); + if ( !isset($this->buildingCache[$file]) ) { + $this->buildingCache[$file] = array(); } - $this->fileToClassMap[$file][] = $class; + $this->buildingCache[$file][$class] = $class_info[$class]; } } else { $this->classToFileMap = $cache['classes']; + $this->classInfo = $class_info; } } elseif ( $filename === self::CACHE_FILE_HASHES ) { @@ -306,6 +317,7 @@ */ protected function createParser() { + \kUtil::setResourceLimit(); ini_set('xdebug.max_nesting_level', 3000); $this->parser = new Parser(new Lexer()); $this->traverser = new NodeTraverser(); @@ -330,15 +342,14 @@ if ( $current_hash === $previous_hash ) { // File wasn't change since time, when cache was built. - if ( isset($this->fileToClassMap[$file]) ) { - foreach ( $this->fileToClassMap[$file] as $class ) { - $this->addClass($class); + if ( isset($this->buildingCache[$file]) ) { + foreach ( $this->buildingCache[$file] as $class => $class_info ) { + $this->addClass($class, $class_info); } } } else { // Parse file, because it's content doesn't match the cache. - $this->fileToClassMap[$file] = array(); $this->fileHashes[$file] = $current_hash; $statements = $this->parser->parse($code); @@ -360,6 +371,7 @@ if ( $filename === self::CACHE_FILE_STRUCTURE ) { $cache['classes'] = $this->classToFileMap; + $cache['class_info'] = $this->classInfo; } elseif ( $filename === self::CACHE_FILE_HASHES ) { $cache['file_hashes'] = $this->fileHashes; @@ -422,14 +434,15 @@ /** * Adds class to the map. * - * @param string $class Class. + * @param string $class Class. + * @param array $class_info Class info. * * @return void */ - public function addClass($class) + public function addClass($class, array $class_info) { + $this->classInfo[$class] = $class_info; $this->classToFileMap[$class] = $this->currentFile; - $this->fileToClassMap[$this->currentFile][] = $class; } }