Перейти к содержимому

PHP API

Greph\Greph

Класс Greph\Greph — статическая точка входа. Он предоставляет все операции поиска, переписывания и индексирования. Каждый метод принимает один путь или список путей.

PHP
use Greph\Greph;

walk

PHP
public static function walk(string|array $paths, ?WalkOptions $options = null): FileList

Преобразует $paths в плоский FileList абсолютных путей к файлам. Учитывает gitignore, .grephignore, фильтры типов файлов, glob-шаблоны, включение скрытых файлов, переход по символьным ссылкам, обнаружение бинарных файлов и максимальный размер файла.

PHP
use Greph\Walker\WalkOptions;
use Greph\Walker\FileTypeFilter;

$files = Greph::walk('src', new WalkOptions(
    fileTypeFilter: new FileTypeFilter(['php']),
));

foreach ($files->paths() as $path) {
    echo "$path\n";
}

searchText

PHP
public static function searchText(
    string $pattern,
    string|array $paths,
    ?TextSearchOptions $options = null,
): array

Выполняет текстовый поиск и возвращает list<TextFileResult>. Каждый TextFileResult содержит путь к файлу и список объектов TextMatch (строка, столбец, содержимое, захваченные значения и необязательный контекст).

PHP
use Greph\Greph;
use Greph\Text\TextSearchOptions;

$results = Greph::searchText(
    'function',
    'src',
    new TextSearchOptions(
        fixedString: true,
        caseInsensitive: true,
        beforeContext: 1,
        afterContext: 1,
        jobs: 4,
    ),
);

foreach ($results as $file) {
    foreach ($file->matches as $match) {
        echo "{$file->file}:{$match->line}:{$match->content}\n";
    }
}

Когда включен jobs > 1 и число файлов превышает порог для рабочих процессов, searchText автоматически передает сканирование WorkerPool. В остальных случаях сканирование выполняется в текущем процессе.


searchAst

PHP
public static function searchAst(
    string $pattern,
    string|array $paths,
    ?AstSearchOptions $options = null,
): array

Выполняет структурный поиск по AST и возвращает list<AstMatch>. Шаблоны записываются в исходном коде PHP с метапеременными $VAR и $$$VARIADIC. Каждый AstMatch содержит файл, захваченный PhpParser\Node, захваченные значения, начальную и конечную строки и смещения в байтах, а также фрагмент совпавшего исходного кода.

PHP
use Greph\Greph;
use Greph\Ast\AstSearchOptions;

$matches = Greph::searchAst(
    'new $CLASS()',
    'src',
    new AstSearchOptions(),
);

foreach ($matches as $match) {
    echo "{$match->file}:{$match->startLine}:{$match->code}\n";
}

rewriteAst

PHP
public static function rewriteAst(
    string $searchPattern,
    string $rewritePattern,
    string|array $paths,
    ?AstSearchOptions $options = null,
): array

Выполняет структурное переписывание и возвращает list<RewriteResult>. Каждый RewriteResult содержит путь к файлу, исходное и переписанное содержимое, а также число замен. Формат сохраняется: заменяются только диапазоны совпавших узлов, остальная часть файла не меняется.

PHP
$rewrites = Greph::rewriteAst(
    'array($$$ITEMS)',
    '[$$$ITEMS]',
    'src',
);

foreach ($rewrites as $result) {
    if ($result->changed()) {
        file_put_contents($result->file, $result->rewrittenContents);
    }
}

Фасад не записывает изменения на диск — решение об их применении остается за вызывающим кодом. CLI применяет их, если не задан --dry-run или --interactive.


buildTextIndex

PHP
public static function buildTextIndex(
    string $rootPath = '.',
    ?string $indexPath = null,
    IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): IndexBuildResult

Создает новый индекс триграмм и вхождений идентификаторов для $rootPath. Индекс сохраняется в $indexPath (по умолчанию — $rootPath/.greph-index). Значение $lifecycle может быть static, manual-refresh, opportunistic-refresh или strict-stale-check. Возвращает IndexBuildResult с числом файлов и триграмм, а также количеством добавленных, обновленных, удаленных и неизмененных записей.

refreshTextIndex

PHP
public static function refreshTextIndex(
    string $rootPath = '.',
    ?string $indexPath = null,
    IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): IndexBuildResult

Постепенно обновляет существующий текстовый индекс. Файлы хешируются заново, и перезаписываются только изменившиеся записи.

searchTextIndexed

PHP
public static function searchTextIndexed(
    string $pattern,
    string|array $paths,
    ?TextSearchOptions $options = null,
    ?string $indexPath = null,
): array

Выполняет текстовый поиск по подготовленному индексу. Если индекс не существует, выдает ошибку времени выполнения (сначала вызовите buildTextIndex). Возвращает list<TextFileResult> той же структуры, что и searchText.

