Compare commits

..
12 Commits
Author SHA1 Message Date
Barry vd. Heuvel 28ce1492ad Update namespace for ReflectionDocblock 2013-08-08 19:09:24 +02:00
Barry vd. Heuvel d9516325f0 Add magic methods
Adds the magic calls to Log::error() etc. Perhaps more to come.
Fixes #27
2013-08-08 18:20:43 +02:00
Barry vd. Heuvel d1e396f658 Move back to original phpdocumentor/reflection-docblock
Because it is stable now.
2013-08-08 17:58:31 +02:00
Barry vd. Heuvel a916da0ce4 Make deferred 2013-08-05 13:52:44 +02:00
Barry vd. Heuvel fc887b4431 Clarify readme 2013-07-31 10:35:22 +02:00
Barry vd. Heuvel 7b08db2682 Catch PDO errors when getting drivers/connections 2013-07-31 10:33:32 +02:00
Barry vd. Heuvel 742aeb2f56 Add --dir option to readme
As described in #18
2013-07-29 16:32:40 +02:00
Barry vd. Heuvel c1619fd6b3 Merge pull request #28 from tortuetorche/patch-1
Loading helper files is broken in GeneratorCommand.php
2013-07-26 05:38:41 -07:00
Tortue Torche 1a593833a2 Fix wrong var name $helpers to correctly load helper files in GeneratorCommand.php. 2013-07-26 13:07:30 +02:00
Barry vd. Heuvel e9cbd7e732 Allow 4.1 (and future version) 2013-07-04 14:30:33 +02:00
Barry vd. Heuvel ac6740f59f Change aliasing way back
Not really nice in NetBeans.
Also reference the calling class and show the implementing class in
comments (phpStorm will understand it anyways)
2013-07-04 14:26:17 +02:00
Barry vd. Heuvel 60ec740b15 Update CodeIntel link 2013-07-02 22:22:56 +02:00
6 changed files with 104 additions and 61 deletions
+5 -5
View File
@@ -11,11 +11,11 @@
], ],
"require": { "require": {
"php": ">=5.3.0", "php": ">=5.3.0",
"illuminate/support": "4.0.x", "illuminate/support": "4.x",
"illuminate/console": "4.0.x", "illuminate/console": "4.x",
"illuminate/filesystem": "4.0.x", "illuminate/filesystem": "4.x",
"barryvdh/reflection-docblock": ">=2.0.1", "phpdocumentor/reflection-docblock": "2.0.0",
"symfony/class-loader": "2.3.*" "symfony/class-loader": "~2.3"
}, },
"autoload": { "autoload": {
"psr-0": { "psr-0": {
+7 -3
View File
@@ -8,7 +8,7 @@ If you don't want to generate it, you can add a pre-generated file to the root f
* Generated version: https://gist.github.com/barryvdh/5227822 * Generated version: https://gist.github.com/barryvdh/5227822
Note: You do need CodeIntel for Sublime Text: https://github.com/Kronuz/SublimeCodeIntel Note: You do need CodeIntel for Sublime Text: https://github.com/SublimeCodeIntel/SublimeCodeIntel
### Automatic phpDoc generation for Laravel Facades ### Automatic phpDoc generation for Laravel Facades
@@ -73,11 +73,15 @@ With the `--reset (-R)` option, the existing phpdocs are ignored, only the newly
* @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments * @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
*/ */
For now, only models in app/models are scanned. The optional argument tells what models to use (also outside app/models). By default, models in app/models are scanned. The optional argument tells what models to use (also outside app/models).
php artisan ide-helper:models Post,User php artisan ide-helper:models Post,User
Note: With namespaces, uses `\\` instead of `\`: `php artisan ide-helper:models API\\User` You can also scan a different directory, using the --dir option (relative from the base path):
php artisan ide-helper:models --dir="app/workbench/name/package/models"
Note: With namespaces, wrap your model name in " signs: `php artisan ide-helper:models "API\User"`, or escape the slashes (`Api\\User`)
### License ### License
@@ -13,10 +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 Illuminate\Foundation\AliasLoader; use Illuminate\Foundation\AliasLoader;
use Barryvdh\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Context; use phpDocumentor\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer; 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
* *
@@ -41,6 +41,7 @@ class GeneratorCommand extends Command {
protected $extra; protected $extra;
protected $onlyExtend; protected $onlyExtend;
protected $helpers; protected $helpers;
protected $magic;
/** /**
@@ -60,6 +61,7 @@ class GeneratorCommand extends Command {
} }
$this->extra = \Config::get('laravel-ide-helper::extra'); $this->extra = \Config::get('laravel-ide-helper::extra');
$this->magic = \Config::get('laravel-ide-helper::magic');
if( $this->option('helpers') || (\Config::get('laravel-ide-helper::include_helpers') )){ if( $this->option('helpers') || (\Config::get('laravel-ide-helper::include_helpers') )){
$this->helpers = \Config::get('laravel-ide-helper::helper_files'); $this->helpers = \Config::get('laravel-ide-helper::helper_files');
@@ -168,6 +170,11 @@ exit('Only to be used as an helper for your IDE');\n\n";
$output .= $this->getMethods($this->extra[$alias], $alias, $usedMethods); $output .= $this->getMethods($this->extra[$alias], $alias, $usedMethods);
} }
//Add extra methods, from other classes (magic static calls)
if(array_key_exists($alias, $this->magic)){
$output .= $this->addMagicMethods($this->magic[$alias], $alias, $usedMethods);
}
$output .= "}\n\n"; $output .= "}\n\n";
@@ -178,8 +185,8 @@ exit('Only to be used as an helper for your IDE');\n\n";
} }
//Include the helper file, if requested //Include the helper file, if requested
if(!empty($helpers)){ if(!empty($this->helpers)){
foreach($helpers as $helper){ foreach($this->helpers as $helper){
if (file_exists($helper)){ if (file_exists($helper)){
$output .= str_replace(array('<?php', '?>'), '', \File::get($helper)); $output .= str_replace(array('<?php', '?>'), '', \File::get($helper));
} }
@@ -224,19 +231,24 @@ exit('Only to be used as an helper for your IDE');\n\n";
} }
public function getDriver($alias){ public function getDriver($alias){
if($alias == "Auth"){ try{
$driver = \Auth::driver(); if($alias == "Auth"){
}elseif($alias == "DB"){ $driver = \Auth::driver();
$driver = \DB::connection(); }elseif($alias == "DB"){
}elseif($alias == "Cache"){ $driver = \DB::connection();
$driver = \Cache::driver(); }elseif($alias == "Cache"){
}elseif($alias == "Queue"){ $driver = \Cache::driver();
$driver = \Queue::connection(); }elseif($alias == "Queue"){
}else{ $driver = \Queue::connection();
}else{
return false;
}
return get_class($driver);
}catch(\Exception $e){
$this->error("Could not determine driver/connection for $alias.");
return false; return false;
} }
return get_class($driver);
} }
/** /**
@@ -276,18 +288,52 @@ exit('Only to be used as an helper for your IDE');\n\n";
return $output; return $output;
} }
/**
* Get the methods for one or multiple magic methods.
*
* @param $methods
* @param $alias
* @param $usedMethods
* @param bool $addOutput
* @return string
*/
protected function addMagicMethods($methods, $alias, &$usedMethods, $addOutput = true){
$output = '';
foreach($methods as $magic => $real){
list($className, $name) = explode('::', $real);
if(!class_exists($className) && !interface_exists($className)){
continue;
}
$method = new \ReflectionMethod($className, $name);
$class = new \ReflectionClass($className);
if(!in_array($method->name, $usedMethods)){
if( $addOutput){
$output .= $this->parseMethod($method, $alias, $class, $magic);
}
$usedMethods[] = $method->name;
}
$usedMethods[] = $magic;
}
return $output;
}
/** /**
* @param \ReflectionMethod $method * @param \ReflectionMethod $method
* @param string $alias * @param string $alias
* @return string * @return string
*/ */
protected function parseMethod($method, $alias, $class){ protected function parseMethod($method, $alias, $class, $methodName = null){
$output = ''; $output = '';
// Don't add the __clone() functions // Don't add the __clone() functions
if($method->name === '__clone'){ if($method->name === '__clone'){
return $output; return $output;
} }
$methodName = $methodName ?: $method->name;
$namespace = $method->getDeclaringClass()->getNamespaceName(); $namespace = $method->getDeclaringClass()->getNamespaceName();
@@ -299,7 +345,7 @@ exit('Only to be used as an helper for your IDE');\n\n";
$this->normalizeDescription($phpdoc, $method); $this->normalizeDescription($phpdoc, $method);
//Correct the return values //Correct the return values
$returnValue = $this->normalizeReturn($phpdoc, $method, $alias); $returnValue = $this->getReturn($phpdoc);
//Get the parameters, including formatted default values //Get the parameters, including formatted default values
list($params, $paramsWithDefault) = $this->getParameters($method); list($params, $paramsWithDefault) = $this->getParameters($method);
@@ -308,35 +354,23 @@ exit('Only to be used as an helper for your IDE');\n\n";
$phpdoc->appendTag(Tag::createInstance('@static', $phpdoc)); $phpdoc->appendTag(Tag::createInstance('@static', $phpdoc));
//Write the output, using the DocBlock serializer //Write the output, using the DocBlock serializer
$output .= $serializer->getDocComment($phpdoc) ."\n\t public static function ".$method->name."("; $output .= $serializer->getDocComment($phpdoc) ."\n\t public static function ".$methodName."(";
$output .= implode($paramsWithDefault, ", "); $output .= implode($paramsWithDefault, ", ");
$output .= "){\r\n"; $output .= "){\r\n";
//Only return when not a constructor and not void. //Only return when not a constructor and not void.
$return = ($returnValue && $returnValue !== "void" && $method->name !== "__construct") ? 'return ' : ''; $return = ($returnValue && $returnValue !== "void" && $method->name !== "__construct") ? 'return' : '';
//Reference the 'real' function in the declaringclass //Reference the 'real' function in the declaringclass
$declaringClass = $method->getDeclaringClass(); $declaringClass = $method->getDeclaringClass();
if($declaringClass->isAbstract()){ $root = $class->getName();
$declaringClass = $class;
if($declaringClass->name != $root){
$output .= "\t\t//Method inherited from $declaringClass->name\r\n";
} }
$constructor = $declaringClass->getConstructor(); $output .= "\t\t$return $root::";
$root = $declaringClass->getName();
$output .= "\t\t\$root = new \\$root(";
if(!is_null($constructor)){
$constructorParams = array();
for($i=0;$i<$constructor->getNumberOfRequiredParameters();$i++){
$constructorParams[] = 'null';
}
$output .= implode($constructorParams, ',');
}
$output .= ");\n";
$output .= "\t\t$return\$root->";
//Write the default parameters in the function call //Write the default parameters in the function call
$output .= $method->name."(".implode($params, ", ").");\r\n"; $output .= $method->name."(".implode($params, ", ").");\r\n";
@@ -378,23 +412,15 @@ exit('Only to be used as an helper for your IDE');\n\n";
* Make some changes to the return types, if needed. * Make some changes to the return types, if needed.
* *
* @param $phpdoc * @param $phpdoc
* @param $method * @return string|null
* @param $alias
* @return null
*/ */
protected function normalizeReturn(&$phpdoc, $method, $alias){ protected function getReturn($phpdoc){
//Get the return type and adjust them for beter autocomplete //Get the return type and adjust them for beter autocomplete
$returnTags = $phpdoc->getTagsByName('return'); $returnTags = $phpdoc->getTagsByName('return');
if($returnTags){ if($returnTags){
/** @var $tag */ /** @var $tag */
$tag = reset($returnTags); $tag = reset($returnTags);
$returnValue = $tag->getType(); $returnValue = $tag->getType();
if($method->name == "__construct"){
$tag->setType('self');
}elseif($alias == 'Eloquent' and in_array($method->name, array('hasOne', 'hasMany', 'belongsTo', 'belongsToMany', 'morphOne', 'morphTo', 'morphMany'))){
$tag->addType('\Eloquent');
}
}else{ }else{
$returnValue = null; $returnValue = null;
} }
@@ -19,7 +19,7 @@ class IdeHelperServiceProvider extends ServiceProvider {
* *
* @var bool * @var bool
*/ */
protected $defer = false; protected $defer = true;
/** /**
* Bootstrap the application events. * Bootstrap the application events.
@@ -13,10 +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 Barryvdh\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Context; use phpDocumentor\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer; 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
* *
+13
View File
@@ -43,4 +43,17 @@ return array(
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'), 'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'),
), ),
'magic' => array(
'Log' => array(
'debug' => 'Monolog\Logger::addDebug',
'info' => 'Monolog\Logger::addInfo',
'notice' => 'Monolog\Logger::addNotice',
'warning' => 'Monolog\Logger::addWarning',
'error' => 'Monolog\Logger::addError',
'critical' => 'Monolog\Logger::addCritical',
'alert' => 'Monolog\Logger::addAlert',
'emergency' => 'Monolog\Logger::addEmergency',
)
)
); );