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.

LanguageExtensionsIndexed
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 contains edge from every declaration to the scope that holds it, so a method knows its class.
  • Calls — a calls edge from the caller to the callee, resolved across files when an import or package membership backs the link.
  • Instantiation — a constructor call produces an instantiates edge rather than a plain call.
  • Inheritance — extends and implements edges.
  • Imports — an imports edge 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.