PHP
Greph::buildTextIndex('.');
$results = Greph::searchTextIndexed('function', 'src');

searchTextIndexedMany

PHP
public static function searchTextIndexedMany(
    string $pattern,
    string|array $paths,
    array $indexPaths,
    ?TextSearchOptions $options = null,
): array

Выполняет текстовый поиск по подготовленным индексам в нескольких каталогах. Greph ищет в каждом подходящем индексе, удаляет дубликаты по абсолютным путям к файлам и запускает обычное сканирование только для путей за пределами всех заданных корневых каталогов индексов.

loadIndexSet

PHP
public static function loadIndexSet(?string $manifestPath = null): IndexSet

Загружает манифест набора индексов; по умолчанию — .greph-index-set.json в текущем рабочем каталоге.

searchTextIndexedSet

PHP
public static function searchTextIndexedSet(
    string $pattern,
    string|array $paths,
    ?TextSearchOptions $options = null,
    ?string $manifestPath = null,
    array $entryNames = [],
): array

Разрешает выбранные записи text из манифеста набора индексов и выполняет эквивалент searchTextIndexedMany.


buildAstIndex / refreshAstIndex

PHP
public static function buildAstIndex(
    string $rootPath = '.',
    ?string $indexPath = null,
    IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstIndexBuildResult
public static function refreshAstIndex(
    string $rootPath = '.',
    ?string $indexPath = null,
    IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstIndexBuildResult

Создает индекс фактов AST или постепенно обновляет существующий. По умолчанию извлеченные факты сохраняются в $rootPath/.greph-ast-index.

searchAstIndexed

PHP
public static function searchAstIndexed(
    string $pattern,
    string|array $paths,
    ?AstSearchOptions $options = null,
    ?string $indexPath = null,
): array

Использует индекс фактов для отбора кандидатов, а затем повторно проверяет совпадения по исходному коду. Возвращает данные той же структуры list<AstMatch>, что и searchAst.

searchAstIndexedMany

PHP
public static function searchAstIndexedMany(
    string $pattern,
    string|array $paths,
    array $indexPaths,
    ?AstSearchOptions $options = null,
): array

Выполняет поиск по подготовленным индексам фактов AST в нескольких каталогах индексов AST.

searchAstIndexedSet

PHP
public static function searchAstIndexedSet(
    string $pattern,
    string|array $paths,
    ?AstSearchOptions $options = null,
    ?string $manifestPath = null,
    array $entryNames = [],
): array

Разрешает выбранные записи ast-index из манифеста набора индексов и выполняет эквивалент searchAstIndexedMany.

buildAstCache / refreshAstCache

PHP
public static function buildAstCache(
    string $rootPath = '.',
    ?string $indexPath = null,
    IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstCacheBuildResult
public static function refreshAstCache(
    string $rootPath = '.',
    ?string $indexPath = null,
    IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstCacheBuildResult

Создает хранилище разобранных деревьев или постепенно обновляет существующее. По умолчанию сериализованные деревья сохраняются в $rootPath/.greph-ast-cache.

searchAstCached

PHP
public static function searchAstCached(
    string $pattern,
    string|array $paths,
    ?AstSearchOptions $options = null,
    ?string $indexPath = null,
): array

Выполняет поиск по AST в кэшированных разобранных деревьях, полностью пропуская этап разбора. Возвращает данные той же структуры list<AstMatch>, что и searchAst.

searchAstCachedMany

PHP
public static function searchAstCachedMany(
    string $pattern,
    string|array $paths,
    array $indexPaths,
    ?AstSearchOptions $options = null,
): array

Выполняет поиск по подготовленному кэшу AST в нескольких каталогах кэша.

searchAstCachedSet

PHP
public static function searchAstCachedSet(
    string $pattern,
    string|array $paths,
    ?AstSearchOptions $options = null,
    ?string $manifestPath = null,
    array $entryNames = [],
): array

Разрешает выбранные записи ast-cache из манифеста набора индексов и выполняет эквивалент searchAstCachedMany.


Greph\Text\TextSearchOptions

Неизменяемый объект параметров для текстового поиска.

PHP
new TextSearchOptions(
    bool $fixedString = false,
    bool $caseInsensitive = false,
    bool $wholeWord = false,
    bool $invertMatch = false,
    ?int $maxCount = null,
    int $beforeContext = 0,
    int $afterContext = 0,
    bool $countOnly = false,
    bool $filesWithMatches = false,
    bool $filesWithoutMatches = false,
    bool $jsonOutput = false,
    bool $tracePlan = false,
    int $jobs = 1,
    bool $respectIgnore = true,
    bool $includeHidden = false,
    bool $followSymlinks = false,
    bool $skipBinaryFiles = true,
    bool $includeGitDirectory = false,
    ?FileTypeFilter $fileTypeFilter = null,
    int $maxFileSizeBytes = 10485760,
    array $globPatterns = [],
    bool $showLineNumbers = true,
    bool $showFileNames = true,
)

Проверка:

  • jobs >= 1
  • beforeContext, afterContext >= 0
  • maxCount === null || maxCount >= 1

Используйте walkOptions(), чтобы получить соответствующий WalkOptions, если нужно отдельно обойти дерево файлов.

tracePlan используется поиском по подготовленным индексам, а greph-index CLI передается в потоки stderr для вывода диагностических сообщений планировщика. Сам по себе обычный searchText его не использует.


Greph\Ast\AstSearchOptions

Неизменяемый объект параметров для поиска и переписывания AST.

PHP
new AstSearchOptions(
    string $language = 'php',
    int $jobs = 1,
    bool $respectIgnore = true,
    bool $includeHidden = false,
    bool $followSymlinks = false,
    bool $skipBinaryFiles = true,
    bool $includeGitDirectory = false,
    ?FileTypeFilter $fileTypeFilter = null,
    int $maxFileSizeBytes = 10485760,
    array $globPatterns = [],
    bool $skipParseErrors = true,
    bool $dryRun = false,
    bool $interactive = false,
    bool $jsonOutput = false,
    bool $tracePlan = false,
)

Фильтр типов файлов по умолчанию для режима AST — php. Если skipParseErrors имеет значение true (по умолчанию), файлы, которые не удалось разобрать, молча пропускаются; установите false, чтобы ошибки разбора вызывали исключения. tracePlan используется прогретыми поисковыми модулями AST, а greph-index ast-index|ast-cache search — для вывода диагностики отсечения кандидатов.


Greph\Walker\WalkOptions

Объект параметров только для чтения для обходчика файлов.

PHP
new WalkOptions(
    bool $respectIgnore = true,
    bool $includeHidden = false,
    bool $followSymlinks = false,
    bool $skipBinaryFiles = false,
    bool $includeGitDirectory = false,
    ?FileTypeFilter $fileTypeFilter = null,
    int $maxFileSizeBytes = 10485760,
    array $globPatterns = [],
)

Greph\Walker\FileTypeFilter

Преобразует именованные типы файлов в списки расширений. Встроенные псевдонимы:

Псевдоним Расширения
css css, sass, scss
html htm, html, phtml
js cjs, js, mjs
json json
md markdown, md
php inc, php, php3, php4, php5, php7, php8, phpt, phtml
txt txt
ts ts, tsx
xml xml
yaml yaml, yml
PHP
new FileTypeFilter(includeTypes: ['php'], excludeTypes: ['md']);

Объекты результатов

Greph\Text\TextFileResult

PHP
final readonly class TextFileResult
{
    public string $file;
    /** @var list<TextMatch> */
    public array $matches;

    public function matchCount(): int;
    public function hasMatches(): bool;
}

Greph\Text\TextMatch

PHP
final readonly class TextMatch
{
    public string $file;
    public int $line;
    public int $column;
    public string $content;
    public string $matchedText;
    /** @var array<int|string, string> */
    public array $captures;
    /** @var list<array{line: int, content: string}> */
    public array $beforeContext;
    /** @var list<array{line: int, content: string}> */
    public array $afterContext;
}

Greph\Ast\AstMatch

PHP
final readonly class AstMatch
{
    public string $file;
    public PhpParser\Node $node;
    /** @var array<string, mixed> */
    public array $captures;
    public int $startLine;
    public int $endLine;
    public int $startFilePos;
    public int $endFilePos;
    public string $code;
}

Greph\Ast\RewriteResult

PHP
final readonly class RewriteResult
{
    public string $file;
    public string $originalContents;
    public string $rewrittenContents;
    public int $replacementCount;

    public function changed(): bool;
}

Greph\Index\IndexBuildResult

PHP
final readonly class IndexBuildResult
{
    public string $rootPath;
    public string $indexPath;
    public int $fileCount;
    public int $trigramCount;
    public int $addedFiles;
    public int $updatedFiles;
    public int $deletedFiles;
    public int $unchangedFiles;
}

AstIndexBuildResult и AstCacheBuildResult имеют ту же структуру с соответствующей заменой factCount и cachedTreeCount.


Исключения

Greph вызывает три типизированных исключения, все в Greph\Exceptions:

Исключение Когда возникает
WalkerException Ошибки файловой системы при обходе (путь отсутствует, каталог недоступен для чтения)
PatternException Некорректное регулярное выражение или шаблон AST
ParseException Не удалось разобрать исходный код PHP (только при skipParseErrors: false)

Методы индексированного поиска вызывают \RuntimeException, если в запрошенном расположении нет индекса. В greph-index CLI предусмотрен параметр --fallback scan, который перехватывает такие ошибки и вместо этого выполняет обычное сканирование без индекса.