Skip to main content
The full native build links Tree-sitter grammars and semantic mappings for JavaScript, TypeScript/TSX, Python, Rust, Go, C, C++, Java, Ruby, PHP, Swift, Kotlin, C#, Scala, Lua, and shell. Run differens languages for the actual compiled build’s extensions and levels. Semantic mappings turn grammar kinds into concepts such as Function, Class, Method, Import, Variable, Struct, and Trait. Unmapped grammar nodes retain their raw CST kind. A future grammar-only registration can provide generic structure without a custom semantic mapping. A code-classified extension without a registered grammar uses raw lines. This includes unsupported composite formats and other extensions shown by classification alone. Header, CSS/SQL, Vue/Svelte/Astro, and other coverage should be checked against languages rather than inferred from the filename. The examples on the language pages were checked against the native CLI. Each page lists concept mappings and known limits. Semantic diffing identifies syntax/declaration changes; it does not prove behavioral equivalence or implement a compiler’s type system. For new grammar or concept mappings, see contributing. For non-code formats, see tier adapters.

Semantic concepts and raw grammar kinds

The code tier is T5. differens languages labels the full build’s registered languages as semantic, L6: these grammars have mappings to concepts such as Function, Class, and Import. T5 and L6 describe different things; L6 is not a seventh content tier. Within a supported grammar, an unmapped CST kind keeps its raw grammar name. A future grammar-only registration could provide generic L5 coverage, but the current full build lists semantic mappings for all its registered languages. An arbitrary grammar is not discovered or downloaded at runtime.

How extractors recover names

The native mappings are Rust functions in crates/differens-tiers/src/code/concepts.rs and labels.rs. Tree-sitter supplies the syntax tree; these functions choose concepts and labels. There is no public JavaScript LanguageExtractor interface in the Rust workspace. Most names come from a grammar’s name field. C/C++ declarations follow a possibly nested declarator, Python assignments read their left-hand expression, and Kotlin uses identifier recovery where its grammar omits field names. Go methods also carry receiver identity so same-named methods remain distinguishable.

Read the language examples

Add support

Pin and link a grammar, register its extensions, add semantic mappings and label recovery, then add valid, malformed, Unicode, rename, and move cases. The contributor guide lists the native source files and checks.