Fix namespace/class parsing in the entity generator
This commit is contained in:
parent
ea5a623c88
commit
0c955fe54f
@ -179,7 +179,7 @@ public function <methodName>()
|
|||||||
$this->_isNew = !file_exists($path) || (file_exists($path) && $this->_regenerateEntityIfExists);
|
$this->_isNew = !file_exists($path) || (file_exists($path) && $this->_regenerateEntityIfExists);
|
||||||
|
|
||||||
if ( ! $this->_isNew) {
|
if ( ! $this->_isNew) {
|
||||||
$this->_parseTokensInEntityFile($path);
|
$this->_parseTokensInEntityFile(file_get_contents($path));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->_backupExisting && file_exists($path)) {
|
if ($this->_backupExisting && file_exists($path)) {
|
||||||
@ -400,24 +400,42 @@ public function <methodName>()
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @todo this won't work if there is a namespace in brackets and a class outside of it.
|
* @todo this won't work if there is a namespace in brackets and a class outside of it.
|
||||||
* @param string $path
|
* @param string $src
|
||||||
*/
|
*/
|
||||||
private function _parseTokensInEntityFile($path)
|
private function _parseTokensInEntityFile($src)
|
||||||
{
|
{
|
||||||
$tokens = token_get_all(file_get_contents($path));
|
$tokens = token_get_all($src);
|
||||||
$lastSeenNamespace = "";
|
$lastSeenNamespace = "";
|
||||||
$lastSeenClass = false;
|
$lastSeenClass = false;
|
||||||
|
|
||||||
|
$inNamespace = false;
|
||||||
|
$inClass = false;
|
||||||
for ($i = 0; $i < count($tokens); $i++) {
|
for ($i = 0; $i < count($tokens); $i++) {
|
||||||
$token = $tokens[$i];
|
$token = $tokens[$i];
|
||||||
if ($token[0] == T_NAMESPACE) {
|
if (in_array($token[0], array(T_WHITESPACE, T_COMMENT, T_DOC_COMMENT))) {
|
||||||
$lastSeenNamespace = $tokens[$i+2][1] . "\\";
|
continue;
|
||||||
} else if ($token[0] == T_NS_SEPARATOR) {
|
}
|
||||||
$lastSeenNamespace .= $tokens[$i+1][1] . "\\";
|
|
||||||
} else if ($token[0] == T_CLASS) {
|
if ($inNamespace) {
|
||||||
$lastSeenClass = $lastSeenNamespace . $tokens[$i+2][1];
|
if ($token[0] == T_NS_SEPARATOR || $token[0] == T_STRING) {
|
||||||
|
$lastSeenNamespace .= $token[1];
|
||||||
|
} else if (is_string($token) && in_array($token, array(';', '{'))) {
|
||||||
|
$inNamespace = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inClass) {
|
||||||
|
$inClass = false;
|
||||||
|
$lastSeenClass = $lastSeenNamespace . '\\' . $token[1];
|
||||||
$this->_staticReflection[$lastSeenClass]['properties'] = array();
|
$this->_staticReflection[$lastSeenClass]['properties'] = array();
|
||||||
$this->_staticReflection[$lastSeenClass]['methods'] = array();
|
$this->_staticReflection[$lastSeenClass]['methods'] = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token[0] == T_NAMESPACE) {
|
||||||
|
$lastSeenNamespace = "";
|
||||||
|
$inNamespace = true;
|
||||||
|
} else if ($token[0] == T_CLASS) {
|
||||||
|
$inClass = true;
|
||||||
} else if ($token[0] == T_FUNCTION) {
|
} else if ($token[0] == T_FUNCTION) {
|
||||||
if ($tokens[$i+2][0] == T_STRING) {
|
if ($tokens[$i+2][0] == T_STRING) {
|
||||||
$this->_staticReflection[$lastSeenClass]['methods'][] = $tokens[$i+2][1];
|
$this->_staticReflection[$lastSeenClass]['methods'][] = $tokens[$i+2][1];
|
||||||
|
@ -200,6 +200,54 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase
|
|||||||
$this->assertEquals($cm->idGenerator, $metadata->idGenerator);
|
$this->assertEquals($cm->idGenerator, $metadata->idGenerator);
|
||||||
$this->assertEquals($cm->customRepositoryClassName, $metadata->customRepositoryClassName);
|
$this->assertEquals($cm->customRepositoryClassName, $metadata->customRepositoryClassName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getParseTokensInEntityFileData
|
||||||
|
*/
|
||||||
|
public function testParseTokensInEntityFile($php, $classes)
|
||||||
|
{
|
||||||
|
$r = new \ReflectionObject($this->_generator);
|
||||||
|
$m = $r->getMethod('_parseTokensInEntityFile');
|
||||||
|
$m->setAccessible(true);
|
||||||
|
|
||||||
|
$p = $r->getProperty('_staticReflection');
|
||||||
|
$p->setAccessible(true);
|
||||||
|
|
||||||
|
$ret = $m->invoke($this->_generator, $php);
|
||||||
|
$this->assertEquals($classes, array_keys($p->getValue($this->_generator)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getParseTokensInEntityFileData()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'<?php namespace Foo\Bar; class Baz {}',
|
||||||
|
array('Foo\Bar\Baz'),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'<?php namespace Foo\Bar; use Foo; class Baz {}',
|
||||||
|
array('Foo\Bar\Baz'),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'<?php namespace /*Comment*/ Foo\Bar; /** Foo */class /* Comment */ Baz {}',
|
||||||
|
array('Foo\Bar\Baz'),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'
|
||||||
|
<?php namespace
|
||||||
|
/*Comment*/
|
||||||
|
Foo\Bar
|
||||||
|
;
|
||||||
|
|
||||||
|
/** Foo */
|
||||||
|
class
|
||||||
|
/* Comment */
|
||||||
|
Baz {}
|
||||||
|
',
|
||||||
|
array('Foo\Bar\Baz'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class EntityGeneratorAuthor {}
|
class EntityGeneratorAuthor {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user