Skip to content

Commit

Permalink
[ClassMapGeneratot] Filter out non php code
Browse files Browse the repository at this point in the history
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())
  • Loading branch information
vicb committed Nov 12, 2012
1 parent ab48114 commit 86bb1be
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 5 deletions.
16 changes: 11 additions & 5 deletions src/Composer/Autoload/ClassMapGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,21 +107,27 @@ private static function findClasses($path)
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 = '';
Expand Down
1 change: 1 addition & 0 deletions tests/Composer/Test/Autoload/ClassMapGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public function getTestCreateMapTests()
'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', '>=')) {
Expand Down
6 changes: 6 additions & 0 deletions tests/Composer/Test/Autoload/Fixtures/template/template_1.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/*
* class templateClass_1
* interface templateInterface_1
* trait temlpateTrait_1
*/
<?php echo $code
8 changes: 8 additions & 0 deletions tests/Composer/Test/Autoload/Fixtures/template/template_2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* class templateClass_2
* interface templateInterface_2
* trait temlpateTrait_2
*/
<?php
echo $code
?>

0 comments on commit 86bb1be

Please sign in to comment.