mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
#2380 - ManifestBuilder shouldn't recognise class definitions in comments and strings as real
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@52239 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
b465a46bcc
commit
b035abc6d3
@ -171,7 +171,7 @@ class ManifestBuilder {
|
||||
$manifestInfo["require_once"][] = "$baseDir/$filename/_config.php";
|
||||
// Include this so that we're set up for connecting to the database
|
||||
// in the rest of the manifest builder
|
||||
require_once("$baseDir/$filename/_config.php");
|
||||
require("$baseDir/$filename/_config.php");
|
||||
}
|
||||
}
|
||||
|
||||
@ -378,6 +378,22 @@ class ManifestBuilder {
|
||||
|
||||
if(!$file) die("Couldn't open $filename<br />");
|
||||
|
||||
// Remove comments from $file so that we don't make use of a class-def inside a comment
|
||||
$file = preg_replace('/\/\/.*([\n\r])/','$1', $file);
|
||||
$file = preg_replace('/\/\*.*\*\//Us','', $file);
|
||||
|
||||
// Remove strings from $file so that we don't make use of a class-def inside a strin
|
||||
$file = str_replace(array("\\'",'\\"'), "{! ESCAPED QUOTE !}", $file);
|
||||
$file = preg_replace("/'[^']*'/s",'', $file);
|
||||
$file = preg_replace('/"[^"]*"/s','', $file);
|
||||
|
||||
// Remove heredoc strings from $file so that we don't make use of a class-def inside a strin
|
||||
if(preg_match_all('/<<<(.*)/', $file, $heredocs)) {
|
||||
foreach($heredocs[1] as $code) {
|
||||
$file = preg_replace('/<<<' . $code . '\n.*\n' . $code . '[\n;]/s', '', $file);
|
||||
}
|
||||
}
|
||||
|
||||
$classes = array();
|
||||
$size = preg_match_all('/class (.*)[ \n]*{/m', $file, $classes);
|
||||
|
||||
|
@ -15,10 +15,13 @@ PHP
|
||||
'sapphire/MyClass.php' => <<<PHP
|
||||
<?php
|
||||
|
||||
/* This is a comment before */
|
||||
class MyClass extends Object {
|
||||
|
||||
}
|
||||
|
||||
/* This is a comment between */
|
||||
|
||||
class MyClass_Other extends DataObject implements Something {
|
||||
|
||||
}
|
||||
@ -27,6 +30,39 @@ class MyClass_Final extends DataObject implements Something, Else {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
Here we have a class in a comment:
|
||||
class MyClass_InComment extends DataObject {
|
||||
|
||||
}
|
||||
|
||||
This class definition isn't named correctly:
|
||||
class UnrelatedCLass extends DataObject {
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// This is another class definition: class MyClass_InSlashSlashComment extends DataObject {
|
||||
|
||||
// Here's a class definition in a string:
|
||||
\$string = <<<MYCODE
|
||||
|
||||
class MyClass_InHeredocString extends DataObject {
|
||||
|
||||
}
|
||||
|
||||
MYCODE;
|
||||
|
||||
// Other definitions inside strings:
|
||||
\$string2 = 'class MyClass_InSingleQuoteString extends DataObject {
|
||||
}'
|
||||
\$string3 = "class MyClass_InDoubleQuoteString extends DataObject {
|
||||
}
|
||||
|
||||
I've included \"an escaped quote\" in this to ensure that it can handle that.
|
||||
"
|
||||
|
||||
?>
|
||||
PHP
|
||||
,
|
||||
|
@ -3,22 +3,15 @@
|
||||
class ManifestBuilderTest extends SapphireTest {
|
||||
function testManifest() {
|
||||
$baseFolder = TEMP_FOLDER . '/manifest-test';
|
||||
|
||||
global $_CLASS_MANIFEST, $project;
|
||||
$originalClassManifest = $_CLASS_MANIFEST;
|
||||
$originalProject = $project;
|
||||
|
||||
$manifestInfo = ManifestBuilder::get_manifest_info($baseFolder);
|
||||
Debug::show($manifestInfo);
|
||||
|
||||
$this->assertEquals("$baseFolder/sapphire/MyClass.php", $manifestInfo['globals']['_CLASS_MANIFEST']['MyClass']);
|
||||
$this->assertEquals("$baseFolder/sapphire/subdir/SubDirClass.php", $manifestInfo['globals']['_CLASS_MANIFEST']['SubDirClass']);
|
||||
$this->assertNotContains('OtherFile', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||
|
||||
global $_CLASS_MANIFEST, $project;
|
||||
$project = $originalProject;
|
||||
$_CLASS_MANIFEST = $originalClassManifest;
|
||||
|
||||
$this->assertContains('MyClass', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertContains('MyClass_Other', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertContains('MyClass_Final', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
|
||||
// Check aspects of PHP file
|
||||
$manifest = ManifestBuilder::generate_php_file($manifestInfo);
|
||||
@ -33,6 +26,50 @@ class ManifestBuilderTest extends SapphireTest {
|
||||
$this->assertEquals(1, preg_match('/require_once\("[^"]+sapphire\/_config.php"\);/i', $manifest), "sapphire/_config.php included");
|
||||
}
|
||||
|
||||
|
||||
function testManifestIgnoresClassesInComments() {
|
||||
$baseFolder = TEMP_FOLDER . '/manifest-test';
|
||||
$manifestInfo = ManifestBuilder::get_manifest_info($baseFolder);
|
||||
|
||||
/* Our fixture defines the class MyClass_InComment inside a comment, so it shouldn't be included in the class manifest. */
|
||||
$this->assertNotContains('MyClass_InComment', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||
$this->assertNotContains('MyClass_InComment', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertNotContains('MyClass_InComment', array_keys($manifestInfo['globals']['_ALL_CLASSES']['parents']));
|
||||
$this->assertNotContains('MyClass_InComment', array_keys($manifestInfo['globals']['_ALL_CLASSES']['hastable']));
|
||||
|
||||
/* Our fixture defines the class MyClass_InSlashSlashComment inside a //-style comment, so it shouldn't be included in the class manifest. */
|
||||
$this->assertNotContains('MyClass_InSlashSlashComment', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||
$this->assertNotContains('MyClass_InSlashSlashComment', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertNotContains('MyClass_InSlashSlashComment', array_keys($manifestInfo['globals']['_ALL_CLASSES']['parents']));
|
||||
$this->assertNotContains('MyClass_InSlashSlashComment', array_keys($manifestInfo['globals']['_ALL_CLASSES']['hastable']));
|
||||
}
|
||||
|
||||
function testManifestIgnoresClassesInStrings() {
|
||||
$baseFolder = TEMP_FOLDER . '/manifest-test';
|
||||
$manifestInfo = ManifestBuilder::get_manifest_info($baseFolder);
|
||||
|
||||
/* If a class defintion is listed in a single quote string, then it shouldn't be inlcuded. Here we have put a class definition for MyClass_InSingleQuoteString inside a single-quoted string */
|
||||
$this->assertNotContains('MyClass_InSingleQuoteString', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||
$this->assertNotContains('MyClass_InSingleQuoteString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertNotContains('MyClass_InSingleQuoteString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['parents']));
|
||||
$this->assertNotContains('MyClass_InSingleQuoteString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['hastable']));
|
||||
|
||||
/* Ditto for double quotes. Here we have put a class definition for MyClass_InDoubleQuoteString inside a double-quoted string. */
|
||||
$this->assertNotContains('MyClass_InDoubleQuoteString', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||
$this->assertNotContains('MyClass_InDoubleQuoteString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertNotContains('MyClass_InDoubleQuoteString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['parents']));
|
||||
$this->assertNotContains('MyClass_InDoubleQuoteString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['hastable']));
|
||||
|
||||
/* Finally, we need to ensure that class definitions inside heredoc strings aren't included. Here, we have defined the class MyClass_InHeredocString inside a heredoc string. */
|
||||
$this->assertNotContains('MyClass_InHeredocString', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||
$this->assertNotContains('MyClass_InHeredocString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['exists']));
|
||||
$this->assertNotContains('MyClass_InHeredocString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['parents']));
|
||||
$this->assertNotContains('MyClass_InHeredocString', array_keys($manifestInfo['globals']['_ALL_CLASSES']['hastable']));
|
||||
}
|
||||
|
||||
|
||||
protected $originalClassManifest, $originalProject;
|
||||
|
||||
function setUp() {
|
||||
include('tests/ManifestBuilderTest.fixture.inc');
|
||||
|
||||
@ -62,9 +99,17 @@ class ManifestBuilderTest extends SapphireTest {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
global $_CLASS_MANIFEST, $project;
|
||||
$this->originalClassManifest = $_CLASS_MANIFEST;
|
||||
$this->originalProject = $project;
|
||||
}
|
||||
|
||||
function tearDown() {
|
||||
global $_CLASS_MANIFEST, $project;
|
||||
$project = $this->originalProject;
|
||||
$_CLASS_MANIFEST = $this->originalClassManifest;
|
||||
|
||||
// Kill the folder after we're done
|
||||
$baseFolder = TEMP_FOLDER . '/manifest-test/';
|
||||
Filesystem::removeFolder($baseFolder);
|
||||
|
Loading…
Reference in New Issue
Block a user