Skip to main content

normalize_languages/
lib.rs

1//! Language support for normalize.
2//!
3//! This crate provides the `Language` trait and implementations for
4//! various programming languages. Each language struct IS its support implementation.
5//!
6//! Grammars are loaded dynamically from shared libraries via `GrammarLoader`.
7//! Build grammars with `cargo xtask build-grammars`.
8//!
9//! # Feature Flags
10//!
11//! Languages are gated behind feature flags for customizability:
12//! - `langs-all` (default): All languages
13//! - `langs-core`: Common languages (Python, JS, TS, Rust, Go, Java, etc.)
14//! - `langs-functional`: Haskell, OCaml, Elixir, etc.
15//! - `langs-config`: JSON, YAML, TOML, HCL, etc.
16//! - `lang-*`: Individual language flags
17//!
18//! # Example
19//!
20//! ```ignore
21//! use normalize_languages::{Python, Language, support_for_path, GrammarLoader};
22//! use std::path::Path;
23//!
24//! // Load grammars
25//! let loader = GrammarLoader::new();
26//! let python_grammar = loader.get("python").expect("grammar not found");
27//!
28//! // Static usage (compile-time known language):
29//! println!("Python name: {}", Python.name());
30//!
31//! // Dynamic lookup (from file path):
32//! if let Some(support) = support_for_path(Path::new("foo.py")) {
33//!     println!("Language: {}", support.name());
34//! }
35//! ```
36
37pub mod ast_grep;
38mod body;
39mod component;
40mod docstring;
41pub mod ecmascript;
42pub mod external_packages;
43pub mod ffi;
44mod grammar_loader;
45pub mod parsers;
46pub mod query_predicates;
47mod registry;
48mod traits;
49
50// Language implementations (feature-gated)
51#[cfg(feature = "lang-ada")]
52pub mod ada;
53#[cfg(feature = "lang-agda")]
54pub mod agda;
55#[cfg(feature = "lang-asciidoc")]
56pub mod asciidoc;
57#[cfg(feature = "lang-asm")]
58pub mod asm;
59#[cfg(feature = "lang-awk")]
60pub mod awk;
61#[cfg(feature = "lang-bash")]
62pub mod bash;
63#[cfg(feature = "lang-batch")]
64pub mod batch;
65#[cfg(feature = "lang-c")]
66pub mod c;
67#[cfg(feature = "lang-caddy")]
68pub mod caddy;
69#[cfg(feature = "lang-capnp")]
70pub mod capnp;
71#[cfg(feature = "lang-clojure")]
72pub mod clojure;
73#[cfg(feature = "lang-cmake")]
74pub mod cmake;
75#[cfg(feature = "lang-commonlisp")]
76pub mod commonlisp;
77#[cfg(feature = "lang-cpp")]
78pub mod cpp;
79#[cfg(feature = "lang-csharp")]
80pub mod csharp;
81#[cfg(feature = "lang-css")]
82pub mod css;
83#[cfg(feature = "lang-d")]
84pub mod d;
85#[cfg(feature = "lang-dart")]
86pub mod dart;
87#[cfg(feature = "lang-devicetree")]
88pub mod devicetree;
89#[cfg(feature = "lang-diff")]
90pub mod diff;
91#[cfg(feature = "lang-dockerfile")]
92pub mod dockerfile;
93#[cfg(feature = "lang-dot")]
94pub mod dot;
95#[cfg(feature = "lang-elisp")]
96pub mod elisp;
97#[cfg(feature = "lang-elixir")]
98pub mod elixir;
99#[cfg(feature = "lang-elm")]
100pub mod elm;
101#[cfg(feature = "lang-erlang")]
102pub mod erlang;
103#[cfg(feature = "lang-fish")]
104pub mod fish;
105#[cfg(feature = "lang-fsharp")]
106pub mod fsharp;
107#[cfg(feature = "lang-gleam")]
108pub mod gleam;
109#[cfg(feature = "lang-glsl")]
110pub mod glsl;
111#[cfg(feature = "lang-go")]
112pub mod go;
113#[cfg(feature = "lang-graphql")]
114pub mod graphql;
115#[cfg(feature = "lang-groovy")]
116pub mod groovy;
117#[cfg(feature = "lang-haskell")]
118pub mod haskell;
119#[cfg(feature = "lang-hcl")]
120pub mod hcl;
121#[cfg(feature = "lang-hlsl")]
122pub mod hlsl;
123#[cfg(feature = "lang-html")]
124pub mod html;
125#[cfg(feature = "lang-idris")]
126pub mod idris;
127#[cfg(feature = "lang-ini")]
128pub mod ini;
129#[cfg(feature = "lang-java")]
130pub mod java;
131#[cfg(feature = "lang-javascript")]
132pub mod javascript;
133#[cfg(feature = "lang-jinja2")]
134pub mod jinja2;
135#[cfg(feature = "lang-jq")]
136pub mod jq;
137#[cfg(feature = "lang-json")]
138pub mod json;
139#[cfg(feature = "lang-julia")]
140pub mod julia;
141#[cfg(feature = "lang-kdl")]
142pub mod kdl;
143#[cfg(feature = "lang-kotlin")]
144pub mod kotlin;
145#[cfg(feature = "lang-lean")]
146pub mod lean;
147#[cfg(feature = "lang-lua")]
148pub mod lua;
149#[cfg(feature = "lang-markdown")]
150pub mod markdown;
151#[cfg(feature = "lang-matlab")]
152pub mod matlab;
153#[cfg(feature = "lang-meson")]
154pub mod meson;
155#[cfg(feature = "lang-nginx")]
156pub mod nginx;
157#[cfg(feature = "lang-ninja")]
158pub mod ninja;
159#[cfg(feature = "lang-nix")]
160pub mod nix;
161#[cfg(feature = "lang-objc")]
162pub mod objc;
163#[cfg(feature = "lang-ocaml")]
164pub mod ocaml;
165#[cfg(feature = "lang-perl")]
166pub mod perl;
167#[cfg(feature = "lang-php")]
168pub mod php;
169#[cfg(feature = "lang-postscript")]
170pub mod postscript;
171#[cfg(feature = "lang-powershell")]
172pub mod powershell;
173#[cfg(feature = "lang-prolog")]
174pub mod prolog;
175#[cfg(feature = "lang-python")]
176pub mod python;
177#[cfg(feature = "lang-query")]
178pub mod query;
179#[cfg(feature = "lang-r")]
180pub mod r;
181#[cfg(feature = "lang-rescript")]
182pub mod rescript;
183#[cfg(feature = "lang-ron")]
184pub mod ron;
185#[cfg(feature = "lang-ruby")]
186pub mod ruby;
187#[cfg(feature = "lang-rust")]
188pub mod rust;
189#[cfg(feature = "lang-scala")]
190pub mod scala;
191#[cfg(feature = "lang-scheme")]
192pub mod scheme;
193#[cfg(feature = "lang-scss")]
194pub mod scss;
195#[cfg(feature = "lang-sparql")]
196pub mod sparql;
197#[cfg(feature = "lang-sql")]
198pub mod sql;
199#[cfg(feature = "lang-sshconfig")]
200pub mod sshconfig;
201#[cfg(feature = "lang-starlark")]
202pub mod starlark;
203#[cfg(feature = "lang-svelte")]
204pub mod svelte;
205#[cfg(feature = "lang-swift")]
206pub mod swift;
207#[cfg(feature = "lang-textproto")]
208pub mod textproto;
209#[cfg(feature = "lang-thrift")]
210pub mod thrift;
211#[cfg(feature = "lang-tlaplus")]
212pub mod tlaplus;
213#[cfg(feature = "lang-toml")]
214pub mod toml;
215#[cfg(feature = "lang-typescript")]
216pub mod typescript;
217#[cfg(feature = "lang-typst")]
218pub mod typst;
219#[cfg(feature = "lang-uiua")]
220pub mod uiua;
221#[cfg(feature = "lang-vb")]
222pub mod vb;
223#[cfg(feature = "lang-verilog")]
224pub mod verilog;
225#[cfg(feature = "lang-vhdl")]
226pub mod vhdl;
227#[cfg(feature = "lang-vim")]
228pub mod vim;
229#[cfg(feature = "lang-vue")]
230pub mod vue;
231#[cfg(feature = "lang-wit")]
232pub mod wit;
233#[cfg(feature = "lang-x86asm")]
234pub mod x86asm;
235#[cfg(feature = "lang-xml")]
236pub mod xml;
237#[cfg(feature = "lang-yaml")]
238pub mod yaml;
239#[cfg(feature = "lang-yuri")]
240pub mod yuri;
241#[cfg(feature = "lang-zig")]
242pub mod zig;
243#[cfg(feature = "lang-zsh")]
244pub mod zsh;
245
246// Re-exports (always available)
247pub use grammar_loader::{GrammarLoadError, GrammarLoader};
248pub use normalize_facts_core::Export;
249pub use query_predicates::satisfies_predicates;
250pub use registry::{
251    is_programming_language, is_test_path, register, support_for_extension, support_for_grammar,
252    support_for_path, supported_languages, test_file_globs_for_path, validate_unused_kinds_audit,
253};
254pub use traits::{
255    ContainerBody, EmbeddedBlock, ImplementsInfo, Import, Language, LanguageEmbedded,
256    LanguageSymbols, Symbol, SymbolKind, Visibility, simple_function_symbol, simple_symbol,
257};
258
259// Re-export language structs (feature-gated)
260#[cfg(feature = "lang-ada")]
261pub use ada::Ada;
262#[cfg(feature = "lang-agda")]
263pub use agda::Agda;
264#[cfg(feature = "lang-asciidoc")]
265pub use asciidoc::AsciiDoc;
266#[cfg(feature = "lang-asm")]
267pub use asm::Asm;
268#[cfg(feature = "lang-awk")]
269pub use awk::Awk;
270#[cfg(feature = "lang-bash")]
271pub use bash::Bash;
272#[cfg(feature = "lang-batch")]
273pub use batch::Batch;
274#[cfg(feature = "lang-c")]
275pub use c::C;
276#[cfg(feature = "lang-caddy")]
277pub use caddy::Caddy;
278#[cfg(feature = "lang-capnp")]
279pub use capnp::Capnp;
280#[cfg(feature = "lang-clojure")]
281pub use clojure::Clojure;
282#[cfg(feature = "lang-cmake")]
283pub use cmake::CMake;
284#[cfg(feature = "lang-commonlisp")]
285pub use commonlisp::CommonLisp;
286#[cfg(feature = "lang-cpp")]
287pub use cpp::Cpp;
288#[cfg(feature = "lang-csharp")]
289pub use csharp::CSharp;
290#[cfg(feature = "lang-css")]
291pub use css::Css;
292#[cfg(feature = "lang-d")]
293pub use d::D;
294#[cfg(feature = "lang-dart")]
295pub use dart::Dart;
296#[cfg(feature = "lang-devicetree")]
297pub use devicetree::DeviceTree;
298#[cfg(feature = "lang-diff")]
299pub use diff::Diff;
300#[cfg(feature = "lang-dockerfile")]
301pub use dockerfile::Dockerfile;
302#[cfg(feature = "lang-dot")]
303pub use dot::Dot;
304#[cfg(feature = "lang-elisp")]
305pub use elisp::Elisp;
306#[cfg(feature = "lang-elixir")]
307pub use elixir::Elixir;
308#[cfg(feature = "lang-elm")]
309pub use elm::Elm;
310#[cfg(feature = "lang-erlang")]
311pub use erlang::Erlang;
312#[cfg(feature = "lang-fish")]
313pub use fish::Fish;
314#[cfg(feature = "lang-fsharp")]
315pub use fsharp::FSharp;
316#[cfg(feature = "lang-gleam")]
317pub use gleam::Gleam;
318#[cfg(feature = "lang-glsl")]
319pub use glsl::Glsl;
320#[cfg(feature = "lang-go")]
321pub use go::Go;
322#[cfg(feature = "lang-graphql")]
323pub use graphql::GraphQL;
324#[cfg(feature = "lang-groovy")]
325pub use groovy::Groovy;
326#[cfg(feature = "lang-haskell")]
327pub use haskell::Haskell;
328#[cfg(feature = "lang-hcl")]
329pub use hcl::Hcl;
330#[cfg(feature = "lang-hlsl")]
331pub use hlsl::Hlsl;
332#[cfg(feature = "lang-html")]
333pub use html::Html;
334#[cfg(feature = "lang-idris")]
335pub use idris::Idris;
336#[cfg(feature = "lang-ini")]
337pub use ini::Ini;
338#[cfg(feature = "lang-java")]
339pub use java::Java;
340#[cfg(feature = "lang-javascript")]
341pub use javascript::JavaScript;
342#[cfg(feature = "lang-jinja2")]
343pub use jinja2::Jinja2;
344#[cfg(feature = "lang-jq")]
345pub use jq::Jq;
346#[cfg(feature = "lang-json")]
347pub use json::Json;
348#[cfg(feature = "lang-julia")]
349pub use julia::Julia;
350#[cfg(feature = "lang-kdl")]
351pub use kdl::Kdl;
352#[cfg(feature = "lang-kotlin")]
353pub use kotlin::Kotlin;
354#[cfg(feature = "lang-lean")]
355pub use lean::Lean;
356#[cfg(feature = "lang-lua")]
357pub use lua::Lua;
358#[cfg(feature = "lang-markdown")]
359pub use markdown::Markdown;
360#[cfg(feature = "lang-matlab")]
361pub use matlab::Matlab;
362#[cfg(feature = "lang-meson")]
363pub use meson::Meson;
364#[cfg(feature = "lang-nginx")]
365pub use nginx::Nginx;
366#[cfg(feature = "lang-ninja")]
367pub use ninja::Ninja;
368#[cfg(feature = "lang-nix")]
369pub use nix::Nix;
370#[cfg(feature = "lang-objc")]
371pub use objc::ObjC;
372#[cfg(feature = "lang-ocaml")]
373pub use ocaml::OCaml;
374#[cfg(feature = "lang-perl")]
375pub use perl::Perl;
376#[cfg(feature = "lang-php")]
377pub use php::Php;
378#[cfg(feature = "lang-postscript")]
379pub use postscript::PostScript;
380#[cfg(feature = "lang-powershell")]
381pub use powershell::PowerShell;
382#[cfg(feature = "lang-prolog")]
383pub use prolog::Prolog;
384#[cfg(feature = "lang-python")]
385pub use python::Python;
386#[cfg(feature = "lang-query")]
387pub use query::Query;
388#[cfg(feature = "lang-r")]
389pub use r::R;
390#[cfg(feature = "lang-rescript")]
391pub use rescript::ReScript;
392#[cfg(feature = "lang-ron")]
393pub use ron::Ron;
394#[cfg(feature = "lang-ruby")]
395pub use ruby::Ruby;
396#[cfg(feature = "lang-rust")]
397pub use rust::Rust;
398#[cfg(feature = "lang-scala")]
399pub use scala::Scala;
400#[cfg(feature = "lang-scheme")]
401pub use scheme::Scheme;
402#[cfg(feature = "lang-scss")]
403pub use scss::Scss;
404#[cfg(feature = "lang-sparql")]
405pub use sparql::Sparql;
406#[cfg(feature = "lang-sql")]
407pub use sql::Sql;
408#[cfg(feature = "lang-sshconfig")]
409pub use sshconfig::SshConfig;
410#[cfg(feature = "lang-starlark")]
411pub use starlark::Starlark;
412#[cfg(feature = "lang-svelte")]
413pub use svelte::Svelte;
414#[cfg(feature = "lang-swift")]
415pub use swift::Swift;
416#[cfg(feature = "lang-textproto")]
417pub use textproto::TextProto;
418#[cfg(feature = "lang-thrift")]
419pub use thrift::Thrift;
420#[cfg(feature = "lang-tlaplus")]
421pub use tlaplus::TlaPlus;
422#[cfg(feature = "lang-toml")]
423pub use toml::Toml;
424#[cfg(feature = "lang-typescript")]
425pub use typescript::{Tsx, TypeScript};
426#[cfg(feature = "lang-typst")]
427pub use typst::Typst;
428#[cfg(feature = "lang-uiua")]
429pub use uiua::Uiua;
430#[cfg(feature = "lang-vb")]
431pub use vb::VB;
432#[cfg(feature = "lang-verilog")]
433pub use verilog::Verilog;
434#[cfg(feature = "lang-vhdl")]
435pub use vhdl::Vhdl;
436#[cfg(feature = "lang-vim")]
437pub use vim::Vim;
438#[cfg(feature = "lang-vue")]
439pub use vue::Vue;
440#[cfg(feature = "lang-wit")]
441pub use wit::Wit;
442#[cfg(feature = "lang-x86asm")]
443pub use x86asm::X86Asm;
444#[cfg(feature = "lang-xml")]
445pub use xml::Xml;
446#[cfg(feature = "lang-yaml")]
447pub use yaml::Yaml;
448#[cfg(feature = "lang-yuri")]
449pub use yuri::Yuri;
450#[cfg(feature = "lang-zig")]
451pub use zig::Zig;
452#[cfg(feature = "lang-zsh")]
453pub use zsh::Zsh;