ソースを参照

[ClassMapGeneratot] Filter out non php code

Otherwise files like https://github.com/propelorm/Propel/blob/master/generator/lib/behavior/i18n/templates/queryUseI18nQuery.php
would fail ("class" keyword would not be filtered out by php_strip_whitespace())
Victor Berchet 12 年 前
コミット
86bb1be61f

+ 11 - 5
src/Composer/Autoload/ClassMapGenerator.php

@@ -107,21 +107,27 @@ class ClassMapGenerator
             throw new \RuntimeException('Could not scan for classes inside '.$path.": \n".$e->getMessage(), 0, $e);
         }
 
-        if (!preg_match('{\b(?:class|interface'.$traits.')\b}i', $contents)) {
-            return array();
-        }
-
         // strip heredocs/nowdocs
         $contents = preg_replace('{<<<\'?(\w+)\'?(?:\r\n|\n|\r)(?:.*?)(?:\r\n|\n|\r)\\1(?=\r\n|\n|\r|;)}s', 'null', $contents);
         // strip strings
         $contents = preg_replace('{"[^"\\\\]*(\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(\\\\.[^\'\\\\]*)*\'}', 'null', $contents);
+        // keep only php code
+        $phpContents = preg_match_all('{<\?(?:php)?(.*)\?>}s', $contents, $m) ? join($m[1], ' ') : '';
+        $contents = preg_replace('{<\?(php)?.*\?>}s', '', $contents);
+        if (preg_match('{<\?(?:php)?(.*)}s', $contents, $m)) {
+            $phpContents .= ' ' . $m[1];
+        }
+
+        if (!preg_match('{\b(?:class|interface'.$traits.')\b}i', $phpContents)) {
+            return array();
+        }
 
         preg_match_all('{
             (?:
                  \b(?<![\$:>])(?<type>class|interface'.$traits.') \s+ (?<name>\S+)
                | \b(?<![\$:>])(?<ns>namespace) (?<nsname>\s+[^\s;{}\\\\]+(?:\s*\\\\\s*[^\s;{}\\\\]+)*)? \s*[\{;]
             )
-        }ix', $contents, $matches);
+        }ix', $phpContents, $matches);
         $classes = array();
 
         $namespace = '';

+ 1 - 0
tests/Composer/Test/Autoload/ClassMapGeneratorTest.php

@@ -53,6 +53,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
                 'ClassMap\\SomeParent'    => realpath(__DIR__).'/Fixtures/classmap/SomeParent.php',
                 'ClassMap\\SomeClass'     => realpath(__DIR__).'/Fixtures/classmap/SomeClass.php',
             )),
+            array(__DIR__.'/Fixtures/template', array()),
         );
 
         if (version_compare(PHP_VERSION, '5.4', '>=')) {

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/template/template_1.php

@@ -0,0 +1,6 @@
+/*
+ * class templateClass_1
+ * interface templateInterface_1
+ * trait temlpateTrait_1
+ */
+<?php echo $code

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/template/template_2.php

@@ -0,0 +1,8 @@
+/*
+ * class templateClass_2
+ * interface templateInterface_2
+ * trait temlpateTrait_2
+ */
+<?php
+    echo $code
+?>