comparison vendor/symfony/class-loader/ClassCollectionLoader.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents 1fec387a4317
children
comparison
equal deleted inserted replaced
16:c2387f117808 17:129ea1e6d783
54 54
55 // don't include already declared classes 55 // don't include already declared classes
56 $classes = array_diff($classes, $declared); 56 $classes = array_diff($classes, $declared);
57 57
58 // the cache is different depending on which classes are already declared 58 // the cache is different depending on which classes are already declared
59 $name = $name.'-'.substr(hash('sha256', implode('|', $classes)), 0, 5); 59 $name .= '-'.substr(hash('sha256', implode('|', $classes)), 0, 5);
60 } 60 }
61 61
62 $classes = array_unique($classes); 62 $classes = array_unique($classes);
63 63
64 // cache the core classes 64 // cache the core classes
65 if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) { 65 if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
66 throw new \RuntimeException(sprintf('Class Collection Loader was not able to create directory "%s"', $cacheDir)); 66 throw new \RuntimeException(sprintf('Class Collection Loader was not able to create directory "%s"', $cacheDir));
67 } 67 }
68 $cacheDir = rtrim(realpath($cacheDir) ?: $cacheDir, '/'.DIRECTORY_SEPARATOR); 68 $cacheDir = rtrim(realpath($cacheDir) ?: $cacheDir, '/'.\DIRECTORY_SEPARATOR);
69 $cache = $cacheDir.'/'.$name.$extension; 69 $cache = $cacheDir.'/'.$name.$extension;
70 70
71 // auto-reload 71 // auto-reload
72 $reload = false; 72 $reload = false;
73 if ($autoReload) { 73 if ($autoReload) {
106 106
107 $files = self::inline($classes, $cache, $declared); 107 $files = self::inline($classes, $cache, $declared);
108 108
109 if ($autoReload) { 109 if ($autoReload) {
110 // save the resources 110 // save the resources
111 self::writeCacheFile($metadata, serialize(array(array_values($files), $classes))); 111 self::writeCacheFile($metadata, serialize([array_values($files), $classes]));
112 } 112 }
113 } 113 }
114 114
115 /** 115 /**
116 * Generates a file where classes and their parents are inlined. 116 * Generates a file where classes and their parents are inlined.
123 * 123 *
124 * @throws \RuntimeException When class can't be loaded 124 * @throws \RuntimeException When class can't be loaded
125 */ 125 */
126 public static function inline($classes, $cache, array $excluded) 126 public static function inline($classes, $cache, array $excluded)
127 { 127 {
128 $declared = array(); 128 $declared = [];
129 foreach (self::getOrderedClasses($excluded) as $class) { 129 foreach (self::getOrderedClasses($excluded) as $class) {
130 $declared[$class->getName()] = true; 130 $declared[$class->getName()] = true;
131 } 131 }
132 132
133 // cache the core classes 133 // cache the core classes
134 $cacheDir = dirname($cache); 134 $cacheDir = \dirname($cache);
135 if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) { 135 if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
136 throw new \RuntimeException(sprintf('Class Collection Loader was not able to create directory "%s"', $cacheDir)); 136 throw new \RuntimeException(sprintf('Class Collection Loader was not able to create directory "%s"', $cacheDir));
137 } 137 }
138 138
139 $spacesRegex = '(?:\s*+(?:(?:\#|//)[^\n]*+\n|/\*(?:(?<!\*/).)++)?+)*+'; 139 $spacesRegex = '(?:\s*+(?:(?:\#|//)[^\n]*+\n|/\*(?:(?<!\*/).)++)?+)*+';
144 | \b__(?:DIR|FILE)__\b 144 | \b__(?:DIR|FILE)__\b
145 )'isx 145 )'isx
146 REGEX; 146 REGEX;
147 $dontInlineRegex = str_replace('.', $spacesRegex, $dontInlineRegex); 147 $dontInlineRegex = str_replace('.', $spacesRegex, $dontInlineRegex);
148 148
149 $cacheDir = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $cacheDir)); 149 $cacheDir = explode('/', str_replace(\DIRECTORY_SEPARATOR, '/', $cacheDir));
150 $files = array(); 150 $files = [];
151 $content = ''; 151 $content = '';
152 foreach (self::getOrderedClasses($classes) as $class) { 152 foreach (self::getOrderedClasses($classes) as $class) {
153 if (isset($declared[$class->getName()])) { 153 if (isset($declared[$class->getName()])) {
154 continue; 154 continue;
155 } 155 }
157 157
158 $files[$class->getName()] = $file = $class->getFileName(); 158 $files[$class->getName()] = $file = $class->getFileName();
159 $c = file_get_contents($file); 159 $c = file_get_contents($file);
160 160
161 if (preg_match($dontInlineRegex, $c)) { 161 if (preg_match($dontInlineRegex, $c)) {
162 $file = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $file)); 162 $file = explode('/', str_replace(\DIRECTORY_SEPARATOR, '/', $file));
163 163
164 for ($i = 0; isset($file[$i], $cacheDir[$i]); ++$i) { 164 for ($i = 0; isset($file[$i], $cacheDir[$i]); ++$i) {
165 if ($file[$i] !== $cacheDir[$i]) { 165 if ($file[$i] !== $cacheDir[$i]) {
166 break; 166 break;
167 } 167 }
168 } 168 }
169 if (1 >= $i) { 169 if (1 >= $i) {
170 $file = var_export(implode('/', $file), true); 170 $file = var_export(implode('/', $file), true);
171 } else { 171 } else {
172 $file = array_slice($file, $i); 172 $file = \array_slice($file, $i);
173 $file = str_repeat('../', count($cacheDir) - $i).implode('/', $file); 173 $file = str_repeat('../', \count($cacheDir) - $i).implode('/', $file);
174 $file = '__DIR__.'.var_export('/'.$file, true); 174 $file = '__DIR__.'.var_export('/'.$file, true);
175 } 175 }
176 176
177 $c = "\nnamespace {require $file;}"; 177 $c = "\nnamespace {require $file;}";
178 } else { 178 } else {
179 $c = preg_replace(array('/^\s*<\?php/', '/\?>\s*$/'), '', $c); 179 $c = preg_replace(['/^\s*<\?php/', '/\?>\s*$/'], '', $c);
180 180
181 // fakes namespace declaration for global code 181 // fakes namespace declaration for global code
182 if (!$class->inNamespace()) { 182 if (!$class->inNamespace()) {
183 $c = "\nnamespace\n{\n".$c."\n}\n"; 183 $c = "\nnamespace\n{\n".$c."\n}\n";
184 } 184 }
201 * 201 *
202 * @return string Namespaces with brackets 202 * @return string Namespaces with brackets
203 */ 203 */
204 public static function fixNamespaceDeclarations($source) 204 public static function fixNamespaceDeclarations($source)
205 { 205 {
206 if (!function_exists('token_get_all') || !self::$useTokenizer) { 206 if (!\function_exists('token_get_all') || !self::$useTokenizer) {
207 if (preg_match('/(^|\s)namespace(.*?)\s*;/', $source)) { 207 if (preg_match('/(^|\s)namespace(.*?)\s*;/', $source)) {
208 $source = preg_replace('/(^|\s)namespace(.*?)\s*;/', "$1namespace$2\n{", $source)."}\n"; 208 $source = preg_replace('/(^|\s)namespace(.*?)\s*;/', "$1namespace$2\n{", $source)."}\n";
209 } 209 }
210 210
211 return $source; 211 return $source;
218 218
219 for ($i = 0; isset($tokens[$i]); ++$i) { 219 for ($i = 0; isset($tokens[$i]); ++$i) {
220 $token = $tokens[$i]; 220 $token = $tokens[$i];
221 if (!isset($token[1]) || 'b"' === $token) { 221 if (!isset($token[1]) || 'b"' === $token) {
222 $rawChunk .= $token; 222 $rawChunk .= $token;
223 } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) { 223 } elseif (\in_array($token[0], [T_COMMENT, T_DOC_COMMENT])) {
224 // strip comments 224 // strip comments
225 continue; 225 continue;
226 } elseif (T_NAMESPACE === $token[0]) { 226 } elseif (T_NAMESPACE === $token[0]) {
227 if ($inNamespace) { 227 if ($inNamespace) {
228 $rawChunk .= "}\n"; 228 $rawChunk .= "}\n";
229 } 229 }
230 $rawChunk .= $token[1]; 230 $rawChunk .= $token[1];
231 231
232 // namespace name and whitespaces 232 // namespace name and whitespaces
233 while (isset($tokens[++$i][1]) && in_array($tokens[$i][0], array(T_WHITESPACE, T_NS_SEPARATOR, T_STRING))) { 233 while (isset($tokens[++$i][1]) && \in_array($tokens[$i][0], [T_WHITESPACE, T_NS_SEPARATOR, T_STRING])) {
234 $rawChunk .= $tokens[$i][1]; 234 $rawChunk .= $tokens[$i][1];
235 } 235 }
236 if ('{' === $tokens[$i]) { 236 if ('{' === $tokens[$i]) {
237 $inNamespace = false; 237 $inNamespace = false;
238 --$i; 238 --$i;
287 * @return string compressed code 287 * @return string compressed code
288 */ 288 */
289 private static function compressCode($code) 289 private static function compressCode($code)
290 { 290 {
291 return preg_replace( 291 return preg_replace(
292 array('/^\s+/m', '/\s+$/m', '/([\n\r]+ *[\n\r]+)+/', '/[ \t]+/'), 292 ['/^\s+/m', '/\s+$/m', '/([\n\r]+ *[\n\r]+)+/', '/[ \t]+/'],
293 array('', '', "\n", ' '), 293 ['', '', "\n", ' '],
294 $code 294 $code
295 ); 295 );
296 } 296 }
297 297
298 /** 298 /**
303 * 303 *
304 * @throws \RuntimeException when a cache file cannot be written 304 * @throws \RuntimeException when a cache file cannot be written
305 */ 305 */
306 private static function writeCacheFile($file, $content) 306 private static function writeCacheFile($file, $content)
307 { 307 {
308 $dir = dirname($file); 308 $dir = \dirname($file);
309 if (!is_writable($dir)) { 309 if (!is_writable($dir)) {
310 throw new \RuntimeException(sprintf('Cache directory "%s" is not writable.', $dir)); 310 throw new \RuntimeException(sprintf('Cache directory "%s" is not writable.', $dir));
311 } 311 }
312 312
313 $tmpFile = tempnam($dir, basename($file)); 313 $tmpFile = tempnam($dir, basename($file));
328 * 328 *
329 * @throws \InvalidArgumentException When a class can't be loaded 329 * @throws \InvalidArgumentException When a class can't be loaded
330 */ 330 */
331 private static function getOrderedClasses(array $classes) 331 private static function getOrderedClasses(array $classes)
332 { 332 {
333 $map = array(); 333 $map = [];
334 self::$seen = array(); 334 self::$seen = [];
335 foreach ($classes as $class) { 335 foreach ($classes as $class) {
336 try { 336 try {
337 $reflectionClass = new \ReflectionClass($class); 337 $reflectionClass = new \ReflectionClass($class);
338 } catch (\ReflectionException $e) { 338 } catch (\ReflectionException $e) {
339 throw new \InvalidArgumentException(sprintf('Unable to load class "%s"', $class)); 339 throw new \InvalidArgumentException(sprintf('Unable to load class "%s"', $class));
346 } 346 }
347 347
348 private static function getClassHierarchy(\ReflectionClass $class) 348 private static function getClassHierarchy(\ReflectionClass $class)
349 { 349 {
350 if (isset(self::$seen[$class->getName()])) { 350 if (isset(self::$seen[$class->getName()])) {
351 return array(); 351 return [];
352 } 352 }
353 353
354 self::$seen[$class->getName()] = true; 354 self::$seen[$class->getName()] = true;
355 355
356 $classes = array($class); 356 $classes = [$class];
357 $parent = $class; 357 $parent = $class;
358 while (($parent = $parent->getParentClass()) && $parent->isUserDefined() && !isset(self::$seen[$parent->getName()])) { 358 while (($parent = $parent->getParentClass()) && $parent->isUserDefined() && !isset(self::$seen[$parent->getName()])) {
359 self::$seen[$parent->getName()] = true; 359 self::$seen[$parent->getName()] = true;
360 360
361 array_unshift($classes, $parent); 361 array_unshift($classes, $parent);
362 } 362 }
363 363
364 $traits = array(); 364 $traits = [];
365 365
366 foreach ($classes as $c) { 366 foreach ($classes as $c) {
367 foreach (self::resolveDependencies(self::computeTraitDeps($c), $c) as $trait) { 367 foreach (self::resolveDependencies(self::computeTraitDeps($c), $c) as $trait) {
368 if ($trait !== $c) { 368 if ($trait !== $c) {
369 $traits[] = $trait; 369 $traits[] = $trait;
374 return array_merge(self::getInterfaces($class), $traits, $classes); 374 return array_merge(self::getInterfaces($class), $traits, $classes);
375 } 375 }
376 376
377 private static function getInterfaces(\ReflectionClass $class) 377 private static function getInterfaces(\ReflectionClass $class)
378 { 378 {
379 $classes = array(); 379 $classes = [];
380 380
381 foreach ($class->getInterfaces() as $interface) { 381 foreach ($class->getInterfaces() as $interface) {
382 $classes = array_merge($classes, self::getInterfaces($interface)); 382 $classes = array_merge($classes, self::getInterfaces($interface));
383 } 383 }
384 384
392 } 392 }
393 393
394 private static function computeTraitDeps(\ReflectionClass $class) 394 private static function computeTraitDeps(\ReflectionClass $class)
395 { 395 {
396 $traits = $class->getTraits(); 396 $traits = $class->getTraits();
397 $deps = array($class->getName() => $traits); 397 $deps = [$class->getName() => $traits];
398 while ($trait = array_pop($traits)) { 398 while ($trait = array_pop($traits)) {
399 if ($trait->isUserDefined() && !isset(self::$seen[$trait->getName()])) { 399 if ($trait->isUserDefined() && !isset(self::$seen[$trait->getName()])) {
400 self::$seen[$trait->getName()] = true; 400 self::$seen[$trait->getName()] = true;
401 $traitDeps = $trait->getTraits(); 401 $traitDeps = $trait->getTraits();
402 $deps[$trait->getName()] = $traitDeps; 402 $deps[$trait->getName()] = $traitDeps;