Subiendo proyecto completo sin restricciones de git ignore
This commit is contained in:
473
vendor/barryvdh/laravel-ide-helper/src/Alias.php
vendored
Normal file
473
vendor/barryvdh/laravel-ide-helper/src/Alias.php
vendored
Normal file
@@ -0,0 +1,473 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2014 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 Barryvdh\Reflection\DocBlock;
|
||||
use Barryvdh\Reflection\DocBlock\Context;
|
||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||
use Barryvdh\Reflection\DocBlock\Tag\MethodTag;
|
||||
use Closure;
|
||||
use Illuminate\Config\Repository as ConfigRepository;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Support\Facades\Facade;
|
||||
use ReflectionClass;
|
||||
|
||||
class Alias
|
||||
{
|
||||
protected $alias;
|
||||
/** @psalm-var class-string $facade */
|
||||
protected $facade;
|
||||
protected $extends = null;
|
||||
protected $extendsClass = null;
|
||||
protected $extendsNamespace = null;
|
||||
protected $classType = 'class';
|
||||
protected $short;
|
||||
protected $namespace = '__root';
|
||||
protected $root = null;
|
||||
protected $classes = [];
|
||||
protected $methods = [];
|
||||
protected $usedMethods = [];
|
||||
protected $valid = false;
|
||||
protected $magicMethods = [];
|
||||
protected $interfaces = [];
|
||||
protected $phpdoc = null;
|
||||
protected $classAliases = [];
|
||||
|
||||
/** @var ConfigRepository */
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* @param ConfigRepository $config
|
||||
* @param string $alias
|
||||
* @psalm-param class-string $facade
|
||||
* @param string $facade
|
||||
* @param array $magicMethods
|
||||
* @param array $interfaces
|
||||
*/
|
||||
public function __construct($config, $alias, $facade, $magicMethods = [], $interfaces = [])
|
||||
{
|
||||
$this->alias = $alias;
|
||||
$this->magicMethods = $magicMethods;
|
||||
$this->interfaces = $interfaces;
|
||||
$this->config = $config;
|
||||
|
||||
// Make the class absolute
|
||||
$facade = '\\' . ltrim($facade, '\\');
|
||||
$this->facade = $facade;
|
||||
|
||||
$this->detectRoot();
|
||||
|
||||
if (!$this->root || $this->isTrait()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->valid = true;
|
||||
|
||||
$this->addClass($this->root);
|
||||
$this->detectFake();
|
||||
$this->detectNamespace();
|
||||
$this->detectClassType();
|
||||
$this->detectExtendsNamespace();
|
||||
|
||||
if (!empty($this->namespace)) {
|
||||
$this->classAliases = (new UsesResolver())->loadFromClass($this->root);
|
||||
|
||||
//Create a DocBlock and serializer instance
|
||||
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace, $this->classAliases));
|
||||
}
|
||||
|
||||
if ($facade === '\Illuminate\Database\Eloquent\Model') {
|
||||
$this->usedMethods = ['decrement', 'increment'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add one or more classes to analyze
|
||||
*
|
||||
* @param array|string $classes
|
||||
*/
|
||||
public function addClass($classes)
|
||||
{
|
||||
$classes = (array)$classes;
|
||||
foreach ($classes as $class) {
|
||||
if (class_exists($class) || interface_exists($class)) {
|
||||
$this->classes[] = $class;
|
||||
} else {
|
||||
echo "Class not exists: $class\r\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this class is valid to process.
|
||||
* @return bool
|
||||
*/
|
||||
public function isValid()
|
||||
{
|
||||
return $this->valid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the classtype, 'interface' or 'class'
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getClasstype()
|
||||
{
|
||||
return $this->classType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class which this alias extends
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function getExtends()
|
||||
{
|
||||
return $this->extends;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class short name which this alias extends
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function getExtendsClass()
|
||||
{
|
||||
return $this->extendsClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the namespace of the class which this alias extends
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function getExtendsNamespace()
|
||||
{
|
||||
return $this->extendsNamespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Alias by which this class is called
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAlias()
|
||||
{
|
||||
return $this->alias;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the short name (without namespace)
|
||||
*/
|
||||
public function getShortName()
|
||||
{
|
||||
return $this->short;
|
||||
}
|
||||
/**
|
||||
* Get the namespace from the alias
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNamespace()
|
||||
{
|
||||
return $this->namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the methods found by this Alias
|
||||
*
|
||||
* @return array|Method[]
|
||||
*/
|
||||
public function getMethods()
|
||||
{
|
||||
if (count($this->methods) > 0) {
|
||||
return $this->methods;
|
||||
}
|
||||
|
||||
$this->addMagicMethods();
|
||||
$this->detectMethods();
|
||||
return $this->methods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect class returned by ::fake()
|
||||
*/
|
||||
protected function detectFake()
|
||||
{
|
||||
$facade = $this->facade;
|
||||
|
||||
if (!is_subclass_of($facade, Facade::class)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!method_exists($facade, 'fake')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$real = $facade::getFacadeRoot();
|
||||
|
||||
try {
|
||||
$facade::fake();
|
||||
$fake = $facade::getFacadeRoot();
|
||||
if ($fake !== $real) {
|
||||
$this->addClass(get_class($fake));
|
||||
}
|
||||
} finally {
|
||||
$facade::swap($real);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect the namespace
|
||||
*/
|
||||
protected function detectNamespace()
|
||||
{
|
||||
if (strpos($this->alias, '\\')) {
|
||||
$nsParts = explode('\\', $this->alias);
|
||||
$this->short = array_pop($nsParts);
|
||||
$this->namespace = implode('\\', $nsParts);
|
||||
} else {
|
||||
$this->short = $this->alias;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect the extends namespace
|
||||
*/
|
||||
protected function detectExtendsNamespace()
|
||||
{
|
||||
if (strpos($this->extends, '\\') !== false) {
|
||||
$nsParts = explode('\\', $this->extends);
|
||||
$this->extendsClass = array_pop($nsParts);
|
||||
$this->extendsNamespace = implode('\\', $nsParts);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect the class type
|
||||
*/
|
||||
protected function detectClassType()
|
||||
{
|
||||
//Some classes extend the facade
|
||||
if (interface_exists($this->facade)) {
|
||||
$this->classType = 'interface';
|
||||
$this->extends = $this->facade;
|
||||
} else {
|
||||
$this->classType = 'class';
|
||||
if (class_exists($this->facade)) {
|
||||
$this->extends = $this->facade;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the real root of a facade
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
protected function detectRoot()
|
||||
{
|
||||
$facade = $this->facade;
|
||||
|
||||
try {
|
||||
//If possible, get the facade root
|
||||
if (method_exists($facade, 'getFacadeRoot')) {
|
||||
$root = get_class($facade::getFacadeRoot());
|
||||
} else {
|
||||
$root = $facade;
|
||||
}
|
||||
|
||||
//If it doesn't exist, skip it
|
||||
if (!class_exists($root) && !interface_exists($root)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->root = $root;
|
||||
|
||||
//When the database connection is not set, some classes will be skipped
|
||||
} catch (\PDOException $e) {
|
||||
$this->error(
|
||||
'PDOException: ' . $e->getMessage() .
|
||||
"\nPlease configure your database connection correctly, or use the sqlite memory driver (-M)." .
|
||||
" Skipping $facade."
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
$this->error('Exception: ' . $e->getMessage() . "\nSkipping $facade.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect if this class is a trait or not.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isTrait()
|
||||
{
|
||||
// Check if the facade is not a Trait
|
||||
return trait_exists($this->facade);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add magic methods, as defined in the configuration files
|
||||
*/
|
||||
protected function addMagicMethods()
|
||||
{
|
||||
foreach ($this->magicMethods as $magic => $real) {
|
||||
list($className, $name) = explode('::', $real);
|
||||
if ((!class_exists($className) && !interface_exists($className)) || !method_exists($className, $name)) {
|
||||
continue;
|
||||
}
|
||||
$method = new \ReflectionMethod($className, $name);
|
||||
$class = new \ReflectionClass($className);
|
||||
|
||||
if (!in_array($magic, $this->usedMethods)) {
|
||||
if ($class !== $this->root) {
|
||||
$this->methods[] = new Method($method, $this->alias, $class, $magic, $this->interfaces, $this->classAliases);
|
||||
}
|
||||
$this->usedMethods[] = $magic;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the methods for one or multiple classes.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function detectMethods()
|
||||
{
|
||||
foreach ($this->classes as $class) {
|
||||
$reflection = new \ReflectionClass($class);
|
||||
|
||||
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
|
||||
if ($methods) {
|
||||
foreach ($methods as $method) {
|
||||
if (!in_array($method->name, $this->usedMethods)) {
|
||||
// Only add the methods to the output when the root is not the same as the class.
|
||||
// And don't add the __*() methods
|
||||
if ($this->extends !== $class && substr($method->name, 0, 2) !== '__') {
|
||||
$this->methods[] = new Method(
|
||||
$method,
|
||||
$this->alias,
|
||||
$reflection,
|
||||
$method->name,
|
||||
$this->interfaces,
|
||||
$this->classAliases
|
||||
);
|
||||
}
|
||||
$this->usedMethods[] = $method->name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the class is macroable
|
||||
// (Eloquent\Builder is also macroable but doesn't use Macroable trait)
|
||||
$traits = collect($reflection->getTraitNames());
|
||||
if ($traits->contains('Illuminate\Support\Traits\Macroable') || $class === EloquentBuilder::class) {
|
||||
$properties = $reflection->getStaticProperties();
|
||||
$macros = isset($properties['macros']) ? $properties['macros'] : [];
|
||||
foreach ($macros as $macro_name => $macro_func) {
|
||||
if (!in_array($macro_name, $this->usedMethods)) {
|
||||
// Add macros
|
||||
$this->methods[] = new Macro(
|
||||
$this->getMacroFunction($macro_func),
|
||||
$this->alias,
|
||||
$reflection,
|
||||
$macro_name,
|
||||
$this->interfaces,
|
||||
$this->classAliases
|
||||
);
|
||||
$this->usedMethods[] = $macro_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $macro_func
|
||||
*
|
||||
* @return \ReflectionFunctionAbstract
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
protected function getMacroFunction($macro_func)
|
||||
{
|
||||
if (is_array($macro_func) && is_callable($macro_func)) {
|
||||
return new \ReflectionMethod($macro_func[0], $macro_func[1]);
|
||||
}
|
||||
|
||||
if (is_object($macro_func) && is_callable($macro_func) && !$macro_func instanceof Closure) {
|
||||
return new \ReflectionMethod($macro_func, '__invoke');
|
||||
}
|
||||
|
||||
return new \ReflectionFunction($macro_func);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the docblock for this alias
|
||||
*
|
||||
* @param string $prefix
|
||||
* @return mixed
|
||||
*/
|
||||
public function getDocComment($prefix = "\t\t")
|
||||
{
|
||||
$serializer = new DocBlockSerializer(1, $prefix);
|
||||
|
||||
if (!$this->phpdoc) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if ($this->config->get('ide-helper.include_class_docblocks')) {
|
||||
// if a class doesn't expose any DocBlock tags
|
||||
// we can perform reflection on the class and
|
||||
// add in the original class DocBlock
|
||||
if (count($this->phpdoc->getTags()) === 0) {
|
||||
$class = new ReflectionClass($this->root);
|
||||
$this->phpdoc = new DocBlock($class->getDocComment());
|
||||
}
|
||||
}
|
||||
|
||||
$this->removeDuplicateMethodsFromPhpDoc();
|
||||
return $serializer->getDocComment($this->phpdoc);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param string $string
|
||||
* @return void
|
||||
*/
|
||||
protected function error($string)
|
||||
{
|
||||
echo $string . "\r\n";
|
||||
}
|
||||
}
|
||||
62
vendor/barryvdh/laravel-ide-helper/src/Console/EloquentCommand.php
vendored
Normal file
62
vendor/barryvdh/laravel-ide-helper/src/Console/EloquentCommand.php
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator - Eloquent Model Mixin
|
||||
*
|
||||
* @author Charles A. Peterson <artistan@gmail.com>
|
||||
* @copyright 2017 Charles A. Peterson / 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\Console;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Eloquent;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
|
||||
/**
|
||||
* A command to add \Eloquent mixin to Eloquent\Model
|
||||
*
|
||||
* @author Charles A. Peterson <artistan@gmail.com>
|
||||
*/
|
||||
class EloquentCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'ide-helper:eloquent';
|
||||
|
||||
/**
|
||||
* @var Filesystem $files
|
||||
*/
|
||||
protected $files;
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Add \Eloquent helper to \Eloquent\Model';
|
||||
|
||||
/**
|
||||
* @param Filesystem $files
|
||||
*/
|
||||
public function __construct(Filesystem $files)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->files = $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
Eloquent::writeEloquentModelHelper($this, $this->files);
|
||||
}
|
||||
}
|
||||
174
vendor/barryvdh/laravel-ide-helper/src/Console/GeneratorCommand.php
vendored
Normal file
174
vendor/barryvdh/laravel-ide-helper/src/Console/GeneratorCommand.php
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2014 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\Console;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Eloquent;
|
||||
use Barryvdh\LaravelIdeHelper\Generator;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
/**
|
||||
* A command to generate autocomplete information for your IDE
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
*/
|
||||
class GeneratorCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'ide-helper:generate';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Generate a new IDE Helper file.';
|
||||
|
||||
/** @var \Illuminate\Config\Repository */
|
||||
protected $config;
|
||||
|
||||
/** @var \Illuminate\Filesystem\Filesystem */
|
||||
protected $files;
|
||||
|
||||
/** @var \Illuminate\View\Factory */
|
||||
protected $view;
|
||||
|
||||
protected $onlyExtend;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param \Illuminate\Config\Repository $config
|
||||
* @param \Illuminate\Filesystem\Filesystem $files
|
||||
* @param \Illuminate\View\Factory $view
|
||||
*/
|
||||
public function __construct(
|
||||
/*ConfigRepository */
|
||||
$config,
|
||||
Filesystem $files,
|
||||
/* Illuminate\View\Factory */
|
||||
$view
|
||||
) {
|
||||
$this->config = $config;
|
||||
$this->files = $files;
|
||||
$this->view = $view;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
if (
|
||||
file_exists(base_path() . '/vendor/compiled.php') ||
|
||||
file_exists(base_path() . '/bootstrap/cache/compiled.php') ||
|
||||
file_exists(base_path() . '/storage/framework/compiled.php')
|
||||
) {
|
||||
$this->error(
|
||||
'Error generating IDE Helper: first delete your compiled file (php artisan clear-compiled)'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
$filename = $this->argument('filename');
|
||||
|
||||
// Add the php extension if missing
|
||||
// This is a backwards-compatible shim and can be removed in the future
|
||||
if (substr($filename, -4, 4) !== '.php') {
|
||||
$filename .= '.php';
|
||||
}
|
||||
|
||||
if ($this->option('memory')) {
|
||||
$this->useMemoryDriver();
|
||||
}
|
||||
|
||||
|
||||
$helpers = '';
|
||||
if ($this->option('helpers') || ($this->config->get('ide-helper.include_helpers'))) {
|
||||
foreach ($this->config->get('ide-helper.helper_files', []) as $helper) {
|
||||
if (file_exists($helper)) {
|
||||
$helpers .= str_replace(['<?php', '?>'], '', $this->files->get($helper));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$helpers = '';
|
||||
}
|
||||
|
||||
$generator = new Generator($this->config, $this->view, $this->getOutput(), $helpers);
|
||||
$content = $generator->generate();
|
||||
$written = $this->files->put($filename, $content);
|
||||
|
||||
if ($written !== false) {
|
||||
$this->info("A new helper file was written to $filename");
|
||||
|
||||
if ($this->option('write_mixins')) {
|
||||
Eloquent::writeEloquentModelHelper($this, $this->files);
|
||||
}
|
||||
} else {
|
||||
$this->error("The helper file could not be created at $filename");
|
||||
}
|
||||
}
|
||||
|
||||
protected function useMemoryDriver()
|
||||
{
|
||||
//Use a sqlite database in memory, to avoid connection errors on Database facades
|
||||
$this->config->set(
|
||||
'database.connections.sqlite',
|
||||
[
|
||||
'driver' => 'sqlite',
|
||||
'database' => ':memory:',
|
||||
]
|
||||
);
|
||||
$this->config->set('database.default', 'sqlite');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
$filename = $this->config->get('ide-helper.filename');
|
||||
|
||||
return [
|
||||
[
|
||||
'filename', InputArgument::OPTIONAL, 'The path to the helper file', $filename,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
$writeMixins = $this->config->get('ide-helper.write_eloquent_model_mixins');
|
||||
|
||||
return [
|
||||
['write_mixins', 'W', InputOption::VALUE_OPTIONAL, 'Write mixins to Laravel Model?', $writeMixins],
|
||||
['helpers', 'H', InputOption::VALUE_NONE, 'Include the helper files'],
|
||||
['memory', 'M', InputOption::VALUE_NONE, 'Use sqlite memory driver'],
|
||||
];
|
||||
}
|
||||
}
|
||||
187
vendor/barryvdh/laravel-ide-helper/src/Console/MetaCommand.php
vendored
Normal file
187
vendor/barryvdh/laravel-ide-helper/src/Console/MetaCommand.php
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2015 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\Console;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Factories;
|
||||
use Illuminate\Console\Command;
|
||||
use RuntimeException;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
/**
|
||||
* A command to generate phpstorm meta data
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
*/
|
||||
class MetaCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'ide-helper:meta';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Generate metadata for PhpStorm';
|
||||
|
||||
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
|
||||
protected $files;
|
||||
|
||||
/** @var \Illuminate\Contracts\View\Factory */
|
||||
protected $view;
|
||||
|
||||
/** @var \Illuminate\Contracts\Config\Repository */
|
||||
protected $config;
|
||||
|
||||
protected $methods = [
|
||||
'new \Illuminate\Contracts\Container\Container',
|
||||
'\Illuminate\Container\Container::makeWith(0)',
|
||||
'\Illuminate\Contracts\Container\Container::get(0)',
|
||||
'\Illuminate\Contracts\Container\Container::make(0)',
|
||||
'\Illuminate\Contracts\Container\Container::makeWith(0)',
|
||||
'\App::get(0)',
|
||||
'\App::make(0)',
|
||||
'\App::makeWith(0)',
|
||||
'\app(0)',
|
||||
'\resolve(0)',
|
||||
'\Psr\Container\ContainerInterface::get(0)',
|
||||
];
|
||||
|
||||
/**
|
||||
*
|
||||
* @param \Illuminate\Contracts\Filesystem\Filesystem $files
|
||||
* @param \Illuminate\Contracts\View\Factory $view
|
||||
* @param \Illuminate\Contracts\Config\Repository $config
|
||||
*/
|
||||
public function __construct($files, $view, $config)
|
||||
{
|
||||
$this->files = $files;
|
||||
$this->view = $view;
|
||||
$this->config = $config;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
// Needs to run before exception handler is registered
|
||||
$factories = $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [];
|
||||
|
||||
$ourAutoloader = $this->registerClassAutoloadExceptions();
|
||||
|
||||
$bindings = [];
|
||||
foreach ($this->getAbstracts() as $abstract) {
|
||||
// Validator and seeder cause problems
|
||||
if (in_array($abstract, ['validator', 'seeder'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
$concrete = $this->laravel->make($abstract);
|
||||
|
||||
if ($concrete === null) {
|
||||
throw new RuntimeException("Cannot create instance for '$abstract', received 'null'");
|
||||
}
|
||||
|
||||
$reflectionClass = new \ReflectionClass($concrete);
|
||||
if (is_object($concrete) && !$reflectionClass->isAnonymous()) {
|
||||
$bindings[$abstract] = get_class($concrete);
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
|
||||
$this->comment("Cannot make '$abstract': " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->unregisterClassAutoloadExceptions($ourAutoloader);
|
||||
|
||||
$content = $this->view->make('meta', [
|
||||
'bindings' => $bindings,
|
||||
'methods' => $this->methods,
|
||||
'factories' => $factories,
|
||||
])->render();
|
||||
|
||||
$filename = $this->option('filename');
|
||||
$written = $this->files->put($filename, $content);
|
||||
|
||||
if ($written !== false) {
|
||||
$this->info("A new meta file was written to $filename");
|
||||
} else {
|
||||
$this->error("The meta file could not be created at $filename");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of abstracts from the Laravel Application.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getAbstracts()
|
||||
{
|
||||
$abstracts = $this->laravel->getBindings();
|
||||
|
||||
// Return the abstract names only
|
||||
$keys = array_keys($abstracts);
|
||||
|
||||
sort($keys);
|
||||
|
||||
return $keys;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register an autoloader the throws exceptions when a class is not found.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected function registerClassAutoloadExceptions(): callable
|
||||
{
|
||||
$autoloader = function ($class) {
|
||||
throw new \ReflectionException("Class '$class' not found.");
|
||||
};
|
||||
spl_autoload_register($autoloader);
|
||||
return $autoloader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
$filename = $this->config->get('ide-helper.meta_filename');
|
||||
|
||||
return [
|
||||
['filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the meta file', $filename],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove our custom autoloader that we pushed onto the autoload stack
|
||||
*
|
||||
* @param callable $ourAutoloader
|
||||
*/
|
||||
private function unregisterClassAutoloadExceptions(callable $ourAutoloader): void
|
||||
{
|
||||
spl_autoload_unregister($ourAutoloader);
|
||||
}
|
||||
}
|
||||
1604
vendor/barryvdh/laravel-ide-helper/src/Console/ModelsCommand.php
vendored
Normal file
1604
vendor/barryvdh/laravel-ide-helper/src/Console/ModelsCommand.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
11
vendor/barryvdh/laravel-ide-helper/src/Contracts/ModelHookInterface.php
vendored
Normal file
11
vendor/barryvdh/laravel-ide-helper/src/Contracts/ModelHookInterface.php
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Contracts;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
interface ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void;
|
||||
}
|
||||
113
vendor/barryvdh/laravel-ide-helper/src/Eloquent.php
vendored
Normal file
113
vendor/barryvdh/laravel-ide-helper/src/Eloquent.php
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper to add \Eloquent mixin to Eloquent\Model
|
||||
*
|
||||
* @author Charles A. Peterson <artistan@gmail.com>
|
||||
*/
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper;
|
||||
|
||||
use Barryvdh\Reflection\DocBlock;
|
||||
use Barryvdh\Reflection\DocBlock\Context;
|
||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||
use Barryvdh\Reflection\DocBlock\Tag;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
|
||||
class Eloquent
|
||||
{
|
||||
/**
|
||||
* Write mixin helper to the Eloquent\Model
|
||||
* This is needed since laravel/framework v5.4.29
|
||||
*
|
||||
* @param Command $command
|
||||
* @param Filesystem $files
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function writeEloquentModelHelper(Command $command, Filesystem $files)
|
||||
{
|
||||
$class = 'Illuminate\Database\Eloquent\Model';
|
||||
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$namespace = $reflection->getNamespaceName();
|
||||
$originalDoc = $reflection->getDocComment();
|
||||
|
||||
if (!$originalDoc) {
|
||||
$command->info('Unexpected no document on ' . $class);
|
||||
}
|
||||
$phpdoc = new DocBlock($reflection, new Context($namespace));
|
||||
|
||||
$mixins = $phpdoc->getTagsByName('mixin');
|
||||
$expectedMixins = [
|
||||
'\Eloquent' => false,
|
||||
'\Illuminate\Database\Eloquent\Builder' => false,
|
||||
'\Illuminate\Database\Query\Builder' => false,
|
||||
];
|
||||
|
||||
foreach ($mixins as $m) {
|
||||
$mixin = $m->getContent();
|
||||
|
||||
if (isset($expectedMixins[$mixin])) {
|
||||
$command->info('Tag Exists: @mixin ' . $mixin . ' in ' . $class);
|
||||
|
||||
$expectedMixins[$mixin] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$changed = false;
|
||||
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->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();
|
||||
if (!$filename) {
|
||||
$command->error('Filename not found ' . $class);
|
||||
return;
|
||||
}
|
||||
|
||||
$contents = $files->get($filename);
|
||||
if (!$contents) {
|
||||
$command->error('No file contents found ' . $filename);
|
||||
return;
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
$contents = str_replace($originalDoc, $docComment, $contents, $count);
|
||||
if ($count <= 0) {
|
||||
$command->error('Content did not change ' . $contents);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$files->put($filename, $contents)) {
|
||||
$command->error('File write failed to ' . $filename);
|
||||
return;
|
||||
}
|
||||
|
||||
$command->info('Wrote expected docblock to ' . $filename);
|
||||
}
|
||||
}
|
||||
36
vendor/barryvdh/laravel-ide-helper/src/Factories.php
vendored
Normal file
36
vendor/barryvdh/laravel-ide-helper/src/Factories.php
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Database\Eloquent\Factory;
|
||||
use ReflectionClass;
|
||||
|
||||
class Factories
|
||||
{
|
||||
public static function all()
|
||||
{
|
||||
$factories = [];
|
||||
|
||||
if (static::isLaravelSevenOrLower()) {
|
||||
$factory = app(Factory::class);
|
||||
|
||||
$definitions = (new ReflectionClass(Factory::class))->getProperty('definitions');
|
||||
$definitions->setAccessible(true);
|
||||
|
||||
foreach ($definitions->getValue($factory) as $factory_target => $config) {
|
||||
try {
|
||||
$factories[] = new ReflectionClass($factory_target);
|
||||
} catch (Exception $exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $factories;
|
||||
}
|
||||
|
||||
protected static function isLaravelSevenOrLower()
|
||||
{
|
||||
return class_exists('Illuminate\Database\Eloquent\Factory');
|
||||
}
|
||||
}
|
||||
313
vendor/barryvdh/laravel-ide-helper/src/Generator.php
vendored
Normal file
313
vendor/barryvdh/laravel-ide-helper/src/Generator.php
vendored
Normal file
@@ -0,0 +1,313 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2014 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\Foundation\AliasLoader;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\Traits\Macroable;
|
||||
use ReflectionClass;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class Generator
|
||||
{
|
||||
/** @var \Illuminate\Config\Repository */
|
||||
protected $config;
|
||||
|
||||
/** @var \Illuminate\View\Factory */
|
||||
protected $view;
|
||||
|
||||
/** @var \Symfony\Component\Console\Output\OutputInterface */
|
||||
protected $output;
|
||||
|
||||
protected $extra = [];
|
||||
protected $magic = [];
|
||||
protected $interfaces = [];
|
||||
protected $helpers;
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Config\Repository $config
|
||||
* @param \Illuminate\View\Factory $view
|
||||
* @param \Symfony\Component\Console\Output\OutputInterface $output
|
||||
* @param string $helpers
|
||||
*/
|
||||
public function __construct(
|
||||
/*ConfigRepository */
|
||||
$config,
|
||||
/* Illuminate\View\Factory */
|
||||
$view,
|
||||
OutputInterface $output = null,
|
||||
$helpers = ''
|
||||
) {
|
||||
$this->config = $config;
|
||||
$this->view = $view;
|
||||
|
||||
// Find the drivers to add to the extra/interfaces
|
||||
$this->detectDrivers();
|
||||
|
||||
$this->extra = array_merge($this->extra, $this->config->get('ide-helper.extra'), []);
|
||||
$this->magic = array_merge($this->magic, $this->config->get('ide-helper.magic'), []);
|
||||
$this->interfaces = array_merge($this->interfaces, $this->config->get('ide-helper.interfaces'), []);
|
||||
// Make all interface classes absolute
|
||||
foreach ($this->interfaces as &$interface) {
|
||||
$interface = '\\' . ltrim($interface, '\\');
|
||||
}
|
||||
$this->helpers = $helpers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the helper file contents;
|
||||
*
|
||||
* @return string;
|
||||
*/
|
||||
public function generate()
|
||||
{
|
||||
$app = app();
|
||||
return $this->view->make('helper')
|
||||
->with('namespaces_by_extends_ns', $this->getAliasesByExtendsNamespace())
|
||||
->with('namespaces_by_alias_ns', $this->getAliasesByAliasNamespace())
|
||||
->with('helpers', $this->helpers)
|
||||
->with('version', $app->version())
|
||||
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
|
||||
->with('factories', $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [])
|
||||
->render();
|
||||
}
|
||||
|
||||
protected function detectDrivers()
|
||||
{
|
||||
$defaultUserModel = config('auth.providers.users.model', config('auth.model', 'App\User'));
|
||||
$this->interfaces['\Illuminate\Contracts\Auth\Authenticatable'] = $defaultUserModel;
|
||||
|
||||
try {
|
||||
if (
|
||||
class_exists('Auth') && is_a('Auth', '\Illuminate\Support\Facades\Auth', true)
|
||||
&& app()->bound('auth')
|
||||
) {
|
||||
$class = get_class(\Auth::guard());
|
||||
$this->extra['Auth'] = [$class];
|
||||
$this->interfaces['\Illuminate\Auth\UserProviderInterface'] = $class;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
try {
|
||||
if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) {
|
||||
$class = get_class(\DB::connection());
|
||||
$this->extra['DB'] = [$class];
|
||||
$this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
try {
|
||||
if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) {
|
||||
$driver = get_class(\Cache::driver());
|
||||
$store = get_class(\Cache::getStore());
|
||||
$this->extra['Cache'] = [$driver, $store];
|
||||
$this->interfaces['\Illuminate\Cache\StoreInterface'] = $store;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
try {
|
||||
if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) {
|
||||
$class = get_class(\Queue::connection());
|
||||
$this->extra['Queue'] = [$class];
|
||||
$this->interfaces['\Illuminate\Queue\QueueInterface'] = $class;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
try {
|
||||
if (class_exists('SSH') && is_a('SSH', '\Illuminate\Support\Facades\SSH', true)) {
|
||||
$class = get_class(\SSH::connection());
|
||||
$this->extra['SSH'] = [$class];
|
||||
$this->interfaces['\Illuminate\Remote\ConnectionInterface'] = $class;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
try {
|
||||
if (class_exists('Storage') && is_a('Storage', '\Illuminate\Support\Facades\Storage', true)) {
|
||||
$class = get_class(\Storage::disk());
|
||||
$this->extra['Storage'] = [$class];
|
||||
$this->interfaces['\Illuminate\Contracts\Filesystem\Filesystem'] = $class;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all aliases that are valid for us to render
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
protected function getValidAliases()
|
||||
{
|
||||
$aliases = new Collection();
|
||||
|
||||
// Get all aliases
|
||||
foreach ($this->getAliases() as $name => $facade) {
|
||||
// Skip the Redis facade, if not available (otherwise Fatal PHP Error)
|
||||
if ($facade == 'Illuminate\Support\Facades\Redis' && $name == 'Redis' && !class_exists('Predis\Client')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : [];
|
||||
$alias = new Alias($this->config, $name, $facade, $magicMethods, $this->interfaces);
|
||||
if ($alias->isValid()) {
|
||||
//Add extra methods, from other classes (magic static calls)
|
||||
if (array_key_exists($name, $this->extra)) {
|
||||
$alias->addClass($this->extra[$name]);
|
||||
}
|
||||
|
||||
$aliases[] = $alias;
|
||||
}
|
||||
}
|
||||
|
||||
return $aliases;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regroup aliases by namespace of extended classes
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
protected function getAliasesByExtendsNamespace()
|
||||
{
|
||||
$aliases = $this->getValidAliases();
|
||||
|
||||
$this->addMacroableClasses($aliases);
|
||||
|
||||
return $aliases->groupBy(function (Alias $alias) {
|
||||
return $alias->getExtendsNamespace();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Regroup aliases by namespace of alias
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
protected function getAliasesByAliasNamespace()
|
||||
{
|
||||
return $this->getValidAliases()->groupBy(function (Alias $alias) {
|
||||
return $alias->getNamespace();
|
||||
});
|
||||
}
|
||||
|
||||
protected function getAliases()
|
||||
{
|
||||
// For Laravel, use the AliasLoader
|
||||
if (class_exists('Illuminate\Foundation\AliasLoader')) {
|
||||
return AliasLoader::getInstance()->getAliases();
|
||||
}
|
||||
|
||||
$facades = [
|
||||
'App' => 'Illuminate\Support\Facades\App',
|
||||
'Auth' => 'Illuminate\Support\Facades\Auth',
|
||||
'Bus' => 'Illuminate\Support\Facades\Bus',
|
||||
'DB' => 'Illuminate\Support\Facades\DB',
|
||||
'Cache' => 'Illuminate\Support\Facades\Cache',
|
||||
'Cookie' => 'Illuminate\Support\Facades\Cookie',
|
||||
'Crypt' => 'Illuminate\Support\Facades\Crypt',
|
||||
'Event' => 'Illuminate\Support\Facades\Event',
|
||||
'Hash' => 'Illuminate\Support\Facades\Hash',
|
||||
'Log' => 'Illuminate\Support\Facades\Log',
|
||||
'Mail' => 'Illuminate\Support\Facades\Mail',
|
||||
'Queue' => 'Illuminate\Support\Facades\Queue',
|
||||
'Request' => 'Illuminate\Support\Facades\Request',
|
||||
'Schema' => 'Illuminate\Support\Facades\Schema',
|
||||
'Session' => 'Illuminate\Support\Facades\Session',
|
||||
'Storage' => 'Illuminate\Support\Facades\Storage',
|
||||
'Validator' => 'Illuminate\Support\Facades\Validator',
|
||||
'Gate' => 'Illuminate\Support\Facades\Gate',
|
||||
];
|
||||
|
||||
$facades = array_merge($facades, $this->config->get('app.aliases', []));
|
||||
|
||||
// Only return the ones that actually exist
|
||||
return array_filter(
|
||||
$facades,
|
||||
function ($alias) {
|
||||
return class_exists($alias);
|
||||
},
|
||||
ARRAY_FILTER_USE_KEY
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as error output.
|
||||
*
|
||||
* @param string $string
|
||||
* @return void
|
||||
*/
|
||||
protected function error($string)
|
||||
{
|
||||
if ($this->output) {
|
||||
$this->output->writeln("<error>$string</error>");
|
||||
} else {
|
||||
echo $string . "\r\n";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add all macroable classes which are not already loaded as an alias and have defined macros.
|
||||
*
|
||||
* @param Collection $aliases
|
||||
*/
|
||||
protected function addMacroableClasses(Collection $aliases)
|
||||
{
|
||||
$macroable = $this->getMacroableClasses($aliases);
|
||||
|
||||
foreach ($macroable as $class) {
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
if (!$reflection->getStaticProperties()['macros']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$aliases[] = new Alias($this->config, $class, $class, [], $this->interfaces);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all loaded macroable classes which are not loaded as an alias.
|
||||
*
|
||||
* @param Collection $aliases
|
||||
* @return Collection
|
||||
*/
|
||||
protected function getMacroableClasses(Collection $aliases)
|
||||
{
|
||||
return (new Collection(get_declared_classes()))
|
||||
->filter(function ($class) {
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
// Filter out internal classes and class aliases
|
||||
return !$reflection->isInternal() && $reflection->getName() === $class;
|
||||
})
|
||||
->filter(function ($class) {
|
||||
$traits = class_uses_recursive($class);
|
||||
|
||||
// Filter only classes with the macroable trait
|
||||
return isset($traits[Macroable::class]);
|
||||
})
|
||||
->filter(function ($class) use ($aliases) {
|
||||
$class = Str::start($class, '\\');
|
||||
|
||||
// Filter out aliases
|
||||
return !$aliases->first(function (Alias $alias) use ($class) {
|
||||
return $alias->getExtends() === $class;
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
130
vendor/barryvdh/laravel-ide-helper/src/IdeHelperServiceProvider.php
vendored
Normal file
130
vendor/barryvdh/laravel-ide-helper/src/IdeHelperServiceProvider.php
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2014 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 Barryvdh\LaravelIdeHelper\Console\EloquentCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Listeners\GenerateModelHelper;
|
||||
use Illuminate\Console\Events\CommandFinished;
|
||||
use Illuminate\Contracts\Support\DeferrableProvider;
|
||||
use Illuminate\Database\Events\MigrationsEnded;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\View\Engines\EngineResolver;
|
||||
use Illuminate\View\Engines\PhpEngine;
|
||||
use Illuminate\View\Factory;
|
||||
use Illuminate\View\FileViewFinder;
|
||||
|
||||
class IdeHelperServiceProvider extends ServiceProvider implements DeferrableProvider
|
||||
{
|
||||
/**
|
||||
* Bootstrap the application events.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
if (!$this->app->runningUnitTests() && $this->app['config']->get('ide-helper.post_migrate', [])) {
|
||||
$this->app['events']->listen(CommandFinished::class, GenerateModelHelper::class);
|
||||
$this->app['events']->listen(MigrationsEnded::class, function () {
|
||||
GenerateModelHelper::$shouldRun = true;
|
||||
});
|
||||
}
|
||||
|
||||
if ($this->app->has('view')) {
|
||||
$viewPath = __DIR__ . '/../resources/views';
|
||||
$this->loadViewsFrom($viewPath, 'ide-helper');
|
||||
}
|
||||
|
||||
$configPath = __DIR__ . '/../config/ide-helper.php';
|
||||
if (function_exists('config_path')) {
|
||||
$publishPath = config_path('ide-helper.php');
|
||||
} else {
|
||||
$publishPath = base_path('config/ide-helper.php');
|
||||
}
|
||||
$this->publishes([$configPath => $publishPath], 'config');
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the service provider.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$configPath = __DIR__ . '/../config/ide-helper.php';
|
||||
$this->mergeConfigFrom($configPath, 'ide-helper');
|
||||
$localViewFactory = $this->createLocalViewFactory();
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.generate',
|
||||
function ($app) use ($localViewFactory) {
|
||||
return new GeneratorCommand($app['config'], $app['files'], $localViewFactory);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.models',
|
||||
function ($app) {
|
||||
return new ModelsCommand($app['files']);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.meta',
|
||||
function ($app) use ($localViewFactory) {
|
||||
return new MetaCommand($app['files'], $localViewFactory, $app['config']);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.eloquent',
|
||||
function ($app) {
|
||||
return new EloquentCommand($app['files']);
|
||||
}
|
||||
);
|
||||
|
||||
$this->commands(
|
||||
'command.ide-helper.generate',
|
||||
'command.ide-helper.models',
|
||||
'command.ide-helper.meta',
|
||||
'command.ide-helper.eloquent'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the services provided by the provider.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function provides()
|
||||
{
|
||||
return ['command.ide-helper.generate', 'command.ide-helper.models'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Factory
|
||||
*/
|
||||
private function createLocalViewFactory()
|
||||
{
|
||||
$resolver = new EngineResolver();
|
||||
$resolver->register('php', function () {
|
||||
return new PhpEngine($this->app['files']);
|
||||
});
|
||||
$finder = new FileViewFinder($this->app['files'], [__DIR__ . '/../resources/views']);
|
||||
$factory = new Factory($resolver, $finder, $this->app['events']);
|
||||
$factory->addExtension('php', 'php');
|
||||
|
||||
return $factory;
|
||||
}
|
||||
}
|
||||
52
vendor/barryvdh/laravel-ide-helper/src/Listeners/GenerateModelHelper.php
vendored
Normal file
52
vendor/barryvdh/laravel-ide-helper/src/Listeners/GenerateModelHelper.php
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Listeners;
|
||||
|
||||
use Illuminate\Console\Events\CommandFinished;
|
||||
use Illuminate\Contracts\Config\Repository as Config;
|
||||
use Illuminate\Contracts\Console\Kernel as Artisan;
|
||||
|
||||
class GenerateModelHelper
|
||||
{
|
||||
/**
|
||||
* Tracks whether we should run the models command on the CommandFinished event or not.
|
||||
* Set to true by the MigrationsEnded event, needs to be cleared before artisan call to prevent infinite loop.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public static $shouldRun = false;
|
||||
|
||||
/** @var \Illuminate\Contracts\Console\Kernel */
|
||||
protected $artisan;
|
||||
|
||||
/** @var \Illuminate\Contracts\Config\Repository */
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Contracts\Console\Kernel $artisan
|
||||
* @param \Illuminate\Contracts\Config\Repository $config
|
||||
*/
|
||||
public function __construct(Artisan $artisan, Config $config)
|
||||
{
|
||||
$this->artisan = $artisan;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param CommandFinished $event
|
||||
*/
|
||||
public function handle(CommandFinished $event)
|
||||
{
|
||||
if (!self::$shouldRun) {
|
||||
return;
|
||||
}
|
||||
|
||||
self::$shouldRun = false;
|
||||
|
||||
foreach ($this->config->get('ide-helper.post_migrate', []) as $command) {
|
||||
$this->artisan->call($command, [], $event->output);
|
||||
}
|
||||
}
|
||||
}
|
||||
127
vendor/barryvdh/laravel-ide-helper/src/Macro.php
vendored
Normal file
127
vendor/barryvdh/laravel-ide-helper/src/Macro.php
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper;
|
||||
|
||||
use Barryvdh\Reflection\DocBlock;
|
||||
use Barryvdh\Reflection\DocBlock\Tag;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class Macro extends Method
|
||||
{
|
||||
/**
|
||||
* Macro constructor.
|
||||
*
|
||||
* @param \ReflectionFunctionAbstract $method
|
||||
* @param string $alias
|
||||
* @param \ReflectionClass $class
|
||||
* @param null $methodName
|
||||
* @param array $interfaces
|
||||
* @param array $classAliases
|
||||
*/
|
||||
public function __construct(
|
||||
$method,
|
||||
$alias,
|
||||
$class,
|
||||
$methodName = null,
|
||||
$interfaces = [],
|
||||
$classAliases = []
|
||||
) {
|
||||
parent::__construct($method, $alias, $class, $methodName, $interfaces, $classAliases);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionFunctionAbstract $method
|
||||
*/
|
||||
protected function initPhpDoc($method)
|
||||
{
|
||||
$this->phpdoc = new DocBlock($method);
|
||||
|
||||
$this->addLocationToPhpDoc();
|
||||
|
||||
// Add macro parameters if they are missed in original docblock
|
||||
if (!$this->phpdoc->hasTag('param')) {
|
||||
foreach ($method->getParameters() as $parameter) {
|
||||
$reflectionType = $parameter->getType();
|
||||
|
||||
$type = $this->concatReflectionTypes($reflectionType);
|
||||
|
||||
/** @psalm-suppress UndefinedClass */
|
||||
if ($reflectionType && !$reflectionType instanceof \ReflectionUnionType && $reflectionType->allowsNull()) {
|
||||
$type .= '|null';
|
||||
}
|
||||
|
||||
$type = $type ?: 'mixed';
|
||||
|
||||
$name = $parameter->isVariadic() ? '...' : '';
|
||||
$name .= '$' . $parameter->getName();
|
||||
|
||||
$this->phpdoc->appendTag(Tag::createInstance("@param {$type} {$name}"));
|
||||
}
|
||||
}
|
||||
|
||||
// Add macro return type if it missed in original docblock
|
||||
if ($method->hasReturnType() && !$this->phpdoc->hasTag('return')) {
|
||||
$builder = EloquentBuilder::class;
|
||||
$return = $method->getReturnType();
|
||||
|
||||
$type = $this->concatReflectionTypes($return);
|
||||
|
||||
/** @psalm-suppress UndefinedClass */
|
||||
if (!$return instanceof \ReflectionUnionType) {
|
||||
$type .= $this->root === "\\{$builder}" && $return->getName() === $builder ? '|static' : '';
|
||||
$type .= $return->allowsNull() ? '|null' : '';
|
||||
}
|
||||
|
||||
$this->phpdoc->appendTag(Tag::createInstance("@return {$type}"));
|
||||
}
|
||||
}
|
||||
|
||||
protected function concatReflectionTypes(?\ReflectionType $type): string
|
||||
{
|
||||
/** @psalm-suppress UndefinedClass */
|
||||
$returnTypes = $type instanceof \ReflectionUnionType
|
||||
? $type->getTypes()
|
||||
: [$type];
|
||||
|
||||
return Collection::make($returnTypes)
|
||||
->filter()
|
||||
->map->getName()
|
||||
->implode('|');
|
||||
}
|
||||
|
||||
protected function addLocationToPhpDoc()
|
||||
{
|
||||
if ($this->method->name === '__invoke') {
|
||||
$enclosingClass = $this->method->getDeclaringClass();
|
||||
} else {
|
||||
$enclosingClass = $this->method->getClosureScopeClass();
|
||||
}
|
||||
|
||||
if (!$enclosingClass) {
|
||||
return;
|
||||
}
|
||||
/** @var \ReflectionMethod $enclosingMethod */
|
||||
$enclosingMethod = Collection::make($enclosingClass->getMethods())
|
||||
->first(function (\ReflectionMethod $method) {
|
||||
return $method->getStartLine() <= $this->method->getStartLine()
|
||||
&& $method->getEndLine() >= $this->method->getEndLine();
|
||||
});
|
||||
|
||||
if ($enclosingMethod) {
|
||||
$this->phpdoc->appendTag(Tag::createInstance(
|
||||
'@see \\' . $enclosingClass->getName() . '::' . $enclosingMethod->getName() . '()'
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionFunctionAbstract $method
|
||||
* @param \ReflectionClass $class
|
||||
*/
|
||||
protected function initClassDefinedProperties($method, \ReflectionClass $class)
|
||||
{
|
||||
$this->namespace = $class->getNamespaceName();
|
||||
$this->declaringClassName = '\\' . ltrim($class->name, '\\');
|
||||
}
|
||||
}
|
||||
379
vendor/barryvdh/laravel-ide-helper/src/Method.php
vendored
Normal file
379
vendor/barryvdh/laravel-ide-helper/src/Method.php
vendored
Normal file
@@ -0,0 +1,379 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2014 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 Barryvdh\Reflection\DocBlock;
|
||||
use Barryvdh\Reflection\DocBlock\Context;
|
||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||
use Barryvdh\Reflection\DocBlock\Tag;
|
||||
use Barryvdh\Reflection\DocBlock\Tag\ParamTag;
|
||||
use Barryvdh\Reflection\DocBlock\Tag\ReturnTag;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class Method
|
||||
{
|
||||
/** @var \Barryvdh\Reflection\DocBlock */
|
||||
protected $phpdoc;
|
||||
|
||||
/** @var \ReflectionMethod */
|
||||
protected $method;
|
||||
|
||||
protected $output = '';
|
||||
protected $declaringClassName;
|
||||
protected $name;
|
||||
protected $namespace;
|
||||
protected $params = [];
|
||||
protected $params_with_default = [];
|
||||
protected $interfaces = [];
|
||||
protected $real_name;
|
||||
protected $return = null;
|
||||
protected $root;
|
||||
protected $classAliases;
|
||||
|
||||
/**
|
||||
* @param \ReflectionMethod|\ReflectionFunctionAbstract $method
|
||||
* @param string $alias
|
||||
* @param \ReflectionClass $class
|
||||
* @param string|null $methodName
|
||||
* @param array $interfaces
|
||||
* @param array $classAliases
|
||||
*/
|
||||
public function __construct($method, $alias, $class, $methodName = null, $interfaces = [], array $classAliases = [])
|
||||
{
|
||||
$this->method = $method;
|
||||
$this->interfaces = $interfaces;
|
||||
$this->classAliases = $classAliases;
|
||||
$this->name = $methodName ?: $method->name;
|
||||
$this->real_name = $method->isClosure() ? $this->name : $method->name;
|
||||
$this->initClassDefinedProperties($method, $class);
|
||||
|
||||
//Reference the 'real' function in the declaring class
|
||||
$this->root = '\\' . ltrim($method->name === '__invoke' ? $method->getDeclaringClass()->getName() : $class->getName(), '\\');
|
||||
|
||||
//Create a DocBlock and serializer instance
|
||||
$this->initPhpDoc($method);
|
||||
|
||||
//Normalize the description and inherit the docs from parents/interfaces
|
||||
try {
|
||||
$this->normalizeParams($this->phpdoc);
|
||||
$this->normalizeReturn($this->phpdoc);
|
||||
$this->normalizeDescription($this->phpdoc);
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
//Get the parameters, including formatted default values
|
||||
$this->getParameters($method);
|
||||
|
||||
//Make the method static
|
||||
$this->phpdoc->appendTag(Tag::createInstance('@static', $this->phpdoc));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionMethod $method
|
||||
*/
|
||||
protected function initPhpDoc($method)
|
||||
{
|
||||
$this->phpdoc = new DocBlock($method, new Context($this->namespace, $this->classAliases));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionMethod $method
|
||||
* @param \ReflectionClass $class
|
||||
*/
|
||||
protected function initClassDefinedProperties($method, \ReflectionClass $class)
|
||||
{
|
||||
$declaringClass = $method->getDeclaringClass();
|
||||
$this->namespace = $declaringClass->getNamespaceName();
|
||||
$this->declaringClassName = '\\' . ltrim($declaringClass->name, '\\');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class wherein the function resides
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDeclaringClass()
|
||||
{
|
||||
return $this->declaringClassName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the class from which this function would be called
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRoot()
|
||||
{
|
||||
return $this->root;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isInstanceCall()
|
||||
{
|
||||
return !($this->method->isClosure() || $this->method->isStatic());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRootMethodCall()
|
||||
{
|
||||
if ($this->isInstanceCall()) {
|
||||
return "\$instance->{$this->getRealName()}({$this->getParams()})";
|
||||
} else {
|
||||
return "{$this->getRoot()}::{$this->getRealName()}({$this->getParams()})";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the docblock for this method
|
||||
*
|
||||
* @param string $prefix
|
||||
* @return mixed
|
||||
*/
|
||||
public function getDocComment($prefix = "\t\t")
|
||||
{
|
||||
$serializer = new DocBlockSerializer(1, $prefix);
|
||||
return $serializer->getDocComment($this->phpdoc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the method name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the real method name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRealName()
|
||||
{
|
||||
return $this->real_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters for this method
|
||||
*
|
||||
* @param bool $implode Wether to implode the array or not
|
||||
* @return string
|
||||
*/
|
||||
public function getParams($implode = true)
|
||||
{
|
||||
return $implode ? implode(', ', $this->params) : $this->params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters for this method including default values
|
||||
*
|
||||
* @param bool $implode Wether to implode the array or not
|
||||
* @return string
|
||||
*/
|
||||
public function getParamsWithDefault($implode = true)
|
||||
{
|
||||
return $implode ? implode(', ', $this->params_with_default) : $this->params_with_default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the description and get the inherited docs.
|
||||
*
|
||||
* @param DocBlock $phpdoc
|
||||
*/
|
||||
protected function normalizeDescription(DocBlock $phpdoc)
|
||||
{
|
||||
//Get the short + long description from the DocBlock
|
||||
$description = $phpdoc->getText();
|
||||
|
||||
//Loop through parents/interfaces, to fill in {@inheritdoc}
|
||||
if (strpos($description, '{@inheritdoc}') !== false) {
|
||||
$inheritdoc = $this->getInheritDoc($this->method);
|
||||
$inheritDescription = $inheritdoc->getText();
|
||||
|
||||
$description = str_replace('{@inheritdoc}', $inheritDescription, $description);
|
||||
$phpdoc->setText($description);
|
||||
|
||||
$this->normalizeParams($inheritdoc);
|
||||
$this->normalizeReturn($inheritdoc);
|
||||
|
||||
//Add the tags that are inherited
|
||||
$inheritTags = $inheritdoc->getTags();
|
||||
if ($inheritTags) {
|
||||
/** @var Tag $tag */
|
||||
foreach ($inheritTags as $tag) {
|
||||
$tag->setDocBlock();
|
||||
$phpdoc->appendTag($tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize the parameters
|
||||
*
|
||||
* @param DocBlock $phpdoc
|
||||
*/
|
||||
protected function normalizeParams(DocBlock $phpdoc)
|
||||
{
|
||||
//Get the return type and adjust them for beter autocomplete
|
||||
$paramTags = $phpdoc->getTagsByName('param');
|
||||
if ($paramTags) {
|
||||
/** @var ParamTag $tag */
|
||||
foreach ($paramTags as $tag) {
|
||||
// Convert the keywords
|
||||
$content = $this->convertKeywords($tag->getContent());
|
||||
$tag->setContent($content);
|
||||
|
||||
// Get the expanded type and re-set the content
|
||||
$content = $tag->getType() . ' ' . $tag->getVariableName() . ' ' . $tag->getDescription();
|
||||
$tag->setContent(trim($content));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize the return tag (make full namespace, replace interfaces)
|
||||
*
|
||||
* @param DocBlock $phpdoc
|
||||
*/
|
||||
protected function normalizeReturn(DocBlock $phpdoc)
|
||||
{
|
||||
//Get the return type and adjust them for better autocomplete
|
||||
$returnTags = $phpdoc->getTagsByName('return');
|
||||
|
||||
if (count($returnTags) === 0) {
|
||||
$this->return = null;
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var ReturnTag $tag */
|
||||
$tag = reset($returnTags);
|
||||
// Get the expanded type
|
||||
$returnValue = $tag->getType();
|
||||
|
||||
// Replace the interfaces
|
||||
foreach ($this->interfaces as $interface => $real) {
|
||||
$returnValue = str_replace($interface, $real, $returnValue);
|
||||
}
|
||||
|
||||
// Set the changed content
|
||||
$tag->setContent($returnValue . ' ' . $tag->getDescription());
|
||||
$this->return = $returnValue;
|
||||
|
||||
if ($tag->getType() === '$this') {
|
||||
Str::contains($this->root, Builder::class)
|
||||
? $tag->setType($this->root . '|static')
|
||||
: $tag->setType($this->root);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert keywords that are incorrect.
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
protected function convertKeywords($string)
|
||||
{
|
||||
$string = str_replace('\Closure', 'Closure', $string);
|
||||
$string = str_replace('Closure', '\Closure', $string);
|
||||
$string = str_replace('dynamic', 'mixed', $string);
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should the function return a value?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function shouldReturn()
|
||||
{
|
||||
if ($this->return !== 'void' && $this->method->name !== '__construct') {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters and format them correctly
|
||||
*
|
||||
* @param \ReflectionMethod $method
|
||||
* @return void
|
||||
*/
|
||||
public function getParameters($method)
|
||||
{
|
||||
//Loop through the default values for parameters, and make the correct output string
|
||||
$params = [];
|
||||
$paramsWithDefault = [];
|
||||
foreach ($method->getParameters() as $param) {
|
||||
$paramStr = $param->isVariadic() ? '...$' . $param->getName() : '$' . $param->getName();
|
||||
$params[] = $paramStr;
|
||||
if ($param->isOptional() && !$param->isVariadic()) {
|
||||
$default = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
|
||||
if (is_bool($default)) {
|
||||
$default = $default ? 'true' : 'false';
|
||||
} elseif (is_array($default)) {
|
||||
$default = '[]';
|
||||
} elseif (is_null($default)) {
|
||||
$default = 'null';
|
||||
} elseif (is_int($default)) {
|
||||
//$default = $default;
|
||||
} elseif (is_resource($default)) {
|
||||
//skip to not fail
|
||||
} else {
|
||||
$default = var_export($default, true);
|
||||
}
|
||||
$paramStr .= " = $default";
|
||||
}
|
||||
$paramsWithDefault[] = $paramStr;
|
||||
}
|
||||
|
||||
$this->params = $params;
|
||||
$this->params_with_default = $paramsWithDefault;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \ReflectionMethod $reflectionMethod
|
||||
* @return DocBlock
|
||||
*/
|
||||
protected function getInheritDoc($reflectionMethod)
|
||||
{
|
||||
$parentClass = $reflectionMethod->getDeclaringClass()->getParentClass();
|
||||
|
||||
//Get either a parent or the interface
|
||||
if ($parentClass) {
|
||||
$method = $parentClass->getMethod($reflectionMethod->getName());
|
||||
} else {
|
||||
$method = $reflectionMethod->getPrototype();
|
||||
}
|
||||
if ($method) {
|
||||
$namespace = $method->getDeclaringClass()->getNamespaceName();
|
||||
$phpdoc = new DocBlock($method, new Context($namespace, $this->classAliases));
|
||||
|
||||
if (strpos($phpdoc->getText(), '{@inheritdoc}') !== false) {
|
||||
//Not at the end yet, try another parent/interface..
|
||||
return $this->getInheritDoc($method);
|
||||
}
|
||||
|
||||
return $phpdoc;
|
||||
}
|
||||
}
|
||||
}
|
||||
124
vendor/barryvdh/laravel-ide-helper/src/UsesResolver.php
vendored
Normal file
124
vendor/barryvdh/laravel-ide-helper/src/UsesResolver.php
vendored
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Laravel IDE Helper Generator
|
||||
*
|
||||
* @author Barry vd. Heuvel <barryvdh@gmail.com>
|
||||
* @copyright 2014 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 PhpParser\Node\Stmt\GroupUse;
|
||||
use PhpParser\Node\Stmt\Namespace_;
|
||||
use PhpParser\Node\Stmt\Use_;
|
||||
use PhpParser\Node\Stmt\UseUse;
|
||||
use PhpParser\ParserFactory;
|
||||
|
||||
class UsesResolver
|
||||
{
|
||||
/**
|
||||
* @param string $classFQN
|
||||
* @return array
|
||||
*/
|
||||
public function loadFromClass(string $classFQN): array
|
||||
{
|
||||
return $this->loadFromFile(
|
||||
$classFQN,
|
||||
(new \ReflectionClass($classFQN))->getFileName()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $classFQN
|
||||
* @param string $filename
|
||||
* @return array
|
||||
*/
|
||||
public function loadFromFile(string $classFQN, string $filename): array
|
||||
{
|
||||
return $this->loadFromCode(
|
||||
$classFQN,
|
||||
file_get_contents(
|
||||
$filename
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $classFQN
|
||||
* @param string $code
|
||||
* @return array
|
||||
*/
|
||||
public function loadFromCode(string $classFQN, string $code): array
|
||||
{
|
||||
$classFQN = ltrim($classFQN, '\\');
|
||||
|
||||
$namespace = rtrim(
|
||||
preg_replace(
|
||||
'/([^\\\\]+)$/',
|
||||
'',
|
||||
$classFQN
|
||||
),
|
||||
'\\'
|
||||
);
|
||||
|
||||
$parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
|
||||
$namespaceData = null;
|
||||
|
||||
foreach ($parser->parse($code) as $node) {
|
||||
if ($node instanceof Namespace_ && $node->name->toCodeString() === $namespace) {
|
||||
$namespaceData = $node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($namespaceData === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
/** @var Namespace_ $namespaceData */
|
||||
|
||||
$aliases = [];
|
||||
|
||||
foreach ($namespaceData->stmts as $stmt) {
|
||||
if ($stmt instanceof Use_) {
|
||||
if ($stmt->type !== Use_::TYPE_NORMAL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($stmt->uses as $use) {
|
||||
/** @var UseUse $use */
|
||||
|
||||
$alias = $use->alias ?
|
||||
$use->alias->name :
|
||||
self::classBasename($use->name->toCodeString());
|
||||
|
||||
$aliases[$alias] = '\\' . $use->name->toCodeString();
|
||||
}
|
||||
} elseif ($stmt instanceof GroupUse) {
|
||||
foreach ($stmt->uses as $use) {
|
||||
/** @var UseUse $use */
|
||||
|
||||
$alias = $use->alias ?
|
||||
$use->alias->name :
|
||||
self::classBasename($use->name->toCodeString());
|
||||
|
||||
$aliases[$alias] = '\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $aliases;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $classFQN
|
||||
* @return string
|
||||
*/
|
||||
protected static function classBasename(string $classFQN): string
|
||||
{
|
||||
return preg_replace('/^.*\\\\([^\\\\]+)$/', '$1', $classFQN);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user