mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 01:57:13 +00:00
Add phpstorm meta argument hints (#1640)
* Add phpstorm meta hints * composer fix-style * Use php-templates from vs-code * Fix view instance * composer fix-style * Add translations * composer fix-style * map to string * composer fix-style * Fix test --------- Co-authored-by: laravel-ide-helper <[email protected]>
This commit is contained in:
co-authored by
laravel-ide-helper
parent
66ea6aa57b
commit
4e4da0825a
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
|
||||
$local = collect(glob(config_path('/*.php')))
|
||||
->merge(glob(config_path('**/*.php')))
|
||||
->map(fn ($path) => [
|
||||
(string) Illuminate\Support\Str::of($path)
|
||||
->replace([config_path('/'), '.php'], '')
|
||||
->replace('/', '.'),
|
||||
$path,
|
||||
]);
|
||||
|
||||
$vendor = collect(glob(base_path('vendor/**/**/config/*.php')))->map(fn (
|
||||
$path
|
||||
) => [
|
||||
(string) Illuminate\Support\Str::of($path)
|
||||
->afterLast('/config/')
|
||||
->replace('.php', '')
|
||||
->replace('/', '.'),
|
||||
$path,
|
||||
]);
|
||||
|
||||
$configPaths = $local
|
||||
->merge($vendor)
|
||||
->groupBy(0)
|
||||
->map(fn ($items) => $items->pluck(1));
|
||||
|
||||
$cachedContents = [];
|
||||
$cachedParsed = [];
|
||||
|
||||
function vsCodeGetConfigValue($value, $key, $configPaths)
|
||||
{
|
||||
$parts = explode('.', $key);
|
||||
$toFind = $key;
|
||||
$found = null;
|
||||
|
||||
while (count($parts) > 0) {
|
||||
array_pop($parts);
|
||||
$toFind = implode('.', $parts);
|
||||
|
||||
if ($configPaths->has($toFind)) {
|
||||
$found = $toFind;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($found === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$file = null;
|
||||
$line = null;
|
||||
|
||||
if ($found === $key) {
|
||||
$file = $configPaths->get($found)[0];
|
||||
} else {
|
||||
foreach ($configPaths->get($found) as $path) {
|
||||
$cachedContents[$path] ??= file_get_contents($path);
|
||||
$cachedParsed[$path] ??= token_get_all($cachedContents[$path]);
|
||||
|
||||
$keysToFind = Illuminate\Support\Str::of($key)
|
||||
->replaceFirst($found, '')
|
||||
->ltrim('.')
|
||||
->explode('.');
|
||||
|
||||
if (is_numeric($keysToFind->last())) {
|
||||
$index = $keysToFind->pop();
|
||||
|
||||
if ($index !== '0') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$key = collect(explode('.', $key));
|
||||
$key->pop();
|
||||
$key = $key->implode('.');
|
||||
$value = 'array(...)';
|
||||
}
|
||||
|
||||
$nextKey = $keysToFind->shift();
|
||||
$expectedDepth = 1;
|
||||
|
||||
$depth = 0;
|
||||
|
||||
foreach ($cachedParsed[$path] as $token) {
|
||||
if ($token === '[') {
|
||||
$depth++;
|
||||
}
|
||||
|
||||
if ($token === ']') {
|
||||
$depth--;
|
||||
}
|
||||
|
||||
if (!is_array($token)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$str = trim($token[1], '"\'');
|
||||
|
||||
if (
|
||||
$str === $nextKey &&
|
||||
$depth === $expectedDepth &&
|
||||
$token[0] === T_CONSTANT_ENCAPSED_STRING
|
||||
) {
|
||||
$nextKey = $keysToFind->shift();
|
||||
$expectedDepth++;
|
||||
|
||||
if ($nextKey === null) {
|
||||
$file = $path;
|
||||
$line = $token[2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($file) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'name' => $key,
|
||||
'value' => $value,
|
||||
'file' => $file === null ? null : str_replace(base_path('/'), '', $file),
|
||||
'line' => $line,
|
||||
];
|
||||
}
|
||||
|
||||
return collect(Illuminate\Support\Arr::dot(config()->all()))
|
||||
->map(fn ($value, $key) => vsCodeGetConfigValue($value, $key, $configPaths))
|
||||
->filter()
|
||||
->values();
|
||||
Reference in New Issue
Block a user