Implement existing fix from https://github.com/felixfbecker/php-language-server/issues/462#issuecomment-546696984.
parent
9dc1656592
commit
3fc105717d
|
@ -3,7 +3,6 @@ declare(strict_types = 1);
|
||||||
|
|
||||||
namespace LanguageServer\FilesFinder;
|
namespace LanguageServer\FilesFinder;
|
||||||
|
|
||||||
use Webmozart\Glob\Iterator\GlobIterator;
|
|
||||||
use Sabre\Event\Promise;
|
use Sabre\Event\Promise;
|
||||||
use function Sabre\Event\coroutine;
|
use function Sabre\Event\coroutine;
|
||||||
use function LanguageServer\{pathToUri, timeout};
|
use function LanguageServer\{pathToUri, timeout};
|
||||||
|
@ -23,7 +22,7 @@ class FileSystemFilesFinder implements FilesFinder
|
||||||
$uris = [];
|
$uris = [];
|
||||||
foreach (new GlobIterator($glob) as $path) {
|
foreach (new GlobIterator($glob) as $path) {
|
||||||
// Exclude any directories that also match the glob pattern
|
// Exclude any directories that also match the glob pattern
|
||||||
if (!is_dir($path)) {
|
if (!is_dir($path) || !is_readable($path)) {
|
||||||
$uris[] = pathToUri($path);
|
$uris[] = pathToUri($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
<?php
|
||||||
|
declare (strict_types = 1);
|
||||||
|
|
||||||
|
namespace LanguageServer\FilesFinder;
|
||||||
|
|
||||||
|
use ArrayIterator;
|
||||||
|
use EmptyIterator;
|
||||||
|
use IteratorIterator;
|
||||||
|
use RecursiveIteratorIterator;
|
||||||
|
use Webmozart\Glob\Glob;
|
||||||
|
use Webmozart\Glob\Iterator\GlobFilterIterator;
|
||||||
|
use Webmozart\Glob\Iterator\RecursiveDirectoryIterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns filesystem paths matching a glob.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
*
|
||||||
|
* @see Glob
|
||||||
|
*/
|
||||||
|
class GlobIterator extends IteratorIterator
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates a new iterator.
|
||||||
|
*
|
||||||
|
* @param string $glob The glob pattern.
|
||||||
|
* @param int $flags A bitwise combination of the flag constants in
|
||||||
|
* {@link Glob}.
|
||||||
|
*/
|
||||||
|
public function __construct($glob, $flags = 0)
|
||||||
|
{
|
||||||
|
$basePath = Glob::getBasePath($glob, $flags);
|
||||||
|
if (!Glob::isDynamic($glob) && file_exists($glob)) {
|
||||||
|
// If the glob is a file path, return that path
|
||||||
|
$innerIterator = new ArrayIterator(array($glob));
|
||||||
|
} elseif (is_dir($basePath)) {
|
||||||
|
// Use the system's much more efficient glob() function where we can
|
||||||
|
if (
|
||||||
|
// glob() does not support /**/
|
||||||
|
false === strpos($glob, '/**/') &&
|
||||||
|
// glob() does not support stream wrappers
|
||||||
|
false === strpos($glob, '://') &&
|
||||||
|
// glob() does not support [^...] on Windows
|
||||||
|
('\\' !== DIRECTORY_SEPARATOR || false === strpos($glob, '[^'))
|
||||||
|
) {
|
||||||
|
$results = glob($glob, GLOB_BRACE);
|
||||||
|
|
||||||
|
// $results may be empty or false if $glob is invalid
|
||||||
|
if (empty($results)) {
|
||||||
|
// Parse glob and provoke errors if invalid
|
||||||
|
Glob::toRegEx($glob);
|
||||||
|
|
||||||
|
// Otherwise return empty result set
|
||||||
|
$innerIterator = new EmptyIterator();
|
||||||
|
} else {
|
||||||
|
$innerIterator = new ArrayIterator($results);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Otherwise scan the glob's base directory for matches
|
||||||
|
$innerIterator = new GlobFilterIterator(
|
||||||
|
$glob,
|
||||||
|
new RecursiveIteratorIterator(
|
||||||
|
new RecursiveDirectoryIterator(
|
||||||
|
$basePath,
|
||||||
|
RecursiveDirectoryIterator::CURRENT_AS_PATHNAME,
|
||||||
|
RecursiveDirectoryIterator::SKIP_DOTS
|
||||||
|
),
|
||||||
|
RecursiveIteratorIterator::SELF_FIRST,
|
||||||
|
RecursiveIteratorIterator::CATCH_GET_CHILD
|
||||||
|
),
|
||||||
|
GlobFilterIterator::FILTER_VALUE,
|
||||||
|
$flags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If the glob's base directory does not exist, return nothing
|
||||||
|
$innerIterator = new EmptyIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
parent::__construct($innerIterator);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue