Indeksēta AST meklēšana
Indeksētā AST meklēšana ir AST meklēšanas uzsildītās kešatmiņas versija. Pirmajā izsaukumā mezglu līmeņa fakti (izsaukumu nosaukumi, instancēšana, klašu deklarācijas, metožu deklarācijas) tiek izgūti un saglabāti diskā; turpmākajos izsaukumos krātuve palīdz izlaist failus, kuros nevar būt strukturālas atbilstības. Pēc tam atbilstības meklētājs atkārtoti pārbauda kandidātus avota kodā.
Faktu indekss ir pieejams apakškomandā greph-index ast-index CLI un fasādes metodēs Greph::buildAstIndex() / Greph::searchAstIndexed(). Tas tiek izmantots arī uzsildītās vairāku indeksu un uz manifestiem balstītās kopu darbplūsmās.
Indeksa izveide
# Full build at the current directory
./vendor/bin/greph-index ast-index build .
# Full build at an explicit root
./vendor/bin/greph-index ast-index build path/to/repo
# Use a non-default index directory
./vendor/bin/greph-index ast-index build . --index-dir /tmp/greph-ast-index
# Build a mutable overlay that can refresh cheaply on demand
./vendor/bin/greph-index ast-index build . \
--lifecycle opportunistic-refresh \
--auto-refresh-max-files 32 \
--auto-refresh-max-bytes 1048576
Pēc noklusējuma faktu indekss tiek glabāts mapē <root>/.greph-ast-index/.
Pēc veiksmīgas izveides tiek parādīts kopsavilkums vienā rindā:
Built AST index for 2547 files in .greph-ast-index (84931 fact rows, +2547 ~0 -0 =0)
Četri skaitītāji uzrāda pievienotos, atjauninātos, dzēstos un nemainītos failus kopš pēdējās izveides.
Indeksa atsvaidzināšana
./vendor/bin/greph-index ast-index refresh .
refresh atkārtoti pārlūko indeksēto saknes mapi, atkārtoti parsē mainītos failus un pārraksta tikai mainītos faktu ierakstus. Izvadē tiek izmantoti tie paši četri skaitītāji, kas teksta indeksam.
Dzīves cikla profili darbojas tāpat kā uzsildītie teksta indeksi:
static: nekad automātiski nepārbauda datu aktualitāti un neveic izmaiņasmanual-refresh: ziņo par novecojušu stāvoklistats, bet meklēšanas laikā nekad neveic atsvaidzināšanuopportunistic-refresh: atsvaidzina tikai tad, ja mainīto failu kopa joprojām ir pietiekami mazastrict-stale-check: novecojušu datu gadījumā atsvaidzināšanas vietā noraida meklēšanu
Vaicājumi indeksā
./vendor/bin/greph-index ast-index search 'new $CLASS()' src
./vendor/bin/greph-index ast-index search '$obj->$method($$$ARGS)' src
./vendor/bin/greph-index ast-index search --json 'array($$$ITEMS)' src
./vendor/bin/greph-index ast-index search -l 'array($$$ITEMS)' src
./vendor/bin/greph-index ast-index search --trace-plan 'new $CLASS()' src
Metamainīgo sintakse ir tāda pati kā vietējā AST meklēšanā. Pilnu gramatiku skatiet sadaļā Režīmi / AST meklēšana.
Opcijas
| Karodziņš | Nozīme |
|---|---|
--lang NAME |
AST valoda. Noklusējums: php |
-j N, --jobs N |
Paralēlo darbplūsmu skaits |
-l, --files-with-matches |
Norādīt tikai atbilstošos failus |
--glob GLOB |
Iekļaut tikai failus, kuru ceļi atbilst GLOB |
--type NAME / --type-not NAME |
Failu tipu filtrs |
--json |
Izvadīt JSON formāta datus |
--no-ignore |
Ignorēt .gitignore un .grephignore |
--hidden |
Iekļaut slēptos failus |
--strict-parse |
Parsēšanas kļūdas gadījumā nevis izlaist to, bet pārtraukt darbību |
--fallback MODE |
Ja nav indeksa: fail (noklusējums) vai scan |
--index-dir DIR |
Izmantot citu indeksa mapi |
--trace-plan |
Izvadīt uzsildītās AST plānotāja diagnostikas datus uz stderr |
--show-index-origin |
Vairāku indeksu vai kopas režīmā pievienot izvades sākumā atbilstošā indeksa marķējumu |
Rezerves režīms, ja trūkst indeksa
Pēc noklusējuma ast-index search parāda kļūdu, ja pieprasītajā vietā nav indeksa. Lai tā vietā veiktu vietējo AST skenēšanu, norādiet --fallback scan. Tas ir piemērots iestatījums rīkiem, kas vēlas izmantot indeksēto meklēšanu, kad tā ir pieejama, bet joprojām saņemt rezultātus, ja indekss vēl nav izveidots.
./vendor/bin/greph-index ast-index search --fallback scan 'new $CLASS()' src
Vairāku indeksu meklēšana
Vienā komandā varat meklēt vairākos uzsildītos AST indeksos, atkārtoti norādot --index-dir. Tas noder tādiem izkārtojumiem kā WordPress kodols kopā ar spraudni vai tēmu.
./vendor/bin/greph-index ast-index search \
--index-dir ../wordpress/.greph-ast-index \
--index-dir ./.greph-ast-index \
--show-index-origin \
'new $CLASS()' .
Ja ir iespējots --show-index-origin, izvades sākumā tiek pievienots atbilstošā uzsildītā indeksa ieraksta nosaukums, lai redzētu, kura saknes mape atrada atbilstību.
Uz manifestiem balstītas indeksu kopas
Lai izveidotu stabilas uzsildītās vides, definējiet manifestu un lieciet greph-index set darboties ar grupētajiem indeksiem:
./vendor/bin/greph-index set build
./vendor/bin/greph-index set stats --mode ast-index --dry-refresh
./vendor/bin/greph-index set search --mode ast-index --show-index-origin 'new $CLASS()' .
Kopu apakškomandās tiek izmantota tā pati dzīves cikla pārvaldība, novecojušu datu pārbaudes un plānotāja diagnostika, kas tiešā ast-index izmantošanā.
Plānotāja diagnostika
--trace-plan parāda, kā Greph sašaurināja vaicājumu pirms pilnā atbilstības meklētāja palaišanas. ast-index tas parasti ietver:
- no parauga izgūto aptuveno faktu parakstu
- meklēto uzsildīto indeksu skaitu
- faktu filtra noraidīto failu skaitu
- to kandidātfailu skaitu, kas atkārtoti parsēti precīzai strukturālai pārbaudei
Ko glabā indekss
Katrai indeksētajai datnei AST faktu izgūšanas process saglabā ierakstu par katru "interesanto" mezglu. Faktu veidi aptver konstrukcijas, kuras AST paraugi visbiežāk meklē:
- Funkciju un metožu izsaukumi (pēc izsauktā nosaukuma)
- Klašu instancēšana (pēc klases nosaukuma)
- Klašu, interfeisu, traītu un enum tipu deklarācijas (pēc nosaukuma)
- Funkciju deklarācijas (pēc nosaukuma)
- Metožu deklarācijas (pēc nosaukuma un redzamības)
- Use priekšraksti
Kad pienāk vaicājums, Greph\Ast\AstFactQuery pārvērš meklēšanas paraugu aptuvenā faktu parakstā (piemēram, "jāsatur new jebkurai klasei") un atlasa atbilstošos ierakstus faktu krātuvē. Pēc tam atlikušie faili tiek atkārtoti parsēti un salīdzināti ar pilno paraugu.
Tas nozīmē, ka faktu indekss ir priekšfiltrs, nevis pilnas precizitātes atbilstību krātuve. Atbilstības pārbaudes laikā avota kods joprojām tiek parsēts, tāpēc strukturālā precizitāte ir tāda pati kā vietējā AST meklēšanā; mazāks ir tikai kandidātu kopums.
Kad to izmantot
Indeksētais AST režīms ir piemērots, ja:
- Atkārtoti palaižat tos pašus strukturālos vaicājumus vienā un tajā pašā koda bāzē.
- Paraugos tiek meklētas identificējamas formas (izsaukuma nosaukums, klases nosaukums, deklarācijas veids), ko saglabā faktu izgūšanas process.
- Vēlaties samazināt aizturi, salīdzinot ar katra faila atkārtotu parsēšanu.
Ja paraugu atšķirošā pazīme nav faktu kopā (piemēram, sarežģītas ligzdotas izteiksmes bez atpazīstama sākuma), kešotais AST režīms parasti ir piemērotāks, jo tas pilnībā izlaiž parsēšanu un nepaļaujas uz aptuvenu parakstu.
Izmantošana programmā
use Greph\Greph;
use Greph\Ast\AstSearchOptions;
use Greph\Index\IndexLifecycleProfile;
Greph::buildAstIndex('.', lifecycle: IndexLifecycleProfile::OpportunisticRefresh);
$matches = Greph::searchAstIndexed(
'new $CLASS()',
'src',
new AstSearchOptions(jobs: 4, tracePlan: true),
);
searchAstIndexed pieņem tādu pašu AstSearchOptions kā vietējā AST meklēšana un atgriež tādas pašas formas list<AstMatch>. Vairāku indeksu vai uz manifestiem balstītām darbplūsmām izmantojiet searchAstIndexedMany(...) un searchAstIndexedSet(...).