From 6f15c4780f1e94563ffbd63aeebec03eaf1c79b7 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sat, 27 Oct 2012 17:55:46 +0200 Subject: [PATCH] [ClassLoader] fixed unbracketed namespaces (closes #5747) --- .../ClassLoader/ClassCollectionLoader.php | 15 +++- .../ClassLoader/ClassCollectionLoaderTest.php | 69 +++++++------------ 2 files changed, 39 insertions(+), 45 deletions(-) diff --git a/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php b/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php index c632849e5300..8e835d8beb12 100644 --- a/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php +++ b/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php @@ -19,6 +19,7 @@ class ClassCollectionLoader { private static $loaded; + private static $useTokenizer = true; /** * Loads a list of classes and caches them in one big file. @@ -125,7 +126,11 @@ public static function load($classes, $cacheDir, $name, $autoReload, $adaptive = */ public static function fixNamespaceDeclarations($source) { - if (!function_exists('token_get_all')) { + if (!function_exists('token_get_all') || !self::$useTokenizer) { + if (preg_match('/namespace(.*?)\s*;/', $source)) { + $source = preg_replace('/namespace(.*?)(\s*);/', "namespace$1$2\n{", $source)."}\n"; + } + return $source; } @@ -219,4 +224,12 @@ private static function stripComments($source) return $output; } + + /** + * This method is only useful for testing. + */ + public static function enableTokenizer($bool) + { + self::$useTokenizer = (Boolean) $bool; + } } diff --git a/tests/Symfony/Tests/Component/ClassLoader/ClassCollectionLoaderTest.php b/tests/Symfony/Tests/Component/ClassLoader/ClassCollectionLoaderTest.php index ed0b7b96fa6a..609928da16d3 100644 --- a/tests/Symfony/Tests/Component/ClassLoader/ClassCollectionLoaderTest.php +++ b/tests/Symfony/Tests/Component/ClassLoader/ClassCollectionLoaderTest.php @@ -15,53 +15,34 @@ class ClassCollectionLoaderTest extends \PHPUnit_Framework_TestCase { - public function testFixNamespaceDeclarations() + /** + * @dataProvider getFixNamespaceDeclarationsData + */ + public function testFixNamespaceDeclarations($source, $expected) { - $source = <<assertEquals('assertEquals('assertEquals($expected, ClassCollectionLoader::fixNamespaceDeclarations($source)); + public function getFixNamespaceDeclarationsData() + { + return array( + array("namespace;\nclass Foo {}\n", "namespace\n{\nclass Foo {}\n}\n"), + array("namespace Foo;\nclass Foo {}\n", "namespace Foo\n{\nclass Foo {}\n}\n"), + array("namespace Bar ;\nclass Foo {}\n", "namespace Bar \n{\nclass Foo {}\n}\n"), + array("namespace Foo\Bar;\nclass Foo {}\n", "namespace Foo\Bar\n{\nclass Foo {}\n}\n"), + array("namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n", "namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n"), + array("namespace\n{\nclass Foo {}\n}\n", "namespace\n{\nclass Foo {}\n}\n"), + ); } /**