Language support
14 languages with full AST support and dedicated resolvers — plus per-language framework awareness for Django, FastAPI, Flask, Express, Spring Boot, Rails, Laravel, and more.
Repowise ships language-aware resolvers under
packages/core/src/repowise/core/ingestion/resolvers/. Each tier
provides a different depth of analysis; lower tiers fall back to the
generic resolver (file and symbol extraction, no import edges).
Coverage matrix
| Tier | Languages | What works |
|---|---|---|
| Full | Python · TypeScript · JavaScript · Java · Go · Rust · C++ · C# | AST parsing, import resolution, named bindings, call resolution, heritage extraction, docstrings; multi-project workspace resolvers (.csproj/.sln for C#, Cargo.toml [workspace] for Rust, go.mod multi-module, package.json workspaces); framework-aware edges (Django, FastAPI, Flask, ASP.NET, Spring Boot, Express/NestJS, Gin/Echo/Chi, Axum/Actix); per-language dynamic-hint extractors for runtime DI / reflection / plugins |
| Good | C · Kotlin · Ruby · Swift · Scala · PHP | AST parsing, import resolution, named bindings, call resolution, heritage (mixins, derive macros, extensions, traits), docstrings; dedicated workspace-aware resolvers (Gradle subprojects, Rails / Zeitwerk, SPM, SBT/Mill, composer PSR-4); Rails / Laravel / TYPO3 framework edges for Ruby and PHP; per-language dynamic-hint extractors |
| Config / data | OpenAPI · Protobuf · GraphQL · Dockerfile · Makefile · YAML · JSON · TOML · SQL · Terraform | Included in the file tree; special handlers extract endpoints/targets where applicable |
14 languages with full AST support, 8 of them at the Full tier.
Framework awareness
Several Full-tier languages get extra treatment: repowise recognises common framework conventions and emits edges for them, even when the underlying call goes through a decorator or a runtime registry.
| Language | Frameworks |
|---|---|
| Python | Django (URL patterns, models, signals), FastAPI (route handlers, dependency injection), Flask (route decorators) |
| C# | ASP.NET (controllers, attributes), dependency injection containers |
| Java / Kotlin | Spring Boot (@RestController, @Component, @Autowired) |
| JavaScript / TypeScript | Express, NestJS (@Controller, @Module, @Injectable) |
| Go | Gin, Echo, Chi router patterns |
| Rust | Axum, Actix routes |
| Ruby | Rails (Zeitwerk autoloading, route DSL) |
| PHP | Laravel routes, TYPO3 conventions |
Dead-code awareness
Repowise's dead-code detector knows about dynamic dispatch patterns that look "unused" to a static analyzer but aren't:
- Naming patterns:
*Plugin,*Handler,*Adapter,*Middleware - Dynamic imports:
importlib.import_module(),__import__(), dynamicrequire() - Framework convention files (Flask blueprints, FastAPI routers, Django apps, Rails controllers, Laravel providers, TYPO3 extensions)
These are excluded from safe_to_delete findings to keep the
false-positive rate near zero.
Adding a language
Adding new language support requires one tree-sitter .scm query file
and one entry in the language registry. No changes to the parser
core. See CONTRIBUTING.md
in the OSS repo for the recipe.
Working in a language we don't list? Repowise still indexes the file tree, ownership, and churn — you just won't get import edges or framework-aware analysis. Open a Discussion and we'll prioritise.