Compare commits

...
8 Commits
Author SHA1 Message Date
Barry vd. Heuvel 16b3b872a3 Update license (MIT)
To source/readme
2013-05-29 10:24:30 +02:00
Barry vd. Heuvel 507775fda6 Update version in readme 2013-05-28 20:48:07 +02:00
Barry vd. Heuvel 83ab04be40 Update composer 2013-05-28 17:00:09 +02:00
Barry vd. Heuvel 8e0eace591 Specify version for new beta2 2013-05-27 22:22:23 +02:00
Barry vd. Heuvel 9dbcaa15b1 More fixes 2013-05-27 21:23:52 +02:00
Barry vd. Heuvel edf418f9ac Refactor variables and better namespace support 2013-05-27 21:02:46 +02:00
Barry vd. Heuvel eb3c3a7fe3 Add namespace DocBlock context
So they can be expanded correctly
2013-05-27 20:45:04 +02:00
Barry vd. Heuvel fde71b0ee8 Use DocBlock Serializer
Instead of doing it here.
2013-05-26 23:10:09 +02:00
5 changed files with 101 additions and 65 deletions
+3 -1
View File
@@ -1,6 +1,8 @@
{ {
"name": "barryvdh/laravel-ide-helper", "name": "barryvdh/laravel-ide-helper",
"description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.",
"keywords": ["laravel", "autocomplete", "phpstorm", "netbeans", "sublime", "codeintel", "phpdoc"],
"license": "MIT",
"authors": [ "authors": [
{ {
"name": "Barry vd. Heuvel", "name": "Barry vd. Heuvel",
@@ -12,7 +14,7 @@
"illuminate/support": "4.0.x", "illuminate/support": "4.0.x",
"illuminate/console": "4.0.x", "illuminate/console": "4.0.x",
"illuminate/filesystem": "4.0.x", "illuminate/filesystem": "4.0.x",
"phpdocumentor/reflection-docblock": "2.0.*", "phpdocumentor/reflection-docblock": "dev-master#6d705c1a0f9e2a6d73d2e9ec0e538b9dfaf4315f",
"symfony/class-loader": "2.3.*" "symfony/class-loader": "2.3.*"
}, },
"autoload": { "autoload": {
+4 -1
View File
@@ -11,7 +11,7 @@ Add the helper file to your laravel folder (not in a public folder). The file is
Require this package in your composer.json: Require this package in your composer.json:
"barryvdh/laravel-ide-helper": "dev-master" "barryvdh/laravel-ide-helper": "1.*"
And add the ServiceProvider to the providers array in app/config/app.php And add the ServiceProvider to the providers array in app/config/app.php
@@ -67,3 +67,6 @@ Also, all relations are Eloquent|Eloquent[] by default, you can change them to t
After copying the phpdocs to your model, you can clear the file, so your IDE only uses the real source. After copying the phpdocs to your model, you can clear the file, so your IDE only uses the real source.
### License
The Laravel IDE Helper Generator is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
@@ -1,9 +1,22 @@
<?php namespace Barryvdh\LaravelIdeHelper; <?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link https://github.com/barryvdh/laravel-ide-helper
*/
namespace Barryvdh\LaravelIdeHelper;
use Illuminate\Console\Command; 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 DocBlock\Parser;
use Illuminate\Foundation\AliasLoader; use Illuminate\Foundation\AliasLoader;
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
* *
@@ -25,6 +38,12 @@ class GeneratorCommand extends Command {
*/ */
protected $description = 'Generate a new IDE Helper file.'; protected $description = 'Generate a new IDE Helper file.';
protected $extra;
protected $nonstatic;
protected $onlyExtend;
protected $helpers;
protected $sublime;
/** /**
* Execute the console command. * Execute the console command.
@@ -39,19 +58,19 @@ class GeneratorCommand extends Command {
$this->useMemoryDriver(); $this->useMemoryDriver();
} }
$extra = \Config::get('laravel-ide-helper::extra'); $this->extra = \Config::get('laravel-ide-helper::extra');
$nonstatic = \Config::get('laravel-ide-helper::nonstatic'); $this->nonstatic = \Config::get('laravel-ide-helper::nonstatic');
$onlyExtend = \Config::get('laravel-ide-helper::only_extend'); $this->onlyExtend = \Config::get('laravel-ide-helper::only_extend');
if( $this->option('helpers') || (\Config::get('laravel-ide-helper::include_helpers') && ! $this->option('nohelpers'))){ if( $this->option('helpers') || (\Config::get('laravel-ide-helper::include_helpers') && ! $this->option('nohelpers'))){
$helpers = \Config::get('laravel-ide-helper::helper_files'); $this->helpers = \Config::get('laravel-ide-helper::helper_files');
}else{ }else{
$helpers = array(); $this->helpers = array();
} }
$sublime = $this->option('sublime') || \Config::get('laravel-ide-helper::sublime'); $this->sublime = $this->option('sublime') || \Config::get('laravel-ide-helper::sublime');
$content = $this->generateDocs($extra, $nonstatic, $onlyExtend, $helpers, $sublime); $content = $this->generateDocs();
$written = \File::put($filename, $content); $written = \File::put($filename, $content);
@@ -99,14 +118,11 @@ class GeneratorCommand extends Command {
} }
/** /**
* @param array $extra * Generate the docs for all facades in the AliasLoader
* @param array $nonstatic *
* @param array $onlyExtend
* @param array $helpers
* @param bool $sublime
* @return string * @return string
*/ */
protected function generateDocs($extra = array(), $nonstatic = array(), $onlyExtend = array(), $helpers = array(), $sublime = false){ protected function generateDocs(){
$aliasLoader = AliasLoader::getInstance(); $aliasLoader = AliasLoader::getInstance();
@@ -155,7 +171,7 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
$output .= "namespace $namespace {\n"; $output .= "namespace $namespace {\n";
if($root !== $facade or in_array($alias, $onlyExtend)){ if($root !== $facade or in_array($alias, $this->onlyExtend)){
//If the root class is not the same as the facade extend it. //If the root class is not the same as the facade extend it.
$output .= " class $alias extends $facade{\n"; $output .= " class $alias extends $facade{\n";
}else{ }else{
@@ -163,11 +179,11 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
} }
$output .= "\t/**\n\t * @var \\$root \$root\n\t */\n\t static private \$root;\n\n"; $output .= "\t/**\n\t * @var \\$root \$root\n\t */\n\t static private \$root;\n\n";
if(!in_array($alias, $onlyExtend)) if(!in_array($alias, $this->onlyExtend))
{ {
$usedMethods = array(); $usedMethods = array();
if(array_key_exists($alias, $nonstatic) ){ if(array_key_exists($alias, $this->nonstatic) ){
$nonstaticMethods = $nonstatic[$alias]; $nonstaticMethods = $this->nonstatic[$alias];
}else{ }else{
$nonstaticMethods = array(); $nonstaticMethods = array();
} }
@@ -180,15 +196,15 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
{ {
if(!in_array($method->name, $usedMethods)){ if(!in_array($method->name, $usedMethods)){
$static = !in_array($method->name, $nonstaticMethods); $static = !in_array($method->name, $nonstaticMethods);
$output .= $this->parseMethod($method, $alias, $root, $sublime, $static); $output .= $this->parseMethod($method, $alias, $root, $static);
$usedMethods[] = $method->name; $usedMethods[] = $method->name;
} }
} }
} }
if(array_key_exists($alias, $extra)){ if(array_key_exists($alias, $this->extra)){
$i = 2; $i = 2;
foreach($extra[$alias] as $extraClass){ foreach($this->extra[$alias] as $extraClass){
if(!class_exists($extraClass) && !interface_exists($extraClass)){ if(!class_exists($extraClass) && !interface_exists($extraClass)){
continue; continue;
} }
@@ -203,7 +219,7 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
{ {
if(!in_array($method->name, $usedMethods)){ if(!in_array($method->name, $usedMethods)){
$static = !in_array($method->name, $nonstaticMethods); $static = !in_array($method->name, $nonstaticMethods);
$output .= $this->parseMethod($method, $alias, $extraClass, $sublime, $static, $rootParam); $output .= $this->parseMethod($method, $alias, $extraClass, $static, $rootParam);
$usedMethods[] = $method->name; $usedMethods[] = $method->name;
} }
@@ -236,33 +252,30 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
* @param \ReflectionMethod $method * @param \ReflectionMethod $method
* @param string $alias * @param string $alias
* @param string $root * @param string $root
* @param bool $sublime
* @param bool $static * @param bool $static
* @param string $rootParam * @param string $rootParam
* @return string * @return string
*/ */
protected function parseMethod($method, $alias, $root, $sublime, $static = true, $rootParam = 'root'){ protected function parseMethod($method, $alias, $root, $static = true, $rootParam = 'root'){
$output = ''; $output = '';
if($method->name === '__clone'){ if($method->name === '__clone'){
return $output; return $output;
} }
$phpdoc = new \phpDocumentor\Reflection\DocBlock($method); $namespace = $method->getDeclaringClass()->getNamespaceName();
$phpdoc = new DocBlock($method, new Context($namespace));
$serializer = new DocBlockSerializer(1, "\t");
$description = $phpdoc->getText();
$description = $phpdoc->getShortDescription();
$longDescription = $phpdoc->getLongDescription()->getContents();
if($longDescription){
$description .= "\n".$longDescription;
}
if(strpos($description, '{@inheritdoc}') !== false){ if(strpos($description, '{@inheritdoc}') !== false){
$inheritdoc = $this->getInheritDoc($method); $inheritdoc = $this->getInheritDoc($method);
$inheritDescription = $inheritdoc->getShortDescription(); $inheritDescription = $inheritdoc->getText();
$inheritLongDescription = $inheritdoc->getLongDescription()->getContents();
if($inheritLongDescription){
$inheritDescription .= "\n".$inheritLongDescription;
}
$description = str_replace('{@inheritdoc}', $inheritDescription, $description); $description = str_replace('{@inheritdoc}', $inheritDescription, $description);
$phpdoc->setText($description);
$inheritTags = $inheritdoc->getTags(); $inheritTags = $inheritdoc->getTags();
if($inheritTags){ if($inheritTags){
foreach($inheritTags as $tag){ foreach($inheritTags as $tag){
@@ -271,46 +284,44 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
} }
} }
} }
$description = str_replace("\n", "\n\t * ", $description);
$output .= "\t/**\n\t * ".$description."\n";
$output .= "\t *\n\t * @static\n";
$phpdoc->appendTag(Tag::createInstance('@static', $phpdoc));
//Looping through the parameters and re-setting the type, to get the expanded type (with namespace)
//Should be fixed in a future version of ReflectionDocBlock I hope..
$paramTags = $phpdoc->getTagsByName('param'); $paramTags = $phpdoc->getTagsByName('param');
if(!empty($paramTags)){ if($paramTags){
foreach ($paramTags as $tag) /** @var $tag */
{ foreach($paramTags as $tag){
$output .="\t * @param\t".$tag->getType()."\t".$tag->getVariableName()."\t".$tag->getDescription()."\n"; $content = $tag->getContent();
//Closure should be \Closure..
$content = str_replace('\Closure', 'Closure', $content);
$content = str_replace('Closure', '\Closure', $content);
$tag->setContent($content);
$tag->setContent($tag->getType() . ' ' . $tag->getVariableName() . ' ' . $tag->getDescription());
} }
} }
$returnTags = $phpdoc->getTagsByName('return'); $returnTags = $phpdoc->getTagsByName('return');
if($returnTags){ if($returnTags){
/** @var $tag */
$tag = reset($returnTags); $tag = reset($returnTags);
$returnValue = $tag->getType(); $returnValue = $tag->getType();
if(!$sublime and $alias == 'Eloquent' and if(!$this->sublime and $alias == 'Eloquent' and
(in_array($method->name, array('pluck', 'first', 'fill', 'newInstance', 'newFromBuilder', 'create', 'find', 'findOrFail')) (in_array($method->name, array('pluck', 'first', 'fill', 'newInstance', 'newFromBuilder', 'create', 'find', 'findOrFail'))
or $returnValue === '\Illuminate\Database\Query\Builder')){ or $returnValue === '\Illuminate\Database\Query\Builder')){
//Reference the calling class, to provide more accurate auto-complete //Reference the calling class, to provide more accurate auto-complete
$returnValue = "static"; $returnValue = "static";
}elseif(!$sublime and $alias == 'Eloquent' and in_array($method->name, array('all', 'get'))){ }elseif(!$this->sublime and $alias == 'Eloquent' and in_array($method->name, array('all', 'get'))){
$returnValue .= "|Eloquent[]|static[]"; $returnValue .= "|\Eloquent[]|static[]";
} }
$output .= "\t * @return\t".$returnValue."\t".$tag->getDescription()."\n"; $tag->setContent($returnValue . " ". $tag->getDescription());
}else{ }else{
$returnValue = null; $returnValue = null;
} }
$allTags = $phpdoc->getTags(); $output .= $serializer->getDocComment($phpdoc) ."\n\t public ".($static ? 'static' : '')." function ".$method->name."(";
if($allTags){
foreach($allTags as $tag){
if(!in_array($tag->getName(), array('return', 'param'))){
$output .= "\t * @".$tag->getName() ." ". $tag->getContent()."\n";
}
}
}
$output .= "\t */\n\t public ".($static ? 'static' : '')." function ".$method->name."(";
$params = array(); $params = array();
$paramsWithDefault = array(); $paramsWithDefault = array();
@@ -337,9 +348,9 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
$output .= implode($paramsWithDefault, ", "); $output .= implode($paramsWithDefault, ", ");
$output .= "){\r\n"; $output .= "){\r\n";
$return = $returnValue !== "void" ? 'return' : ''; $return = ($returnValue && $returnValue !== "void") ? 'return' : '';
if($sublime){ if($this->sublime){
$output .= "\t\t\$$rootParam = new $root();\r\n"; $output .= "\t\t\$$rootParam = new $root();\r\n";
$output .= "\t\t$return \$$rootParam->"; $output .= "\t\t$return \$$rootParam->";
}else{ }else{
@@ -364,8 +375,8 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
$method = $reflectionMethod->getPrototype(); $method = $reflectionMethod->getPrototype();
} }
if($method){ if($method){
$phpdoc = new \phpDocumentor\Reflection\DocBlock($method); $phpdoc = new DocBlock($method);
if(strpos($phpdoc->getShortDescription(), '{@inheritdoc}') !== false || strpos($phpdoc->getLongDescription(), '{@inheritdoc}') !== false ){ if(strpos($phpdoc->getText(), '{@inheritdoc}') !== false ){
//Not at the end yet, try another parent/interface.. //Not at the end yet, try another parent/interface..
return $this->getInheritDoc($method); return $this->getInheritDoc($method);
}else{ }else{
@@ -1,4 +1,14 @@
<?php namespace Barryvdh\LaravelIdeHelper; <?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link https://github.com/barryvdh/laravel-ide-helper
*/
namespace Barryvdh\LaravelIdeHelper;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@@ -1,4 +1,14 @@
<?php namespace Barryvdh\LaravelIdeHelper; <?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link https://github.com/barryvdh/laravel-ide-helper
*/
namespace Barryvdh\LaravelIdeHelper;
use Illuminate\Console\Command; 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;