From 3d293b298f32106f4833e14d63e4eadfbe31b6dd Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Sun, 9 Aug 2020 13:18:36 +0200 Subject: [PATCH] [ClassLoader][Routing] Fix namespace parsing on php 8. --- .../Component/ClassLoader/ClassCollectionLoader.php | 7 ++++++- src/Symfony/Component/ClassLoader/ClassMapGenerator.php | 7 ++++++- .../Component/Routing/Loader/AnnotationFileLoader.php | 9 +++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php b/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php index 61175debd40e9..3ed8cd94c283e 100644 --- a/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php +++ b/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php @@ -216,6 +216,11 @@ public static function fixNamespaceDeclarations($source) $inNamespace = false; $tokens = token_get_all($source); + $nsTokens = [T_WHITESPACE => true, T_NS_SEPARATOR => true, T_STRING => true]; + if (\defined('T_NAME_QUALIFIED')) { + $nsTokens[T_NAME_QUALIFIED] = true; + } + for ($i = 0; isset($tokens[$i]); ++$i) { $token = $tokens[$i]; if (!isset($token[1]) || 'b"' === $token) { @@ -230,7 +235,7 @@ public static function fixNamespaceDeclarations($source) $rawChunk .= $token[1]; // namespace name and whitespaces - while (isset($tokens[++$i][1]) && \in_array($tokens[$i][0], [T_WHITESPACE, T_NS_SEPARATOR, T_STRING])) { + while (isset($tokens[++$i][1], $nsTokens[$tokens[$i][0]])) { $rawChunk .= $tokens[$i][1]; } if ('{' === $tokens[$i]) { diff --git a/src/Symfony/Component/ClassLoader/ClassMapGenerator.php b/src/Symfony/Component/ClassLoader/ClassMapGenerator.php index f32ca3ca27377..eb0bb1038970c 100644 --- a/src/Symfony/Component/ClassLoader/ClassMapGenerator.php +++ b/src/Symfony/Component/ClassLoader/ClassMapGenerator.php @@ -93,6 +93,11 @@ private static function findClasses($path) $contents = file_get_contents($path); $tokens = token_get_all($contents); + $nsTokens = [T_STRING => true, T_NS_SEPARATOR => true]; + if (\defined('T_NAME_QUALIFIED')) { + $nsTokens[T_NAME_QUALIFIED] = true; + } + $classes = []; $namespace = ''; @@ -110,7 +115,7 @@ private static function findClasses($path) $namespace = ''; // If there is a namespace, extract it while (isset($tokens[++$i][1])) { - if (\in_array($tokens[$i][0], [T_STRING, T_NS_SEPARATOR])) { + if (isset($nsTokens[$tokens[$i][0]])) { $namespace .= $tokens[$i][1]; } } diff --git a/src/Symfony/Component/Routing/Loader/AnnotationFileLoader.php b/src/Symfony/Component/Routing/Loader/AnnotationFileLoader.php index d8c10197d2057..6ced874c11be8 100644 --- a/src/Symfony/Component/Routing/Loader/AnnotationFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/AnnotationFileLoader.php @@ -97,6 +97,11 @@ protected function findClass($file) throw new \InvalidArgumentException(sprintf('The file "%s" does not contain PHP code. Did you forgot to add the " true, T_STRING => true]; + if (\defined('T_NAME_QUALIFIED')) { + $nsTokens[T_NAME_QUALIFIED] = true; + } + for ($i = 0; isset($tokens[$i]); ++$i) { $token = $tokens[$i]; @@ -108,9 +113,9 @@ protected function findClass($file) return $namespace.'\\'.$token[1]; } - if (true === $namespace && T_STRING === $token[0]) { + if (true === $namespace && isset($nsTokens[$token[0]])) { $namespace = $token[1]; - while (isset($tokens[++$i][1]) && \in_array($tokens[$i][0], [T_NS_SEPARATOR, T_STRING])) { + while (isset($tokens[++$i][1], $nsTokens[$tokens[$i][0]])) { $namespace .= $tokens[$i][1]; } $token = $tokens[$i];