Перейти до вмісту

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 у попередньо створених індексах кількох каталогів.

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, який перехоплює ці винятки й натомість запускає сканування без індексу.