plotnik_langs/
builtin.rs

1use std::sync::{Arc, LazyLock};
2
3use crate::{Lang, LangInner};
4
5/// Language metadata for listing.
6#[derive(Debug, Clone)]
7pub struct LangInfo {
8    /// Canonical name (first in names list).
9    pub name: &'static str,
10    /// All name aliases (includes canonical name).
11    pub aliases: &'static [&'static str],
12    /// File extensions.
13    pub extensions: &'static [&'static str],
14}
15
16macro_rules! define_langs {
17    (
18        $(
19            $fn_name:ident => {
20                feature: $feature:literal,
21                name: $name:literal,
22                ts_lang: $ts_lang:expr,
23                lang_key: $lang_key:literal,
24                names: [$($alias:literal),* $(,)?],
25                extensions: [$($ext:literal),* $(,)?] $(,)?
26            }
27        ),* $(,)?
28    ) => {
29        // Generate static Lang definitions with LazyLock
30        $(
31            #[cfg(feature = $feature)]
32            pub fn $fn_name() -> Lang {
33                paste::paste! {
34                    static LANG: LazyLock<Lang> = LazyLock::new(|| {
35                        static NODE_TYPES_BYTES: &[u8] = include_bytes!(env!(
36                            concat!("PLOTNIK_NODE_TYPES_", $lang_key)
37                        ));
38                        static GRAMMAR_BYTES: &[u8] = include_bytes!(env!(
39                            concat!("PLOTNIK_GRAMMAR_", $lang_key)
40                        ));
41
42                        let raw_nodes: Vec<plotnik_core::RawNode> =
43                            postcard::from_bytes(NODE_TYPES_BYTES)
44                                .expect("invalid embedded node types");
45
46                        let grammar = plotnik_core::grammar::Grammar::from_binary(GRAMMAR_BYTES)
47                            .expect("invalid embedded grammar");
48
49                        Arc::new(LangInner::new(
50                            $name,
51                            $ts_lang.into(),
52                            raw_nodes,
53                            grammar,
54                        ))
55                    });
56                }
57                Arc::clone(&LANG)
58            }
59        )*
60
61        pub fn from_name(s: &str) -> Option<Lang> {
62            match s.to_ascii_lowercase().as_str() {
63                $(
64                    #[cfg(feature = $feature)]
65                    $($alias)|* => Some($fn_name()),
66                )*
67                _ => None,
68            }
69        }
70
71        #[allow(unreachable_patterns)]
72        pub fn from_ext(ext: &str) -> Option<Lang> {
73            match ext.to_ascii_lowercase().as_str() {
74                $(
75                    #[cfg(feature = $feature)]
76                    $($ext)|* => Some($fn_name()),
77                )*
78                _ => None,
79            }
80        }
81
82        pub fn all() -> Vec<Lang> {
83            vec![
84                $(
85                    #[cfg(feature = $feature)]
86                    $fn_name(),
87                )*
88            ]
89        }
90
91        /// Get metadata for all available languages.
92        pub fn all_info() -> Vec<LangInfo> {
93            vec![
94                $(
95                    #[cfg(feature = $feature)]
96                    LangInfo {
97                        name: $name,
98                        aliases: &[$($alias),*],
99                        extensions: &[$($ext),*],
100                    },
101                )*
102            ]
103        }
104    };
105}
106
107define_langs! {
108    ada => {
109        feature: "lang-ada",
110        name: "ada",
111        ts_lang: arborium_ada::language(),
112        lang_key: "ADA",
113        names: ["ada"],
114        extensions: ["ada", "adb", "ads"],
115    },
116    agda => {
117        feature: "lang-agda",
118        name: "agda",
119        ts_lang: arborium_agda::language(),
120        lang_key: "AGDA",
121        names: ["agda"],
122        extensions: ["agda"],
123    },
124    asciidoc => {
125        feature: "lang-asciidoc",
126        name: "asciidoc",
127        ts_lang: arborium_asciidoc::language(),
128        lang_key: "ASCIIDOC",
129        names: ["asciidoc", "adoc"],
130        extensions: ["adoc", "asciidoc", "asc"],
131    },
132    asm => {
133        feature: "lang-asm",
134        name: "asm",
135        ts_lang: arborium_asm::language(),
136        lang_key: "ASM",
137        names: ["asm", "assembly"],
138        extensions: ["asm", "s"],
139    },
140    awk => {
141        feature: "lang-awk",
142        name: "awk",
143        ts_lang: arborium_awk::language(),
144        lang_key: "AWK",
145        names: ["awk", "gawk", "mawk", "nawk"],
146        extensions: ["awk"],
147    },
148    bash => {
149        feature: "lang-bash",
150        name: "bash",
151        ts_lang: arborium_bash::language(),
152        lang_key: "BASH",
153        names: ["bash", "sh", "shell"],
154        extensions: ["sh", "bash"],
155    },
156    batch => {
157        feature: "lang-batch",
158        name: "batch",
159        ts_lang: arborium_batch::language(),
160        lang_key: "BATCH",
161        names: ["batch", "bat", "cmd"],
162        extensions: ["bat", "cmd"],
163    },
164    c => {
165        feature: "lang-c",
166        name: "c",
167        ts_lang: arborium_c::language(),
168        lang_key: "C",
169        names: ["c"],
170        extensions: ["c", "h"],
171    },
172    caddy => {
173        feature: "lang-caddy",
174        name: "caddy",
175        ts_lang: arborium_caddy::language(),
176        lang_key: "CADDY",
177        names: ["caddy", "caddyfile"],
178        extensions: ["caddyfile"],
179    },
180    capnp => {
181        feature: "lang-capnp",
182        name: "capnp",
183        ts_lang: arborium_capnp::language(),
184        lang_key: "CAPNP",
185        names: ["capnp", "capnproto"],
186        extensions: ["capnp"],
187    },
188    clojure => {
189        feature: "lang-clojure",
190        name: "clojure",
191        ts_lang: arborium_clojure::language(),
192        lang_key: "CLOJURE",
193        names: ["clojure", "clj"],
194        extensions: ["clj", "cljs", "cljc", "edn"],
195    },
196    cmake => {
197        feature: "lang-cmake",
198        name: "cmake",
199        ts_lang: arborium_cmake::language(),
200        lang_key: "CMAKE",
201        names: ["cmake"],
202        extensions: ["cmake"],
203    },
204    commonlisp => {
205        feature: "lang-commonlisp",
206        name: "commonlisp",
207        ts_lang: arborium_commonlisp::language(),
208        lang_key: "COMMONLISP",
209        names: ["commonlisp", "common-lisp", "lisp", "cl"],
210        extensions: ["lisp", "lsp", "cl"],
211    },
212    cpp => {
213        feature: "lang-cpp",
214        name: "cpp",
215        ts_lang: arborium_cpp::language(),
216        lang_key: "CPP",
217        names: ["cpp", "c++", "cxx", "cc"],
218        extensions: ["cpp", "cc", "cxx", "hpp", "hh", "hxx", "h++", "c++"],
219    },
220    csharp => {
221        feature: "lang-c-sharp",
222        name: "c_sharp",
223        ts_lang: arborium_c_sharp::language(),
224        lang_key: "C_SHARP",
225        names: ["csharp", "c#", "cs", "c_sharp"],
226        extensions: ["cs"],
227    },
228    css => {
229        feature: "lang-css",
230        name: "css",
231        ts_lang: arborium_css::language(),
232        lang_key: "CSS",
233        names: ["css"],
234        extensions: ["css"],
235    },
236    d => {
237        feature: "lang-d",
238        name: "d",
239        ts_lang: arborium_d::language(),
240        lang_key: "D",
241        names: ["d", "dlang"],
242        extensions: ["d"],
243    },
244    dart => {
245        feature: "lang-dart",
246        name: "dart",
247        ts_lang: arborium_dart::language(),
248        lang_key: "DART",
249        names: ["dart"],
250        extensions: ["dart"],
251    },
252    devicetree => {
253        feature: "lang-devicetree",
254        name: "devicetree",
255        ts_lang: arborium_devicetree::language(),
256        lang_key: "DEVICETREE",
257        names: ["devicetree", "dts"],
258        extensions: ["dts", "dtsi"],
259    },
260    diff => {
261        feature: "lang-diff",
262        name: "diff",
263        ts_lang: arborium_diff::language(),
264        lang_key: "DIFF",
265        names: ["diff", "patch"],
266        extensions: ["diff", "patch"],
267    },
268    dockerfile => {
269        feature: "lang-dockerfile",
270        name: "dockerfile",
271        ts_lang: arborium_dockerfile::language(),
272        lang_key: "DOCKERFILE",
273        names: ["dockerfile", "docker"],
274        extensions: ["dockerfile"],
275    },
276    dot => {
277        feature: "lang-dot",
278        name: "dot",
279        ts_lang: arborium_dot::language(),
280        lang_key: "DOT",
281        names: ["dot", "graphviz"],
282        extensions: ["dot", "gv"],
283    },
284    elisp => {
285        feature: "lang-elisp",
286        name: "elisp",
287        ts_lang: arborium_elisp::language(),
288        lang_key: "ELISP",
289        names: ["elisp", "emacs-lisp"],
290        extensions: ["el"],
291    },
292    elixir => {
293        feature: "lang-elixir",
294        name: "elixir",
295        ts_lang: arborium_elixir::language(),
296        lang_key: "ELIXIR",
297        names: ["elixir", "ex"],
298        extensions: ["ex", "exs"],
299    },
300    elm => {
301        feature: "lang-elm",
302        name: "elm",
303        ts_lang: arborium_elm::language(),
304        lang_key: "ELM",
305        names: ["elm"],
306        extensions: ["elm"],
307    },
308    erlang => {
309        feature: "lang-erlang",
310        name: "erlang",
311        ts_lang: arborium_erlang::language(),
312        lang_key: "ERLANG",
313        names: ["erlang", "erl"],
314        extensions: ["erl", "hrl"],
315    },
316    fish => {
317        feature: "lang-fish",
318        name: "fish",
319        ts_lang: arborium_fish::language(),
320        lang_key: "FISH",
321        names: ["fish"],
322        extensions: ["fish"],
323    },
324    fsharp => {
325        feature: "lang-fsharp",
326        name: "fsharp",
327        ts_lang: arborium_fsharp::language(),
328        lang_key: "FSHARP",
329        names: ["fsharp", "f#", "fs"],
330        extensions: ["fs", "fsi", "fsx"],
331    },
332    gleam => {
333        feature: "lang-gleam",
334        name: "gleam",
335        ts_lang: arborium_gleam::language(),
336        lang_key: "GLEAM",
337        names: ["gleam"],
338        extensions: ["gleam"],
339    },
340    glsl => {
341        feature: "lang-glsl",
342        name: "glsl",
343        ts_lang: arborium_glsl::language(),
344        lang_key: "GLSL",
345        names: ["glsl"],
346        extensions: ["glsl", "vert", "frag", "geom", "tesc", "tese", "comp"],
347    },
348    go => {
349        feature: "lang-go",
350        name: "go",
351        ts_lang: arborium_go::language(),
352        lang_key: "GO",
353        names: ["go", "golang"],
354        extensions: ["go"],
355    },
356    graphql => {
357        feature: "lang-graphql",
358        name: "graphql",
359        ts_lang: arborium_graphql::language(),
360        lang_key: "GRAPHQL",
361        names: ["graphql", "gql"],
362        extensions: ["graphql", "gql"],
363    },
364    groovy => {
365        feature: "lang-groovy",
366        name: "groovy",
367        ts_lang: arborium_groovy::language(),
368        lang_key: "GROOVY",
369        names: ["groovy", "gradle"],
370        extensions: ["groovy", "gradle", "gvy", "gy", "gsh"],
371    },
372    haskell => {
373        feature: "lang-haskell",
374        name: "haskell",
375        ts_lang: arborium_haskell::language(),
376        lang_key: "HASKELL",
377        names: ["haskell", "hs"],
378        extensions: ["hs", "lhs"],
379    },
380    hcl => {
381        feature: "lang-hcl",
382        name: "hcl",
383        ts_lang: arborium_hcl::language(),
384        lang_key: "HCL",
385        names: ["hcl", "terraform", "tf"],
386        extensions: ["hcl", "tf", "tfvars"],
387    },
388    hlsl => {
389        feature: "lang-hlsl",
390        name: "hlsl",
391        ts_lang: arborium_hlsl::language(),
392        lang_key: "HLSL",
393        names: ["hlsl"],
394        extensions: ["hlsl", "hlsli", "fx"],
395    },
396    html => {
397        feature: "lang-html",
398        name: "html",
399        ts_lang: arborium_html::language(),
400        lang_key: "HTML",
401        names: ["html", "htm"],
402        extensions: ["html", "htm"],
403    },
404    idris => {
405        feature: "lang-idris",
406        name: "idris",
407        ts_lang: arborium_idris::language(),
408        lang_key: "IDRIS",
409        names: ["idris"],
410        extensions: ["idr"],
411    },
412    ini => {
413        feature: "lang-ini",
414        name: "ini",
415        ts_lang: arborium_ini::language(),
416        lang_key: "INI",
417        names: ["ini"],
418        extensions: ["ini", "cfg", "conf"],
419    },
420    java => {
421        feature: "lang-java",
422        name: "java",
423        ts_lang: arborium_java::language(),
424        lang_key: "JAVA",
425        names: ["java"],
426        extensions: ["java"],
427    },
428    javascript => {
429        feature: "lang-javascript",
430        name: "javascript",
431        ts_lang: arborium_javascript::language(),
432        lang_key: "JAVASCRIPT",
433        names: ["javascript", "js", "jsx", "ecmascript", "es"],
434        extensions: ["js", "mjs", "cjs", "jsx"],
435    },
436    jinja2 => {
437        feature: "lang-jinja2",
438        name: "jinja2",
439        ts_lang: arborium_jinja2::language(),
440        lang_key: "JINJA2",
441        names: ["jinja2", "jinja"],
442        extensions: ["j2", "jinja", "jinja2"],
443    },
444    jq => {
445        feature: "lang-jq",
446        name: "jq",
447        ts_lang: arborium_jq::language(),
448        lang_key: "JQ",
449        names: ["jq"],
450        extensions: ["jq"],
451    },
452    json => {
453        feature: "lang-json",
454        name: "json",
455        ts_lang: arborium_json::language(),
456        lang_key: "JSON",
457        names: ["json"],
458        extensions: ["json"],
459    },
460    julia => {
461        feature: "lang-julia",
462        name: "julia",
463        ts_lang: arborium_julia::language(),
464        lang_key: "JULIA",
465        names: ["julia", "jl"],
466        extensions: ["jl"],
467    },
468    kdl => {
469        feature: "lang-kdl",
470        name: "kdl",
471        ts_lang: arborium_kdl::language(),
472        lang_key: "KDL",
473        names: ["kdl"],
474        extensions: ["kdl"],
475    },
476    kotlin => {
477        feature: "lang-kotlin",
478        name: "kotlin",
479        ts_lang: arborium_kotlin::language(),
480        lang_key: "KOTLIN",
481        names: ["kotlin", "kt"],
482        extensions: ["kt", "kts"],
483    },
484    lean => {
485        feature: "lang-lean",
486        name: "lean",
487        ts_lang: arborium_lean::language(),
488        lang_key: "LEAN",
489        names: ["lean", "lean4"],
490        extensions: ["lean"],
491    },
492    lua => {
493        feature: "lang-lua",
494        name: "lua",
495        ts_lang: arborium_lua::language(),
496        lang_key: "LUA",
497        names: ["lua"],
498        extensions: ["lua"],
499    },
500    markdown => {
501        feature: "lang-markdown",
502        name: "markdown",
503        ts_lang: arborium_markdown::language(),
504        lang_key: "MARKDOWN",
505        names: ["markdown", "md"],
506        extensions: ["md", "markdown"],
507    },
508    matlab => {
509        feature: "lang-matlab",
510        name: "matlab",
511        ts_lang: arborium_matlab::language(),
512        lang_key: "MATLAB",
513        names: ["matlab", "octave"],
514        extensions: ["m"],
515    },
516    meson => {
517        feature: "lang-meson",
518        name: "meson",
519        ts_lang: arborium_meson::language(),
520        lang_key: "MESON",
521        names: ["meson"],
522        extensions: ["meson"],
523    },
524    nginx => {
525        feature: "lang-nginx",
526        name: "nginx",
527        ts_lang: arborium_nginx::language(),
528        lang_key: "NGINX",
529        names: ["nginx"],
530        extensions: ["nginx"],
531    },
532    ninja => {
533        feature: "lang-ninja",
534        name: "ninja",
535        ts_lang: arborium_ninja::language(),
536        lang_key: "NINJA",
537        names: ["ninja"],
538        extensions: ["ninja"],
539    },
540    nix => {
541        feature: "lang-nix",
542        name: "nix",
543        ts_lang: arborium_nix::language(),
544        lang_key: "NIX",
545        names: ["nix"],
546        extensions: ["nix"],
547    },
548    objc => {
549        feature: "lang-objc",
550        name: "objc",
551        ts_lang: arborium_objc::language(),
552        lang_key: "OBJC",
553        names: ["objc", "objective-c", "objectivec"],
554        extensions: ["m", "mm"],
555    },
556    ocaml => {
557        feature: "lang-ocaml",
558        name: "ocaml",
559        ts_lang: arborium_ocaml::language(),
560        lang_key: "OCAML",
561        names: ["ocaml", "ml"],
562        extensions: ["ml", "mli"],
563    },
564    perl => {
565        feature: "lang-perl",
566        name: "perl",
567        ts_lang: arborium_perl::language(),
568        lang_key: "PERL",
569        names: ["perl", "pl"],
570        extensions: ["pl", "pm"],
571    },
572    php => {
573        feature: "lang-php",
574        name: "php",
575        ts_lang: arborium_php::language(),
576        lang_key: "PHP",
577        names: ["php"],
578        extensions: ["php"],
579    },
580    postscript => {
581        feature: "lang-postscript",
582        name: "postscript",
583        ts_lang: arborium_postscript::language(),
584        lang_key: "POSTSCRIPT",
585        names: ["postscript", "ps"],
586        extensions: ["ps", "eps"],
587    },
588    powershell => {
589        feature: "lang-powershell",
590        name: "powershell",
591        ts_lang: arborium_powershell::language(),
592        lang_key: "POWERSHELL",
593        names: ["powershell", "pwsh", "ps1"],
594        extensions: ["ps1", "psm1", "psd1"],
595    },
596    prolog => {
597        feature: "lang-prolog",
598        name: "prolog",
599        ts_lang: arborium_prolog::language(),
600        lang_key: "PROLOG",
601        names: ["prolog"],
602        extensions: ["pl", "pro"],
603    },
604    python => {
605        feature: "lang-python",
606        name: "python",
607        ts_lang: arborium_python::language(),
608        lang_key: "PYTHON",
609        names: ["python", "py"],
610        extensions: ["py", "pyi", "pyw"],
611    },
612    query => {
613        feature: "lang-query",
614        name: "query",
615        ts_lang: arborium_query::language(),
616        lang_key: "QUERY",
617        names: ["query", "scm"],
618        extensions: ["scm"],
619    },
620    r => {
621        feature: "lang-r",
622        name: "r",
623        ts_lang: arborium_r::language(),
624        lang_key: "R",
625        names: ["r", "rlang"],
626        extensions: ["r", "R"],
627    },
628    rescript => {
629        feature: "lang-rescript",
630        name: "rescript",
631        ts_lang: arborium_rescript::language(),
632        lang_key: "RESCRIPT",
633        names: ["rescript", "res"],
634        extensions: ["res", "resi"],
635    },
636    ron => {
637        feature: "lang-ron",
638        name: "ron",
639        ts_lang: arborium_ron::language(),
640        lang_key: "RON",
641        names: ["ron"],
642        extensions: ["ron"],
643    },
644    ruby => {
645        feature: "lang-ruby",
646        name: "ruby",
647        ts_lang: arborium_ruby::language(),
648        lang_key: "RUBY",
649        names: ["ruby", "rb"],
650        extensions: ["rb", "rake", "gemspec"],
651    },
652    rust => {
653        feature: "lang-rust",
654        name: "rust",
655        ts_lang: arborium_rust::language(),
656        lang_key: "RUST",
657        names: ["rust", "rs"],
658        extensions: ["rs"],
659    },
660    scala => {
661        feature: "lang-scala",
662        name: "scala",
663        ts_lang: arborium_scala::language(),
664        lang_key: "SCALA",
665        names: ["scala"],
666        extensions: ["scala", "sc"],
667    },
668    scheme => {
669        feature: "lang-scheme",
670        name: "scheme",
671        ts_lang: arborium_scheme::language(),
672        lang_key: "SCHEME",
673        names: ["scheme", "racket"],
674        extensions: ["scm", "ss", "rkt"],
675    },
676    scss => {
677        feature: "lang-scss",
678        name: "scss",
679        ts_lang: arborium_scss::language(),
680        lang_key: "SCSS",
681        names: ["scss", "sass"],
682        extensions: ["scss", "sass"],
683    },
684    sparql => {
685        feature: "lang-sparql",
686        name: "sparql",
687        ts_lang: arborium_sparql::language(),
688        lang_key: "SPARQL",
689        names: ["sparql"],
690        extensions: ["sparql", "rq"],
691    },
692    sql => {
693        feature: "lang-sql",
694        name: "sql",
695        ts_lang: arborium_sql::language(),
696        lang_key: "SQL",
697        names: ["sql"],
698        extensions: ["sql"],
699    },
700    ssh_config => {
701        feature: "lang-ssh-config",
702        name: "ssh_config",
703        ts_lang: arborium_ssh_config::language(),
704        lang_key: "SSH_CONFIG",
705        names: ["ssh-config", "ssh_config", "sshconfig"],
706        extensions: ["ssh_config"],
707    },
708    starlark => {
709        feature: "lang-starlark",
710        name: "starlark",
711        ts_lang: arborium_starlark::language(),
712        lang_key: "STARLARK",
713        names: ["starlark", "bazel", "bzl"],
714        extensions: ["bzl", "bazel"],
715    },
716    svelte => {
717        feature: "lang-svelte",
718        name: "svelte",
719        ts_lang: arborium_svelte::language(),
720        lang_key: "SVELTE",
721        names: ["svelte"],
722        extensions: ["svelte"],
723    },
724    swift => {
725        feature: "lang-swift",
726        name: "swift",
727        ts_lang: arborium_swift::language(),
728        lang_key: "SWIFT",
729        names: ["swift"],
730        extensions: ["swift"],
731    },
732    textproto => {
733        feature: "lang-textproto",
734        name: "textproto",
735        ts_lang: arborium_textproto::language(),
736        lang_key: "TEXTPROTO",
737        names: ["textproto", "pbtxt"],
738        extensions: ["textproto", "pbtxt"],
739    },
740    thrift => {
741        feature: "lang-thrift",
742        name: "thrift",
743        ts_lang: arborium_thrift::language(),
744        lang_key: "THRIFT",
745        names: ["thrift"],
746        extensions: ["thrift"],
747    },
748    tlaplus => {
749        feature: "lang-tlaplus",
750        name: "tlaplus",
751        ts_lang: arborium_tlaplus::language(),
752        lang_key: "TLAPLUS",
753        names: ["tlaplus", "tla+", "tla"],
754        extensions: ["tla"],
755    },
756    toml => {
757        feature: "lang-toml",
758        name: "toml",
759        ts_lang: arborium_toml::language(),
760        lang_key: "TOML",
761        names: ["toml"],
762        extensions: ["toml"],
763    },
764    tsx => {
765        feature: "lang-tsx",
766        name: "tsx",
767        ts_lang: arborium_tsx::language(),
768        lang_key: "TSX",
769        names: ["tsx"],
770        extensions: ["tsx"],
771    },
772    typescript => {
773        feature: "lang-typescript",
774        name: "typescript",
775        ts_lang: arborium_typescript::language(),
776        lang_key: "TYPESCRIPT",
777        names: ["typescript", "ts"],
778        extensions: ["ts", "mts", "cts"],
779    },
780    typst => {
781        feature: "lang-typst",
782        name: "typst",
783        ts_lang: arborium_typst::language(),
784        lang_key: "TYPST",
785        names: ["typst"],
786        extensions: ["typ"],
787    },
788    uiua => {
789        feature: "lang-uiua",
790        name: "uiua",
791        ts_lang: arborium_uiua::language(),
792        lang_key: "UIUA",
793        names: ["uiua"],
794        extensions: ["ua"],
795    },
796    vb => {
797        feature: "lang-vb",
798        name: "vb",
799        ts_lang: arborium_vb::language(),
800        lang_key: "VB",
801        names: ["vb", "vbnet", "visualbasic"],
802        extensions: ["vb"],
803    },
804    verilog => {
805        feature: "lang-verilog",
806        name: "verilog",
807        ts_lang: arborium_verilog::language(),
808        lang_key: "VERILOG",
809        names: ["verilog", "v"],
810        extensions: ["v", "sv"],
811    },
812    vhdl => {
813        feature: "lang-vhdl",
814        name: "vhdl",
815        ts_lang: arborium_vhdl::language(),
816        lang_key: "VHDL",
817        names: ["vhdl"],
818        extensions: ["vhd", "vhdl"],
819    },
820    vim => {
821        feature: "lang-vim",
822        name: "vim",
823        ts_lang: arborium_vim::language(),
824        lang_key: "VIM",
825        names: ["vim", "vimscript"],
826        extensions: ["vim"],
827    },
828    vue => {
829        feature: "lang-vue",
830        name: "vue",
831        ts_lang: arborium_vue::language(),
832        lang_key: "VUE",
833        names: ["vue"],
834        extensions: ["vue"],
835    },
836    wit => {
837        feature: "lang-wit",
838        name: "wit",
839        ts_lang: arborium_wit::language(),
840        lang_key: "WIT",
841        names: ["wit"],
842        extensions: ["wit"],
843    },
844    x86asm => {
845        feature: "lang-x86asm",
846        name: "x86asm",
847        ts_lang: arborium_x86asm::language(),
848        lang_key: "X86ASM",
849        names: ["x86asm", "x86"],
850        extensions: ["asm"],
851    },
852    xml => {
853        feature: "lang-xml",
854        name: "xml",
855        ts_lang: arborium_xml::language(),
856        lang_key: "XML",
857        names: ["xml"],
858        extensions: ["xml", "xsl", "xslt", "xsd", "svg"],
859    },
860    yaml => {
861        feature: "lang-yaml",
862        name: "yaml",
863        ts_lang: arborium_yaml::language(),
864        lang_key: "YAML",
865        names: ["yaml", "yml"],
866        extensions: ["yaml", "yml"],
867    },
868    yuri => {
869        feature: "lang-yuri",
870        name: "yuri",
871        ts_lang: arborium_yuri::language(),
872        lang_key: "YURI",
873        names: ["yuri"],
874        extensions: ["yuri"],
875    },
876    zig => {
877        feature: "lang-zig",
878        name: "zig",
879        ts_lang: arborium_zig::language(),
880        lang_key: "ZIG",
881        names: ["zig"],
882        extensions: ["zig"],
883    },
884    zsh => {
885        feature: "lang-zsh",
886        name: "zsh",
887        ts_lang: arborium_zsh::language(),
888        lang_key: "ZSH",
889        names: ["zsh"],
890        extensions: ["zsh"],
891    },
892}