Sprachen
greppy bringt tree-sitter-Parser für mehr als 60 Sprachen mit. Die Unterstützung hat drei Stufen, und jede ist gemessen.
| Stufe | Sprachen | Was funktioniert |
|---|---|---|
| Graph vollständig geprüft | Rust, Python, Java, JavaScript, TypeScript, Go, C++, C#, Kotlin, Swift, Ruby | alles; Aufrufer, Aufgerufene, Nutzungen und Impact sind in Testgittern pro Sprache geprüft |
| Graph-Beziehungen | weitere Programmiersprachen, zum Beispiel Elixir, Scala, PHP und Haskell | Symbole, Definitions- und Textsuche, dazu Aufruf-, Nutzungs- und Import-Beziehungen |
| Symbole und Text | deklarative Formate wie JSON, YAML, TOML und Markdown | Symbole und Textsuche; einen Aufrufgraphen haben diese Formate von Natur aus nicht |
Drei Sprachen in einem Repository
Ein kleines Projekt in Python, Go und TypeScript hat je Sprache eine Funktion und ihren Aufrufer in einer zweiten Datei. Hier sind die sechs Dateien, gekürzt auf die Zeilen, die das Beispiel tragen:
py/pricing.py def apply_discount(price, percent)
py/cart.py from pricing import apply_discount · Cart.total() ruft apply_discount
go/tax.go func ApplyTax(net float64) float64
go/invoice.go func (i Invoice) Total() ruft ApplyTax
ts/format.ts export function formatPrice(cents: number)
ts/receipt.ts import { formatPrice } from "./format" · renderReceipt() ruft formatPrice
Ein Index deckt alle drei Sprachen ab:
$ greppy index .
indexed 6 files (0 unsupported, 0 unreadable, 0 oversize, 0 file-limit, 0 time-budget); 9 nodes extracted; generation 1 (project: shop)
embedded 9 code spans (0 local-store reused, 9 global-cache hits, 0 inference misses, 25 considered, 16 non-definition skipped, 0 missing-file, 0 invalid-span, 0 oversize, 0 failed, 0 stale pruned)
Ein Aufruf fragt nach den Aufrufern in allen drei Sprachen. Bei Python erscheint zusätzlich der Import auf Dateiebene:
$ greppy who-calls apply_discount ApplyTax formatPrice
apply_discount
py/cart.py:1 __file__
py/cart.py:9 Cart::total
ApplyTax
go/invoice.go:7 Invoice::Total
formatPrice
ts/receipt.ts:3 renderReceipt
Die semantische Suche rankt über alle Sprachen hinweg:
$ greppy search "add VAT to a net amount"
go/invoice.go:7 Invoice::Total — returns the total by applying tax to Net
go/tax.go:4 ApplyTax — returns the net value multiplied by 1.19
go/invoice.go:3 Invoice
ts/format.ts:1 formatPrice — formats a number of cents as a two-decimal EUR string
ts/receipt.ts:3 renderReceipt — formats a list of line pairs into a single string
py/pricing.py:1 apply_discount — reduces a price by a percentage and rounds the result
py/cart.py:9 Cart::total — computes the total price by summing item prices and applying a discount
py/cart.py:4 Cart
greppy where-am-i nennt in der ersten Zeile die Sprachen deines Repositorys, für dieses Projekt go, python, typescript, 6 files, 9 definitions, für serde 1.0.229 rust, toml, markdown, 339 files, 3,908 definitions.
Jede Sprache
greppy 0.4.1 erkennt und indexiert diese 63 Sprachen. Jede ist mit einer Beispieldatei und der angegebenen Endung geprüft:
| Gruppe | Sprachen |
|---|---|
| Systeme und Hardware | C (.c, .h), C++ (.cpp, .hpp), CUDA (.cu), Objective-C (.m), D (.d), Rust (.rs), Zig (.zig), Go (.go), Swift (.swift), Ada (.adb), Fortran (.f90), Pascal (.pas), GLSL (.glsl), Verilog (.sv), VHDL (.vhd) |
| JVM und .NET | Java (.java), Kotlin (.kt), Scala (.scala), Groovy (.groovy), Clojure (.clj), C# (.cs), F# (.fs) |
| Web | JavaScript (.js, .jsx, .mjs), TypeScript (.ts, .tsx), Vue (.vue), Svelte (.svelte), CSS (.css), PHP (.php), Dart (.dart), Solidity (.sol) |
| Skriptsprachen | Python (.py), Ruby (.rb), Crystal (.cr), Lua (.lua), Bash (.sh), PowerShell (.ps1), R (.R), Julia (.jl), MATLAB (.matlab), GDScript (.gd) |
| Funktional | Haskell (.hs), OCaml (.ml), Elixir (.ex), Erlang (.erl), Elm (.elm), Gleam (.gleam), PureScript (.purs), Racket (.rkt), Scheme (.scm), Common Lisp (.lisp, .cl), Nix (.nix) |
| Daten, Schema und Build | JSON, YAML, TOML, Markdown (.md), SQL, GraphQL, Protobuf (.proto), Prisma, HCL (.tf, .hcl), CMake (.cmake), Make (Makefile, .mk), Dockerfile (.dockerfile) |
In jeder dieser Sprachen arbeiten search, search-symbol, search-pattern, read und die Edit-Befehle auf den indexierten Definitionen. greppy diagnostics listet für dein Repository jede erkannte Sprache mit der Zahl ihrer indexierten Dateien.
Aufrufgraph
Die Beispieldateien enthalten je eine Funktion add und eine zweite Funktion, die sie aufruft. greppy who-calls findet diesen Aufruf ohne weitere Einrichtung in 33 Sprachen:
Bash, C, C++, C#, Clojure, Crystal, CUDA, D, Dart, Elixir, F#, GDScript, Gleam, GLSL, Go, Groovy, Haskell, Java, JavaScript, Kotlin, Lua, OCaml, PHP, Python, R, Racket, Ruby, Rust, Scala, Scheme, Swift, TypeScript, Zig.
Damit arbeiten dort auch callees, path und impact. Außerhalb der vollständig geprüften Sprachen ist der Graph ein starker Hinweis; prüfe ihn am Quelltext.
Vollständig geprüfter Graph
Elf Sprachen haben einen vollständig geprüften Graphen:
- Rust
- Python
- Java
- JavaScript
- TypeScript
- Go
- C++
- C#
- Kotlin
- Swift
- Ruby
Jede ist über ein Gitter mit 12 Zellen pro Sprache vollständig geprüft: dateiübergreifende CALLS-, USAGE-, TYPE_REF- und IMPORTS-Kanten, dazu Stabilität beim Neuindexieren und Frische-Verhalten, zusammen mit Sprach-Fixtures und Tests an echten Repositorys. Gitter und Fixtures sind Integrationstests in crates/cli/tests/, zum Beispiel graph_nav.rs und graph_grid_ruby.rs. Die übrigen Programmiersprachen folgen in Wellen.
Semantische Suche
search arbeitet auf Definitionen in jeder indexierten Sprache: EmbeddingGemma bettet die Definitionen ein, und der Navigationshinweis unter jedem Treffer kommt von greppys feinabgestimmtem Qwen3.5-Modell. Die semantische Suche hängt nicht an Graphkanten und findet deshalb auch Code, den der Graph nicht verbindet.
Was kein Parser sieht
Statische Analyse kann Reflection, Dependency Injection zur Laufzeit, generierten Code, Makro-Expansion, Monkeypatching und dynamischen Dispatch übersehen, in jeder Sprache. Die Frische der Belege ist fail-closed: greppy gibt keine wissentlich veralteten Quelltext-Belege aus. Prüfe vorgeschlagene Änderungen mit der Toolchain der Sprache und der Testsuite. Siehe Grenzen.
Repositories mit mehreren Paketen
Ein Repository mit mehreren Paketen, etwa ein Cargo-, npm- oder Go-Workspace, bekommt einen Index. where-am-i, search, search-symbol und search-pattern decken alle Pakete in einem Aufruf ab. Bei serde stehen serde/, serde_core/, serde_derive/, serde_derive_internals/ und test_suite/ in einer Übersicht.
Eine Sprache hinzufügen
Das Repository enthält ADDING_A_LANGUAGE.md, eine in sich geschlossene Anleitung: Extraktion für eine Sprache ergänzen, sie bis zur Korrektheitsgrenze des Projekts prüfen und einen Pull Request öffnen. Beiträge folgen CONTRIBUTING.md.