Skip to main content

Language Parsers

Revet uses Tree-sitter for fast, accurate AST parsing. Each language parser builds nodes and edges in the code dependency graph.

Supported languages

LanguageExtensionsGraph features
Python.pyFunctions, classes, decorators, async, nested scopes
TypeScript / JS.ts, .tsx, .js, .jsxClasses, interfaces, generics, arrow functions, enums
Rust.rsFunctions, structs, enums, traits, impl blocks
Go.goFunctions, methods, structs, interfaces, goroutines
Java.javaClasses, interfaces, records, enums, nested classes
C#.csClasses, interfaces, records, structs, attributes, generics
Kotlin.kt, .ktsClasses, objects, data classes, annotations, sealed classes
Ruby.rb, .rake, .gemspecClasses, modules, mixins, attr_accessors
PHP.phpClasses, traits, enums, namespaces, attributes
Swift.swiftClasses, structs, protocols, extensions, enums
C / C++.c, .h, .cpp, .cc, .cxx, .hpp, .hxxFunctions, structs, C++ classes with inheritance, #include imports, macros, call graph

What parsers produce

Each parser creates:

  • File node — one per source file, with language metadata
  • Function / Method nodes — with parameter lists and line numbers
  • Class / Struct / Trait nodes — with inheritance relationships
  • Import nodes — with module specifiers for cross-file resolution
  • Contains edges — file → symbol, class → method
  • Imports edges — file → imported file (resolved cross-file)
  • Calls edges — caller → callee (resolved cross-file)
  • Inherits edges — subclass → superclass

Incremental parsing

Parsed file graphs are cached under .revet-cache/files/ keyed by content hash. On subsequent runs, only changed files are re-parsed by tree-sitter. Second runs on unchanged codebases are near-instant.

Adding a language

See Contributing for the step-by-step guide to adding a new language parser.