Graph Indexer incluye 16 gramáticas tree-sitter que cubren 15 lenguajes: JavaScript, TypeScript, TSX, Python, Go, Java, Kotlin, Scala, C#, Rust, C, C++, Ruby, PHP, Bash y CSS (con SCSS y Less). El enlace de referencias y la inferencia de tipos del receptor son más profundos en TypeScript, JavaScript, Python, Go, Java, C# y Rust, y la exactitud se ha verificado contra las herramientas reales de TypeScript, Go y Java.
¿Qué lenguajes indexa Graph Indexer?
Graph Indexer elige la gramática según la extensión del archivo. Las 16 gramáticas se ejecutan como WebAssembly dentro del paquete npm, así que un repositorio con varios lenguajes se indexa de una sola pasada y sin configurar nada más.
| Lenguaje | Extensiones | Nivel |
|---|---|---|
| JavaScript | .js, .jsx, .mjs, .cjs | Profundo |
| TypeScript | .ts, .mts, .cts (y .d.ts) | Profundo |
| TSX | .tsx | Profundo |
| Python | .py, .pyi | Profundo |
| Go | .go | Profundo |
| Java | .java | Profundo |
| C# | .cs | Profundo |
| Rust | .rs | Profundo |
| Kotlin | .kt, .kts | Estándar |
| Scala | .scala, .sc | Estándar |
| C | .c, .h | Estándar |
| C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx, .h++, .c++, .ipp, .inl | Estándar |
| Ruby | .rb, .rake, .gemspec | Estándar |
| PHP | .php, .phtml | Estándar |
| Bash | .sh, .bash, .zsh | Estándar |
| CSS | .css, .scss, .less | Estándar |
Las cabeceras son ambiguas entre C y C++. Un archivo .cpp o .cc hermano, o la sintaxis C++ de la propia cabecera, decide qué gramática se usa.
¿Qué significan los niveles de profundidad?
Graph Indexer extrae definiciones, referencias, imports y evidencia de tipos en todos los lenguajes con una consulta tree-sitter por gramática. Los niveles indican hasta dónde llega el enlace de referencias más allá de eso.
En el nivel profundo (TypeScript, JavaScript, Python, Go, Java, C# y Rust), Graph Indexer además infiere los tipos del receptor y sigue el sistema de imports del lenguaje: paths de tsconfig y workspaces, módulos de Go, paquetes de Python e imports relativos, y rutas crate, self y super de Rust. Una llamada como userService.find(id) se enlaza con UserService.find y no con todos los métodos llamados find.
En los demás lenguajes, Graph Indexer sigue indexando todas las definiciones y referencias y las resuelve por ámbito léxico, tipo envolvente, mismo archivo, imports y paquete, pero con menos inferencia de tipos. Fíate de las etiquetas de confianza de cada resultado: exact y high significan que la referencia se enlazó por ámbito, import o tipo inferido, y likely y possible que solo coincidía el nombre. La resolución se describe en Cómo funciona Graph Indexer.
¿En qué lenguajes se ha verificado Graph Indexer contra un type checker real?
Graph Indexer ha medido las referencias que devuelve contra tres herramientas reales. Cada cifra sale de los repositorios públicos fijados que describe la metodología de benchmarks.
| Lenguaje | Oráculo | Repositorios | Precisión | Recall |
|---|---|---|---|---|
| TypeScript | Compilador de TypeScript (findReferences) | nestjs, 400 símbolos | 99,7 % | 96,2 % |
| TypeScript | Compilador de TypeScript | servidor de Twenty, 28.512 archivos | 99,9 % | 92,4 % |
| Go | Type checker de Go | gin, caddy, nats-server | 99,2 % a 100 % | 97,2 % a 98,1 % |
| Java | Compilador de Java (front end de javac) | spring-petclinic, jsoup, Commons Collections | 95,5 % a 99,4 % | 86,1 % a 98,9 % |
En la muestra de nestjs, hacer grep del nombre alcanza una precisión del 12,8 %, así que la mayor parte de lo que devuelve no es una referencia real. La misma comparación en Go deja a grep en una precisión del 8,5 % al 23,8 %, y en Java del 1,5 % al 60,9 %. Tienes las tablas completas en la página de benchmarks y en la landing.
Python no se puntúa contra un compilador. Se mide en hechos de clases: 100 % de precisión en overrides y en herederos en sqlglot, y en networkx 98,3 % en overrides y 100 % en herederos.
¿Cuáles son los límites conocidos por lenguaje?
Graph Indexer no es un type checker, y estos límites están publicados en vez de ocultarse.
- TypeScript y JavaScript. Los literales de objeto con tipo contextual, la instanciación de genéricos, la reflexión y
anysolo se ven en parte. En el monorepo de Twenty siguen sin detectarse las llamadas por uniones y objetos registro, los implementadores en literales de objeto y los builders fluidos a través dethisgenérico. La inyección de dependencias por token de texto solo es visible en parte. - Go. Los métodos promovidos desde tipos de librería embebidos y las interfaces de librería aún no se tratan. Las implementaciones implícitas de interfaz obtienen entre 97,7 % y 100 % de precisión y entre 93,8 % y 100 % de recall.
- Java. Java fue el lenguaje más débil de los medidos: precisión del 95,5 % al 99,4 % y recall de solo el 86,1 % en Commons Collections. Las llamadas se enlazan con la sobrecarga que acepta su número de argumentos.
- Python.
getattry otras características dinámicas solo se ven en parte. El orden de resolución de métodos usa la linealización C3, así que los herederos con herencia múltiple se deciden bien. - Ruby y PHP. Los nombres de constructor siguen al lenguaje (
initializeen Ruby,__constructen PHP), así queFoo.newynew Foo()no se confunden con llamadas a un método normal. - En general. Solo se indexa el árbol de trabajo. Los nombres ambiguos o de la librería estándar, como
getyset, quedan sin enlazar en vez de adivinarse, y el pie de cada resultado informa de las llamadas con el mismo nombre que no se pudieron enlazar.
¿Qué archivos ignora Graph Indexer?
Dentro de un repositorio git, Graph Indexer toma la lista de archivos de git, así que respeta todas las reglas de .gitignore. También salta carpetas de dependencias y de compilación como node_modules, dist, build, target, vendor y __pycache__, los archivos minificados o generados y los de más de 1,5 MB. Fuera de git recorre el árbol con un evaluador sencillo de .gitignore.
¿Cómo compruebo qué ve Graph Indexer en mi lenguaje?
Ejecuta npx graph-indexer index en tu repositorio y luego npx graph-indexer status. Usa graph-indexer refs <nombre> para ver las referencias y sus etiquetas de confianza de cualquier símbolo y compáralas con tus propias herramientas. La instalación está en la página de instalación, cada herramienta se documenta en la página de herramientas, y lo de privacidad, coste y agentes está en las preguntas frecuentes.
Preguntas frecuentes
¿Cuántos lenguajes soporta Graph Indexer?
Graph Indexer incluye 16 gramáticas tree-sitter como WebAssembly: JavaScript, TypeScript, TSX, Python, Go, Java, Kotlin, Scala, C#, Rust, C, C++, Ruby, PHP, Bash y CSS (con SCSS y Less). Son 15 lenguajes, con TypeScript y TSX como dos gramáticas.
¿En qué lenguajes son más exactas las referencias?
El enlace de referencias y la inferencia de tipos son más profundos en TypeScript, JavaScript, Python, Go, Java, C# y Rust. La exactitud se ha medido contra el compilador de TypeScript, el type checker de Go y el compilador de Java; el resto se indexa pero no está verificado así.
¿Tengo que instalar gramáticas o servidores de lenguaje?
No. Cada gramática viene dentro del paquete npm como WebAssembly, con versión fijada y suma SHA-256. No se descarga ni se compila nada, y no hace falta instalar ni tener en marcha ningún servidor de lenguaje o compilador.