mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 18:13:11 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d7f124089 | ||
|
|
32df0a3bc6 | ||
|
|
2f8283a746 | ||
|
|
2a63b31475 | ||
|
|
494d1593c8 | ||
|
|
e513fb34dc | ||
|
|
5db82752ef | ||
|
|
1f555bc194 | ||
|
|
b0ce5325de | ||
|
|
aeae59d0af | ||
|
|
001719245c | ||
|
|
99226c92b7 | ||
|
|
dda63bf8df | ||
|
|
3d7f45479e | ||
|
|
7905dd3926 | ||
|
|
8d135a1dea | ||
|
|
858e730c00 | ||
|
|
2ab961e734 |
+1
-1
@@ -20,7 +20,7 @@ matrix:
|
|||||||
env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"'
|
env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"'
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-dist
|
- travis_wait 20 travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-dist
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- vendor/bin/phpcs --standard=psr2 src/
|
- vendor/bin/phpcs --standard=psr2 src/
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@
|
|||||||
"illuminate/support": "^5.5,<5.8",
|
"illuminate/support": "^5.5,<5.8",
|
||||||
"illuminate/console": "^5.5,<5.8",
|
"illuminate/console": "^5.5,<5.8",
|
||||||
"illuminate/filesystem": "^5.5,<5.8",
|
"illuminate/filesystem": "^5.5,<5.8",
|
||||||
"barryvdh/reflection-docblock": "^2.0.4",
|
"barryvdh/reflection-docblock": "^2.0.6",
|
||||||
"composer/composer": "^1.6"
|
"composer/composer": "^1.6"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|||||||
@@ -38,6 +38,21 @@ return array(
|
|||||||
|
|
||||||
'write_model_magic_where' => true,
|
'write_model_magic_where' => true,
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Write Eloquent Model Mixins
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This will add the necessary DocBlock mixins to the model class
|
||||||
|
| contained in the Laravel Framework. This helps the IDE with
|
||||||
|
| auto-completion.
|
||||||
|
|
|
||||||
|
| Please be aware that this setting changes a file within the /vendor directory.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'write_eloquent_model_mixins' => false,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Helper files to include
|
| Helper files to include
|
||||||
|
|||||||
+36
-8
@@ -13,6 +13,7 @@ namespace Barryvdh\LaravelIdeHelper;
|
|||||||
use Barryvdh\Reflection\DocBlock;
|
use Barryvdh\Reflection\DocBlock;
|
||||||
use Barryvdh\Reflection\DocBlock\Context;
|
use Barryvdh\Reflection\DocBlock\Context;
|
||||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||||
|
use Barryvdh\Reflection\DocBlock\Tag\MethodTag;
|
||||||
use ReflectionClass;
|
use ReflectionClass;
|
||||||
|
|
||||||
class Alias
|
class Alias
|
||||||
@@ -175,6 +176,10 @@ class Alias
|
|||||||
*/
|
*/
|
||||||
public function getMethods()
|
public function getMethods()
|
||||||
{
|
{
|
||||||
|
if (count($this->methods) > 0) {
|
||||||
|
return $this->methods;
|
||||||
|
}
|
||||||
|
|
||||||
$this->addMagicMethods();
|
$this->addMagicMethods();
|
||||||
$this->detectMethods();
|
$this->detectMethods();
|
||||||
return $this->methods;
|
return $this->methods;
|
||||||
@@ -356,14 +361,17 @@ class Alias
|
|||||||
$properties = $reflection->getStaticProperties();
|
$properties = $reflection->getStaticProperties();
|
||||||
$macros = isset($properties['macros']) ? $properties['macros'] : [];
|
$macros = isset($properties['macros']) ? $properties['macros'] : [];
|
||||||
foreach ($macros as $macro_name => $macro_func) {
|
foreach ($macros as $macro_name => $macro_func) {
|
||||||
// Add macros
|
if (!in_array($macro_name, $this->usedMethods)) {
|
||||||
$this->methods[] = new Macro(
|
// Add macros
|
||||||
$this->getMacroFunction($macro_func),
|
$this->methods[] = new Macro(
|
||||||
$this->alias,
|
$this->getMacroFunction($macro_func),
|
||||||
$reflection,
|
$this->alias,
|
||||||
$macro_name,
|
$reflection,
|
||||||
$this->interfaces
|
$macro_name,
|
||||||
);
|
$this->interfaces
|
||||||
|
);
|
||||||
|
$this->usedMethods[] = $macro_name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -395,12 +403,32 @@ class Alias
|
|||||||
$serializer = new DocBlockSerializer(1, $prefix);
|
$serializer = new DocBlockSerializer(1, $prefix);
|
||||||
|
|
||||||
if ($this->phpdoc) {
|
if ($this->phpdoc) {
|
||||||
|
$this->removeDuplicateMethodsFromPhpDoc();
|
||||||
return $serializer->getDocComment($this->phpdoc);
|
return $serializer->getDocComment($this->phpdoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes method tags from the doc comment that already appear as functions inside the class.
|
||||||
|
* This prevents duplicate function errors in the IDE.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function removeDuplicateMethodsFromPhpDoc()
|
||||||
|
{
|
||||||
|
$methodNames = array_map(function (Method $method) {
|
||||||
|
return $method->getName();
|
||||||
|
}, $this->getMethods());
|
||||||
|
|
||||||
|
foreach ($this->phpdoc->getTags() as $tag) {
|
||||||
|
if ($tag instanceof MethodTag && in_array($tag->getMethodName(), $methodNames)) {
|
||||||
|
$this->phpdoc->deleteTag($tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Output an error.
|
* Output an error.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -115,6 +115,10 @@ class GeneratorCommand extends Command
|
|||||||
|
|
||||||
if ($written !== false) {
|
if ($written !== false) {
|
||||||
$this->info("A new helper file was written to $filename");
|
$this->info("A new helper file was written to $filename");
|
||||||
|
|
||||||
|
if ($this->option('write_mixins')) {
|
||||||
|
Eloquent::writeEloquentModelHelper($this, $this->files);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->error("The helper file could not be created at $filename");
|
$this->error("The helper file could not be created at $filename");
|
||||||
}
|
}
|
||||||
@@ -158,9 +162,11 @@ class GeneratorCommand extends Command
|
|||||||
protected function getOptions()
|
protected function getOptions()
|
||||||
{
|
{
|
||||||
$format = $this->config->get('ide-helper.format');
|
$format = $this->config->get('ide-helper.format');
|
||||||
|
$writeMixins = $this->config->get('ide-helper.write_eloquent_model_mixins');
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
array('format', "F", InputOption::VALUE_OPTIONAL, 'The format for the IDE Helper', $format),
|
array('format', "F", InputOption::VALUE_OPTIONAL, 'The format for the IDE Helper', $format),
|
||||||
|
array('write_mixins', "W", InputOption::VALUE_OPTIONAL, 'Write mixins to Laravel Model?', $writeMixins),
|
||||||
array('helpers', "H", InputOption::VALUE_NONE, 'Include the helper files'),
|
array('helpers', "H", InputOption::VALUE_NONE, 'Include the helper files'),
|
||||||
array('memory', "M", InputOption::VALUE_NONE, 'Use sqlite memory driver'),
|
array('memory', "M", InputOption::VALUE_NONE, 'Use sqlite memory driver'),
|
||||||
array('sublime', "S", InputOption::VALUE_NONE, 'DEPRECATED: Use different style for SublimeText CodeIntel'),
|
array('sublime', "S", InputOption::VALUE_NONE, 'DEPRECATED: Use different style for SublimeText CodeIntel'),
|
||||||
|
|||||||
@@ -482,7 +482,7 @@ class ModelsCommand extends Command
|
|||||||
//Resolve the relation's model to a Relation object.
|
//Resolve the relation's model to a Relation object.
|
||||||
$methodReflection = new \ReflectionMethod($model, $method);
|
$methodReflection = new \ReflectionMethod($model, $method);
|
||||||
if ($methodReflection->getNumberOfParameters()) {
|
if ($methodReflection->getNumberOfParameters()) {
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$relationObj = $model->$method();
|
$relationObj = $model->$method();
|
||||||
|
|||||||
+37
-7
@@ -32,27 +32,57 @@ class Eloquent
|
|||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new \ReflectionClass($class);
|
||||||
$namespace = $reflection->getNamespaceName();
|
$namespace = $reflection->getNamespaceName();
|
||||||
$originalDoc = $reflection->getDocComment();
|
$originalDoc = $reflection->getDocComment();
|
||||||
|
|
||||||
if (!$originalDoc) {
|
if (!$originalDoc) {
|
||||||
$command->info('Unexpected no document on ' . $class);
|
$command->info('Unexpected no document on ' . $class);
|
||||||
}
|
}
|
||||||
$phpdoc = new DocBlock($reflection, new Context($namespace));
|
$phpdoc = new DocBlock($reflection, new Context($namespace));
|
||||||
|
|
||||||
$mixins = $phpdoc->getTagsByName('mixin');
|
$mixins = $phpdoc->getTagsByName('mixin');
|
||||||
foreach ($mixins as $m) {
|
$expectedMixins = [
|
||||||
if ($m->getContent() === '\Eloquent') {
|
'\Eloquent' => false,
|
||||||
$command->info('Tag Exists: @mixin \Eloquent in ' . $class);
|
'\Illuminate\Database\Eloquent\Builder' => false,
|
||||||
|
'\Illuminate\Database\Query\Builder' => false,
|
||||||
|
];
|
||||||
|
|
||||||
return;
|
foreach ($mixins as $m) {
|
||||||
|
$mixin = $m->getContent();
|
||||||
|
|
||||||
|
if (isset($expectedMixins[$mixin])) {
|
||||||
|
$command->info('Tag Exists: @mixin ' . $mixin . ' in ' . $class);
|
||||||
|
|
||||||
|
$expectedMixins[$mixin] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the Eloquent mixin
|
$changed = false;
|
||||||
$phpdoc->appendTag(Tag::createInstance("@mixin \\Eloquent", $phpdoc));
|
foreach ($expectedMixins as $expectedMixin => $present) {
|
||||||
|
if ($present === false) {
|
||||||
|
$phpdoc->appendTag(Tag::createInstance('@mixin ' . $expectedMixin, $phpdoc));
|
||||||
|
|
||||||
|
$changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If nothing's changed, stop here.
|
||||||
|
if (!$changed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$serializer = new DocBlockSerializer();
|
$serializer = new DocBlockSerializer();
|
||||||
$serializer->getDocComment($phpdoc);
|
$serializer->getDocComment($phpdoc);
|
||||||
$docComment = $serializer->getDocComment($phpdoc);
|
$docComment = $serializer->getDocComment($phpdoc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
The new DocBlock is appended to the beginning of the class declaration.
|
||||||
|
Since there is no DocBlock, the declaration is used as a guide.
|
||||||
|
*/
|
||||||
|
if (!$originalDoc) {
|
||||||
|
$originalDoc = 'abstract class Model implements';
|
||||||
|
|
||||||
|
$docComment .= "\nabstract class Model implements";
|
||||||
|
}
|
||||||
|
|
||||||
$filename = $reflection->getFileName();
|
$filename = $reflection->getFileName();
|
||||||
if ($filename) {
|
if ($filename) {
|
||||||
$contents = $files->get($filename);
|
$contents = $files->get($filename);
|
||||||
@@ -61,7 +91,7 @@ class Eloquent
|
|||||||
$contents = str_replace($originalDoc, $docComment, $contents, $count);
|
$contents = str_replace($originalDoc, $docComment, $contents, $count);
|
||||||
if ($count > 0) {
|
if ($count > 0) {
|
||||||
if ($files->put($filename, $contents)) {
|
if ($files->put($filename, $contents)) {
|
||||||
$command->info('Wrote @mixin \Eloquent to ' . $filename);
|
$command->info('Wrote expected docblock to ' . $filename);
|
||||||
} else {
|
} else {
|
||||||
$command->error('File write failed to ' . $filename);
|
$command->error('File write failed to ' . $filename);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -198,7 +198,7 @@ class Generator
|
|||||||
// Get all aliases
|
// Get all aliases
|
||||||
foreach ($this->getAliases() as $name => $facade) {
|
foreach ($this->getAliases() as $name => $facade) {
|
||||||
// Skip the Redis facade, if not available (otherwise Fatal PHP Error)
|
// Skip the Redis facade, if not available (otherwise Fatal PHP Error)
|
||||||
if ($facade == 'Illuminate\Support\Facades\Redis' && !class_exists('Predis\Client')) {
|
if ($facade == 'Illuminate\Support\Facades\Redis' && $name == 'Redis' && !class_exists('Predis\Client')) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,10 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
public function boot()
|
public function boot()
|
||||||
{
|
{
|
||||||
$viewPath = __DIR__.'/../resources/views';
|
if ($this->app->has('view')) {
|
||||||
$this->loadViewsFrom($viewPath, 'ide-helper');
|
$viewPath = __DIR__ . '/../resources/views';
|
||||||
|
$this->loadViewsFrom($viewPath, 'ide-helper');
|
||||||
|
}
|
||||||
|
|
||||||
$configPath = __DIR__ . '/../config/ide-helper.php';
|
$configPath = __DIR__ . '/../config/ide-helper.php';
|
||||||
if (function_exists('config_path')) {
|
if (function_exists('config_path')) {
|
||||||
|
|||||||
+1
-1
@@ -47,7 +47,7 @@ class Method
|
|||||||
$this->method = $method;
|
$this->method = $method;
|
||||||
$this->interfaces = $interfaces;
|
$this->interfaces = $interfaces;
|
||||||
$this->name = $methodName ?: $method->name;
|
$this->name = $methodName ?: $method->name;
|
||||||
$this->real_name = $method->name;
|
$this->real_name = $method->isClosure() ? $this->name : $method->name;
|
||||||
$this->initClassDefinedProperties($method, $class);
|
$this->initClassDefinedProperties($method, $class);
|
||||||
|
|
||||||
//Create a DocBlock and serializer instance
|
//Create a DocBlock and serializer instance
|
||||||
|
|||||||
Reference in New Issue
Block a user