Mercurial > hg > isophonics-drupal-site
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; |