Use reflection and reflectiondocblock

Load the original docblock and append the changes. This way, you can
just copy the new comments in whole (next step, replace in file..)
This commit is contained in:
Barry vd. Heuvel
2013-05-30 11:54:45 +02:00
parent dab594804b
commit b0b324b8cc
+39 -13
View File
@@ -13,6 +13,10 @@ use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\ClassLoader\ClassMapGenerator; use Symfony\Component\ClassLoader\ClassMapGenerator;
use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
/** /**
* A command to generate autocomplete information for your IDE * A command to generate autocomplete information for your IDE
* *
@@ -291,16 +295,30 @@ class ModelsCommand extends Command {
*/ */
protected function createPhpDocs($class){ protected function createPhpDocs($class){
if(strpos($class, '\\') !== false){ $reflection = new \ReflectionClass($class);
$parts = explode('\\', $class); $namespace = $reflection->getNamespaceName();
$class = array_pop($parts); $phpdoc = new DocBlock($reflection, new Context($namespace));
$namespace = implode($parts, '\\');
}else{ if(!$phpdoc->getText()){
$namespace = ''; $phpdoc->setText("Generated properties for $class");
} }
$output = "namespace $namespace{\n";
$output .= "\t/**\n\t *\n\t * Generated properties for $class\n\t *\n"; $properties = array();
$methods = array();
foreach($phpdoc->getTags() as $tag){
$name = $tag->getName();
if($name == "property" || $name == "property-read" || $name == "property-write"){
$properties[] =$tag->getVariableName();
}elseif($name == "method"){
$methods[] = $tag->getMethodName();
}
}
foreach($this->properties as $name => $property){ foreach($this->properties as $name => $property){
$name = "\$$name";
if(in_array($name, $properties)){
continue;
}
if($property['read'] && $property['write']){ if($property['read'] && $property['write']){
$attr = 'property'; $attr = 'property';
}elseif($property['write']){ }elseif($property['write']){
@@ -308,16 +326,24 @@ class ModelsCommand extends Command {
}else{ }else{
$attr = 'property-read'; $attr = 'property-read';
} }
$type = $property['type']; $tag = Tag::createInstance("@{$attr} {$property['type']} {$name}", $phpdoc);
$output .= "\t * @$attr $type \$$name \n"; $phpdoc->appendTag($tag);
} }
foreach($this->methods as $name => $method){ foreach($this->methods as $name => $method){
$type = $method['type']; if(in_array($name, $methods)){
$output .= "\t * @method $type $name() \n"; continue;
}
$name = "$name()";
$tag = Tag::createInstance("@method {$method['type']} {$name}", $phpdoc);
$phpdoc->appendTag($tag);
} }
$output .= "\t *\n\t */\n\tclass $class {}\n}\n\n"; $serializer = new DocBlockSerializer(1, "\t");
$serializer->getDocComment($phpdoc);
$docComment = $serializer->getDocComment($phpdoc);
$output = "namespace {$namespace}{\n{$docComment}\n\tclass {$class} {}\n}\n\n";
return $output; return $output;
} }