Supported Languages
Coraline knows 37 languages. 36 of them ship a tree-sitter grammar; Liquid is the exception — it has no grammar and is parsed by hand. All 37 are indexed end to end: declarations, imports, calls, instantiations, inheritance and cross-file references are all resolved into the same semantic knowledge graph.
| Language | Extensions | Indexed |
|---|---|---|
| TypeScript | .ts | ✅ |
| TSX | .tsx | ✅ |
| JavaScript | .js | ✅ |
| JSX | .jsx | ✅ |
| Python | .py | ✅ |
| Go | .go | ✅ |
| Rust | .rs | ✅ |
| Java | .java | ✅ |
| C | .c, .h | ✅ |
| C++ | .cpp, .cc, .cxx, .hpp | ✅ |
| C# | .cs | ✅ |
| PHP | .php | ✅ |
| Ruby | .rb | ✅ |
| Swift | .swift | ✅ |
| Kotlin | .kt, .kts | ✅ |
| Liquid | .liquid | ✅ |
| Blazor | .razor, .cshtml | ✅ |
| Markdown | .md, .markdown | ✅ |
| Perl | .pl, .pm | ✅ |
| Bash | .sh, .bash | ✅ |
| Dart | .dart | ✅ |
| Elixir | .ex, .exs | ✅ |
| Elm | .elm | ✅ |
| Erlang | .erl, .hrl | ✅ |
| Fortran | .f, .for, .f90, .f95, .f03, .f08 | ✅ |
| Groovy | .groovy, .gradle | ✅ |
| Haskell | .hs | ✅ |
| Julia | .jl | ✅ |
| Lua | .lua | ✅ |
| MATLAB | .m | ✅ |
| Nix | .nix | ✅ |
| PowerShell | .ps1, .psm1 | ✅ |
| R | .r, .R | ✅ |
| Scala | .scala, .sc | ✅ |
| TOML | .toml | ✅ |
| YAML | .yml, .yaml | ✅ |
| Zig | .zig | ✅ |
✅ — the language is indexed and its graph is built.
Enabling a language
Every language Coraline knows about is indexed by default — the default
include patterns cover all of their extensions. A language outside
that set, or a project using an extension the default patterns do not
list, has to be enabled in .coraline/config.toml:
{
"include": ["**/*.rs", "**/*.md"],
"exclude": ["**/target/**"]
}
The full list of default patterns is in the Configuration guide.
What is extracted
The graph is the same shape for every language:
- Declarations — functions, methods, classes, structs, interfaces, traits, enums, type aliases, fields, variables and constants.
- Containment — a
containsedge from every declaration to the scope that holds it, so a method knows its class. - Calls — a
callsedge from the caller to the callee, resolved across files when an import or package membership backs the link. - Instantiation — a constructor call produces an
instantiatesedge rather than a plain call. - Inheritance —
extendsandimplementsedges. - Imports — an
importsedge per import statement, which is also what lets a call across a package boundary be resolved rather than guessed from the name.
The per-language mapping from tree-sitter node kinds to graph node kinds
lives in one table per language in
crates/coraline/src/grammar.rs,
and a guard test asserts that every kind the table names actually exists
in the grammar it claims to describe.
Querying
The MCP server exposes the graph directly:
{ "tool": "coraline_search", "arguments": { "name_pattern": "Widget" } }
coraline_search finds symbols by name, coraline_callers and
coraline_callees walk the call graph, coraline_impact reports what a
change breaks, and coraline_context assembles a task-shaped brief from
the graph. See the MCP Tools reference.