@@ -0,0 +1,1618 @@ |
| 1 | +//! Language definitions for syntax highlighting |
| 2 | + |
| 3 | +#![allow(dead_code)] |
| 4 | + |
| 5 | +use std::collections::HashSet; |
| 6 | + |
| 7 | +/// Supported programming languages |
| 8 | +#[derive(Debug, Clone, Copy, PartialEq, Eq)] |
| 9 | +pub enum Language { |
| 10 | + Rust, |
| 11 | + Python, |
| 12 | + JavaScript, |
| 13 | + TypeScript, |
| 14 | + C, |
| 15 | + Cpp, |
| 16 | + Go, |
| 17 | + Java, |
| 18 | + Kotlin, |
| 19 | + Swift, |
| 20 | + Ruby, |
| 21 | + Php, |
| 22 | + CSharp, |
| 23 | + Scala, |
| 24 | + Haskell, |
| 25 | + Lua, |
| 26 | + Perl, |
| 27 | + R, |
| 28 | + Julia, |
| 29 | + Elixir, |
| 30 | + Erlang, |
| 31 | + Clojure, |
| 32 | + Fortran, |
| 33 | + Zig, |
| 34 | + Nim, |
| 35 | + Odin, |
| 36 | + V, |
| 37 | + D, |
| 38 | + Bash, |
| 39 | + Fish, |
| 40 | + Zsh, |
| 41 | + PowerShell, |
| 42 | + Sql, |
| 43 | + Html, |
| 44 | + Css, |
| 45 | + Json, |
| 46 | + Yaml, |
| 47 | + Toml, |
| 48 | + Xml, |
| 49 | + Markdown, |
| 50 | + Makefile, |
| 51 | + Dockerfile, |
| 52 | + Terraform, |
| 53 | + Nix, |
| 54 | + Ocaml, |
| 55 | + Fsharp, |
| 56 | + Dart, |
| 57 | + Groovy, |
| 58 | +} |
| 59 | + |
| 60 | +impl Language { |
| 61 | + /// Detect language from filename/extension |
| 62 | + pub fn detect(filename: &str) -> Option<Language> { |
| 63 | + let lower = filename.to_lowercase(); |
| 64 | + |
| 65 | + // Check full filename first (for files like Makefile, Dockerfile) |
| 66 | + let basename = lower.rsplit('/').next().unwrap_or(&lower); |
| 67 | + |
| 68 | + match basename { |
| 69 | + "makefile" | "gnumakefile" => return Some(Language::Makefile), |
| 70 | + "dockerfile" => return Some(Language::Dockerfile), |
| 71 | + "cmakelists.txt" => return Some(Language::Makefile), |
| 72 | + ".bashrc" | ".bash_profile" | ".profile" => return Some(Language::Bash), |
| 73 | + ".zshrc" | ".zprofile" => return Some(Language::Zsh), |
| 74 | + "cargo.toml" | "pyproject.toml" => return Some(Language::Toml), |
| 75 | + "package.json" | "tsconfig.json" => return Some(Language::Json), |
| 76 | + _ => {} |
| 77 | + } |
| 78 | + |
| 79 | + // Check extension |
| 80 | + let ext = lower.rsplit('.').next()?; |
| 81 | + |
| 82 | + match ext { |
| 83 | + // Rust |
| 84 | + "rs" => Some(Language::Rust), |
| 85 | + |
| 86 | + // Python |
| 87 | + "py" | "pyw" | "pyi" | "pyx" => Some(Language::Python), |
| 88 | + |
| 89 | + // JavaScript / TypeScript |
| 90 | + "js" | "mjs" | "cjs" | "jsx" => Some(Language::JavaScript), |
| 91 | + "ts" | "mts" | "cts" | "tsx" => Some(Language::TypeScript), |
| 92 | + |
| 93 | + // C / C++ |
| 94 | + "c" | "h" => Some(Language::C), |
| 95 | + "cpp" | "cc" | "cxx" | "c++" | "hpp" | "hh" | "hxx" | "h++" | "ipp" => Some(Language::Cpp), |
| 96 | + |
| 97 | + // Go |
| 98 | + "go" => Some(Language::Go), |
| 99 | + |
| 100 | + // Java / JVM languages |
| 101 | + "java" => Some(Language::Java), |
| 102 | + "kt" | "kts" => Some(Language::Kotlin), |
| 103 | + "scala" | "sc" => Some(Language::Scala), |
| 104 | + "groovy" | "gvy" | "gy" | "gsh" => Some(Language::Groovy), |
| 105 | + "clj" | "cljs" | "cljc" | "edn" => Some(Language::Clojure), |
| 106 | + |
| 107 | + // Apple / Swift |
| 108 | + "swift" => Some(Language::Swift), |
| 109 | + |
| 110 | + // Ruby |
| 111 | + "rb" | "rake" | "gemspec" => Some(Language::Ruby), |
| 112 | + |
| 113 | + // PHP |
| 114 | + "php" | "php3" | "php4" | "php5" | "phtml" => Some(Language::Php), |
| 115 | + |
| 116 | + // C# / .NET |
| 117 | + "cs" => Some(Language::CSharp), |
| 118 | + "fs" | "fsx" | "fsi" => Some(Language::Fsharp), |
| 119 | + |
| 120 | + // Functional languages |
| 121 | + "hs" | "lhs" => Some(Language::Haskell), |
| 122 | + "ml" | "mli" => Some(Language::Ocaml), |
| 123 | + "ex" | "exs" => Some(Language::Elixir), |
| 124 | + "erl" | "hrl" => Some(Language::Erlang), |
| 125 | + |
| 126 | + // Scripting |
| 127 | + "lua" => Some(Language::Lua), |
| 128 | + "pl" | "pm" | "t" => Some(Language::Perl), |
| 129 | + "r" | "R" => Some(Language::R), |
| 130 | + "jl" => Some(Language::Julia), |
| 131 | + |
| 132 | + // System languages |
| 133 | + "zig" => Some(Language::Zig), |
| 134 | + "nim" | "nims" => Some(Language::Nim), |
| 135 | + "odin" => Some(Language::Odin), |
| 136 | + "v" => Some(Language::V), |
| 137 | + "d" => Some(Language::D), |
| 138 | + "f90" | "f95" | "f03" | "f08" | "f18" | "f" | "for" => Some(Language::Fortran), |
| 139 | + |
| 140 | + // Shell |
| 141 | + "sh" | "bash" => Some(Language::Bash), |
| 142 | + "fish" => Some(Language::Fish), |
| 143 | + "zsh" => Some(Language::Zsh), |
| 144 | + "ps1" | "psm1" | "psd1" => Some(Language::PowerShell), |
| 145 | + |
| 146 | + // Data / Config |
| 147 | + "sql" => Some(Language::Sql), |
| 148 | + "json" | "jsonc" | "json5" => Some(Language::Json), |
| 149 | + "yaml" | "yml" => Some(Language::Yaml), |
| 150 | + "toml" => Some(Language::Toml), |
| 151 | + "xml" | "svg" | "xsl" | "xslt" => Some(Language::Xml), |
| 152 | + |
| 153 | + // Web |
| 154 | + "html" | "htm" | "xhtml" => Some(Language::Html), |
| 155 | + "css" | "scss" | "sass" | "less" => Some(Language::Css), |
| 156 | + |
| 157 | + // Documentation |
| 158 | + "md" | "markdown" | "mdown" | "mkd" => Some(Language::Markdown), |
| 159 | + |
| 160 | + // DevOps / Infrastructure |
| 161 | + "tf" | "tfvars" => Some(Language::Terraform), |
| 162 | + "nix" => Some(Language::Nix), |
| 163 | + |
| 164 | + // Flutter / Dart |
| 165 | + "dart" => Some(Language::Dart), |
| 166 | + |
| 167 | + _ => None, |
| 168 | + } |
| 169 | + } |
| 170 | + |
| 171 | + /// Get the language definition |
| 172 | + pub fn definition(&self) -> LanguageDef { |
| 173 | + match self { |
| 174 | + Language::Rust => rust_def(), |
| 175 | + Language::Python => python_def(), |
| 176 | + Language::JavaScript => javascript_def(), |
| 177 | + Language::TypeScript => typescript_def(), |
| 178 | + Language::C => c_def(), |
| 179 | + Language::Cpp => cpp_def(), |
| 180 | + Language::Go => go_def(), |
| 181 | + Language::Java => java_def(), |
| 182 | + Language::Kotlin => kotlin_def(), |
| 183 | + Language::Swift => swift_def(), |
| 184 | + Language::Ruby => ruby_def(), |
| 185 | + Language::Php => php_def(), |
| 186 | + Language::CSharp => csharp_def(), |
| 187 | + Language::Scala => scala_def(), |
| 188 | + Language::Haskell => haskell_def(), |
| 189 | + Language::Lua => lua_def(), |
| 190 | + Language::Perl => perl_def(), |
| 191 | + Language::R => r_def(), |
| 192 | + Language::Julia => julia_def(), |
| 193 | + Language::Elixir => elixir_def(), |
| 194 | + Language::Erlang => erlang_def(), |
| 195 | + Language::Clojure => clojure_def(), |
| 196 | + Language::Fortran => fortran_def(), |
| 197 | + Language::Zig => zig_def(), |
| 198 | + Language::Nim => nim_def(), |
| 199 | + Language::Odin => odin_def(), |
| 200 | + Language::V => v_def(), |
| 201 | + Language::D => d_def(), |
| 202 | + Language::Bash => bash_def(), |
| 203 | + Language::Fish => fish_def(), |
| 204 | + Language::Zsh => zsh_def(), |
| 205 | + Language::PowerShell => powershell_def(), |
| 206 | + Language::Sql => sql_def(), |
| 207 | + Language::Html => html_def(), |
| 208 | + Language::Css => css_def(), |
| 209 | + Language::Json => json_def(), |
| 210 | + Language::Yaml => yaml_def(), |
| 211 | + Language::Toml => toml_def(), |
| 212 | + Language::Xml => xml_def(), |
| 213 | + Language::Markdown => markdown_def(), |
| 214 | + Language::Makefile => makefile_def(), |
| 215 | + Language::Dockerfile => dockerfile_def(), |
| 216 | + Language::Terraform => terraform_def(), |
| 217 | + Language::Nix => nix_def(), |
| 218 | + Language::Ocaml => ocaml_def(), |
| 219 | + Language::Fsharp => fsharp_def(), |
| 220 | + Language::Dart => dart_def(), |
| 221 | + Language::Groovy => groovy_def(), |
| 222 | + } |
| 223 | + } |
| 224 | + |
| 225 | + /// Get display name |
| 226 | + pub fn name(&self) -> &'static str { |
| 227 | + match self { |
| 228 | + Language::Rust => "Rust", |
| 229 | + Language::Python => "Python", |
| 230 | + Language::JavaScript => "JavaScript", |
| 231 | + Language::TypeScript => "TypeScript", |
| 232 | + Language::C => "C", |
| 233 | + Language::Cpp => "C++", |
| 234 | + Language::Go => "Go", |
| 235 | + Language::Java => "Java", |
| 236 | + Language::Kotlin => "Kotlin", |
| 237 | + Language::Swift => "Swift", |
| 238 | + Language::Ruby => "Ruby", |
| 239 | + Language::Php => "PHP", |
| 240 | + Language::CSharp => "C#", |
| 241 | + Language::Scala => "Scala", |
| 242 | + Language::Haskell => "Haskell", |
| 243 | + Language::Lua => "Lua", |
| 244 | + Language::Perl => "Perl", |
| 245 | + Language::R => "R", |
| 246 | + Language::Julia => "Julia", |
| 247 | + Language::Elixir => "Elixir", |
| 248 | + Language::Erlang => "Erlang", |
| 249 | + Language::Clojure => "Clojure", |
| 250 | + Language::Fortran => "Fortran", |
| 251 | + Language::Zig => "Zig", |
| 252 | + Language::Nim => "Nim", |
| 253 | + Language::Odin => "Odin", |
| 254 | + Language::V => "V", |
| 255 | + Language::D => "D", |
| 256 | + Language::Bash => "Bash", |
| 257 | + Language::Fish => "Fish", |
| 258 | + Language::Zsh => "Zsh", |
| 259 | + Language::PowerShell => "PowerShell", |
| 260 | + Language::Sql => "SQL", |
| 261 | + Language::Html => "HTML", |
| 262 | + Language::Css => "CSS", |
| 263 | + Language::Json => "JSON", |
| 264 | + Language::Yaml => "YAML", |
| 265 | + Language::Toml => "TOML", |
| 266 | + Language::Xml => "XML", |
| 267 | + Language::Markdown => "Markdown", |
| 268 | + Language::Makefile => "Makefile", |
| 269 | + Language::Dockerfile => "Dockerfile", |
| 270 | + Language::Terraform => "Terraform", |
| 271 | + Language::Nix => "Nix", |
| 272 | + Language::Ocaml => "OCaml", |
| 273 | + Language::Fsharp => "F#", |
| 274 | + Language::Dart => "Dart", |
| 275 | + Language::Groovy => "Groovy", |
| 276 | + } |
| 277 | + } |
| 278 | +} |
| 279 | + |
| 280 | +/// Language definition for syntax highlighting |
| 281 | +#[derive(Debug, Clone)] |
| 282 | +pub struct LanguageDef { |
| 283 | + pub name: &'static str, |
| 284 | + pub keywords: HashSet<&'static str>, |
| 285 | + pub types: HashSet<&'static str>, |
| 286 | + pub line_comment: Option<&'static str>, |
| 287 | + pub block_comment_start: Option<&'static str>, |
| 288 | + pub block_comment_end: Option<&'static str>, |
| 289 | + pub string_delimiters: Vec<char>, |
| 290 | + pub multiline_strings: bool, |
| 291 | + pub operators: Vec<&'static str>, |
| 292 | + pub punctuation: Vec<char>, |
| 293 | + pub has_preprocessor: bool, |
| 294 | + pub case_sensitive: bool, |
| 295 | +} |
| 296 | + |
| 297 | +impl Default for LanguageDef { |
| 298 | + fn default() -> Self { |
| 299 | + Self { |
| 300 | + name: "Plain", |
| 301 | + keywords: HashSet::new(), |
| 302 | + types: HashSet::new(), |
| 303 | + line_comment: None, |
| 304 | + block_comment_start: None, |
| 305 | + block_comment_end: None, |
| 306 | + string_delimiters: vec!['"', '\''], |
| 307 | + multiline_strings: false, |
| 308 | + operators: vec![], |
| 309 | + punctuation: vec![], |
| 310 | + has_preprocessor: false, |
| 311 | + case_sensitive: true, |
| 312 | + } |
| 313 | + } |
| 314 | +} |
| 315 | + |
| 316 | +// Common operators used by C-like languages |
| 317 | +const C_OPERATORS: &[&str] = &[ |
| 318 | + "->", "++", "--", "<<", ">>", "<=", ">=", "==", "!=", "&&", "||", |
| 319 | + "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=", |
| 320 | + "+", "-", "*", "/", "%", "&", "|", "^", "~", "!", "<", ">", "=", "?", ":", |
| 321 | +]; |
| 322 | + |
| 323 | +const C_PUNCTUATION: &[char] = &['{', '}', '(', ')', '[', ']', ';', ',', '.']; |
| 324 | + |
| 325 | +// ============================================================================ |
| 326 | +// Language Definitions |
| 327 | +// ============================================================================ |
| 328 | + |
| 329 | +fn rust_def() -> LanguageDef { |
| 330 | + LanguageDef { |
| 331 | + name: "Rust", |
| 332 | + keywords: [ |
| 333 | + "as", "async", "await", "break", "const", "continue", "crate", "dyn", |
| 334 | + "else", "enum", "extern", "false", "fn", "for", "if", "impl", "in", |
| 335 | + "let", "loop", "match", "mod", "move", "mut", "pub", "ref", "return", |
| 336 | + "self", "Self", "static", "struct", "super", "trait", "true", "type", |
| 337 | + "unsafe", "use", "where", "while", "yield", |
| 338 | + ].into_iter().collect(), |
| 339 | + types: [ |
| 340 | + "bool", "char", "str", "u8", "u16", "u32", "u64", "u128", "usize", |
| 341 | + "i8", "i16", "i32", "i64", "i128", "isize", "f32", "f64", |
| 342 | + "String", "Vec", "Box", "Rc", "Arc", "Cell", "RefCell", "Option", |
| 343 | + "Result", "Ok", "Err", "Some", "None", "HashMap", "HashSet", |
| 344 | + "BTreeMap", "BTreeSet", "VecDeque", "LinkedList", "BinaryHeap", |
| 345 | + ].into_iter().collect(), |
| 346 | + line_comment: Some("//"), |
| 347 | + block_comment_start: Some("/*"), |
| 348 | + block_comment_end: Some("*/"), |
| 349 | + string_delimiters: vec!['"'], |
| 350 | + multiline_strings: false, |
| 351 | + operators: C_OPERATORS.to_vec(), |
| 352 | + punctuation: C_PUNCTUATION.to_vec(), |
| 353 | + has_preprocessor: false, |
| 354 | + case_sensitive: true, |
| 355 | + } |
| 356 | +} |
| 357 | + |
| 358 | +fn python_def() -> LanguageDef { |
| 359 | + LanguageDef { |
| 360 | + name: "Python", |
| 361 | + keywords: [ |
| 362 | + "False", "None", "True", "and", "as", "assert", "async", "await", |
| 363 | + "break", "class", "continue", "def", "del", "elif", "else", "except", |
| 364 | + "finally", "for", "from", "global", "if", "import", "in", "is", |
| 365 | + "lambda", "nonlocal", "not", "or", "pass", "raise", "return", "try", |
| 366 | + "while", "with", "yield", "match", "case", "type", |
| 367 | + ].into_iter().collect(), |
| 368 | + types: [ |
| 369 | + "int", "float", "str", "bool", "list", "dict", "set", "tuple", |
| 370 | + "bytes", "bytearray", "complex", "frozenset", "object", "type", |
| 371 | + "None", "Callable", "Iterator", "Generator", "Coroutine", |
| 372 | + "Optional", "Union", "Any", "List", "Dict", "Set", "Tuple", |
| 373 | + ].into_iter().collect(), |
| 374 | + line_comment: Some("#"), |
| 375 | + block_comment_start: None, |
| 376 | + block_comment_end: None, |
| 377 | + string_delimiters: vec!['"', '\''], |
| 378 | + multiline_strings: true, // """...""" and '''...''' |
| 379 | + operators: vec![ |
| 380 | + "**", "//", "<<", ">>", "<=", ">=", "==", "!=", "->", |
| 381 | + "+=", "-=", "*=", "/=", "//=", "%=", "**=", "&=", "|=", "^=", ">>=", "<<=", |
| 382 | + "+", "-", "*", "/", "%", "&", "|", "^", "~", "<", ">", "=", "@", |
| 383 | + ], |
| 384 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ':', ',', '.', ';'], |
| 385 | + has_preprocessor: false, |
| 386 | + case_sensitive: true, |
| 387 | + } |
| 388 | +} |
| 389 | + |
| 390 | +fn javascript_def() -> LanguageDef { |
| 391 | + LanguageDef { |
| 392 | + name: "JavaScript", |
| 393 | + keywords: [ |
| 394 | + "async", "await", "break", "case", "catch", "class", "const", |
| 395 | + "continue", "debugger", "default", "delete", "do", "else", "export", |
| 396 | + "extends", "false", "finally", "for", "function", "if", "import", |
| 397 | + "in", "instanceof", "let", "new", "null", "of", "return", "static", |
| 398 | + "super", "switch", "this", "throw", "true", "try", "typeof", "var", |
| 399 | + "void", "while", "with", "yield", "undefined", "NaN", "Infinity", |
| 400 | + ].into_iter().collect(), |
| 401 | + types: [ |
| 402 | + "Array", "Boolean", "Date", "Error", "Function", "JSON", "Map", |
| 403 | + "Math", "Number", "Object", "Promise", "Proxy", "RegExp", "Set", |
| 404 | + "String", "Symbol", "WeakMap", "WeakSet", "BigInt", "ArrayBuffer", |
| 405 | + "DataView", "Float32Array", "Float64Array", "Int8Array", "Int16Array", |
| 406 | + "Int32Array", "Uint8Array", "Uint16Array", "Uint32Array", |
| 407 | + ].into_iter().collect(), |
| 408 | + line_comment: Some("//"), |
| 409 | + block_comment_start: Some("/*"), |
| 410 | + block_comment_end: Some("*/"), |
| 411 | + string_delimiters: vec!['"', '\'', '`'], |
| 412 | + multiline_strings: true, // template literals |
| 413 | + operators: C_OPERATORS.to_vec(), |
| 414 | + punctuation: C_PUNCTUATION.to_vec(), |
| 415 | + has_preprocessor: false, |
| 416 | + case_sensitive: true, |
| 417 | + } |
| 418 | +} |
| 419 | + |
| 420 | +fn typescript_def() -> LanguageDef { |
| 421 | + let mut def = javascript_def(); |
| 422 | + def.name = "TypeScript"; |
| 423 | + def.keywords.extend([ |
| 424 | + "abstract", "as", "asserts", "declare", "enum", "get", "implements", |
| 425 | + "interface", "is", "keyof", "module", "namespace", "never", "override", |
| 426 | + "private", "protected", "public", "readonly", "require", "set", "type", |
| 427 | + "infer", "satisfies", |
| 428 | + ]); |
| 429 | + def.types.extend([ |
| 430 | + "any", "boolean", "never", "null", "number", "object", "string", |
| 431 | + "symbol", "undefined", "unknown", "void", "Partial", "Required", |
| 432 | + "Readonly", "Record", "Pick", "Omit", "Exclude", "Extract", |
| 433 | + "NonNullable", "Parameters", "ReturnType", "InstanceType", |
| 434 | + ]); |
| 435 | + def |
| 436 | +} |
| 437 | + |
| 438 | +fn c_def() -> LanguageDef { |
| 439 | + LanguageDef { |
| 440 | + name: "C", |
| 441 | + keywords: [ |
| 442 | + "auto", "break", "case", "const", "continue", "default", "do", |
| 443 | + "else", "enum", "extern", "for", "goto", "if", "inline", "register", |
| 444 | + "restrict", "return", "sizeof", "static", "struct", "switch", |
| 445 | + "typedef", "union", "volatile", "while", "_Alignas", "_Alignof", |
| 446 | + "_Atomic", "_Bool", "_Complex", "_Generic", "_Imaginary", |
| 447 | + "_Noreturn", "_Static_assert", "_Thread_local", |
| 448 | + ].into_iter().collect(), |
| 449 | + types: [ |
| 450 | + "char", "double", "float", "int", "long", "short", "signed", |
| 451 | + "unsigned", "void", "size_t", "ssize_t", "ptrdiff_t", "intptr_t", |
| 452 | + "uintptr_t", "int8_t", "int16_t", "int32_t", "int64_t", |
| 453 | + "uint8_t", "uint16_t", "uint32_t", "uint64_t", "bool", "FILE", |
| 454 | + ].into_iter().collect(), |
| 455 | + line_comment: Some("//"), |
| 456 | + block_comment_start: Some("/*"), |
| 457 | + block_comment_end: Some("*/"), |
| 458 | + string_delimiters: vec!['"', '\''], |
| 459 | + multiline_strings: false, |
| 460 | + operators: C_OPERATORS.to_vec(), |
| 461 | + punctuation: C_PUNCTUATION.to_vec(), |
| 462 | + has_preprocessor: true, |
| 463 | + case_sensitive: true, |
| 464 | + } |
| 465 | +} |
| 466 | + |
| 467 | +fn cpp_def() -> LanguageDef { |
| 468 | + let mut def = c_def(); |
| 469 | + def.name = "C++"; |
| 470 | + def.keywords.extend([ |
| 471 | + "alignas", "alignof", "and", "and_eq", "asm", "bitand", "bitor", |
| 472 | + "catch", "class", "compl", "concept", "consteval", "constexpr", |
| 473 | + "constinit", "const_cast", "co_await", "co_return", "co_yield", |
| 474 | + "decltype", "delete", "dynamic_cast", "explicit", "export", "false", |
| 475 | + "friend", "module", "mutable", "namespace", "new", "noexcept", "not", |
| 476 | + "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", |
| 477 | + "public", "reinterpret_cast", "requires", "static_assert", "static_cast", |
| 478 | + "template", "this", "throw", "true", "try", "typeid", "typename", |
| 479 | + "using", "virtual", "xor", "xor_eq", "override", "final", |
| 480 | + ]); |
| 481 | + def.types.extend([ |
| 482 | + "auto", "wchar_t", "char8_t", "char16_t", "char32_t", "string", |
| 483 | + "wstring", "string_view", "vector", "map", "unordered_map", "set", |
| 484 | + "unordered_set", "list", "deque", "array", "pair", "tuple", |
| 485 | + "optional", "variant", "any", "span", "unique_ptr", "shared_ptr", |
| 486 | + "weak_ptr", "function", "thread", "mutex", "atomic", |
| 487 | + ]); |
| 488 | + def |
| 489 | +} |
| 490 | + |
| 491 | +fn go_def() -> LanguageDef { |
| 492 | + LanguageDef { |
| 493 | + name: "Go", |
| 494 | + keywords: [ |
| 495 | + "break", "case", "chan", "const", "continue", "default", "defer", |
| 496 | + "else", "fallthrough", "for", "func", "go", "goto", "if", "import", |
| 497 | + "interface", "map", "package", "range", "return", "select", "struct", |
| 498 | + "switch", "type", "var", "true", "false", "nil", "iota", |
| 499 | + ].into_iter().collect(), |
| 500 | + types: [ |
| 501 | + "bool", "byte", "complex64", "complex128", "error", "float32", |
| 502 | + "float64", "int", "int8", "int16", "int32", "int64", "rune", |
| 503 | + "string", "uint", "uint8", "uint16", "uint32", "uint64", "uintptr", |
| 504 | + "any", "comparable", |
| 505 | + ].into_iter().collect(), |
| 506 | + line_comment: Some("//"), |
| 507 | + block_comment_start: Some("/*"), |
| 508 | + block_comment_end: Some("*/"), |
| 509 | + string_delimiters: vec!['"', '\'', '`'], |
| 510 | + multiline_strings: true, |
| 511 | + operators: vec![ |
| 512 | + ":=", "...", "++", "--", "<<", ">>", "&^", "<=", ">=", "==", "!=", |
| 513 | + "&&", "||", "<-", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", |
| 514 | + "<<=", ">>=", "&^=", |
| 515 | + "+", "-", "*", "/", "%", "&", "|", "^", "<", ">", "=", "!", |
| 516 | + ], |
| 517 | + punctuation: C_PUNCTUATION.to_vec(), |
| 518 | + has_preprocessor: false, |
| 519 | + case_sensitive: true, |
| 520 | + } |
| 521 | +} |
| 522 | + |
| 523 | +fn java_def() -> LanguageDef { |
| 524 | + LanguageDef { |
| 525 | + name: "Java", |
| 526 | + keywords: [ |
| 527 | + "abstract", "assert", "boolean", "break", "byte", "case", "catch", |
| 528 | + "char", "class", "const", "continue", "default", "do", "double", |
| 529 | + "else", "enum", "extends", "final", "finally", "float", "for", |
| 530 | + "goto", "if", "implements", "import", "instanceof", "int", |
| 531 | + "interface", "long", "native", "new", "package", "private", |
| 532 | + "protected", "public", "return", "short", "static", "strictfp", |
| 533 | + "super", "switch", "synchronized", "this", "throw", "throws", |
| 534 | + "transient", "try", "void", "volatile", "while", "true", "false", |
| 535 | + "null", "var", "yield", "record", "sealed", "non-sealed", "permits", |
| 536 | + ].into_iter().collect(), |
| 537 | + types: [ |
| 538 | + "Boolean", "Byte", "Character", "Class", "Double", "Enum", "Float", |
| 539 | + "Integer", "Long", "Number", "Object", "Short", "String", "Void", |
| 540 | + "List", "Map", "Set", "Collection", "ArrayList", "HashMap", "HashSet", |
| 541 | + "LinkedList", "TreeMap", "TreeSet", "Optional", "Stream", "Thread", |
| 542 | + ].into_iter().collect(), |
| 543 | + line_comment: Some("//"), |
| 544 | + block_comment_start: Some("/*"), |
| 545 | + block_comment_end: Some("*/"), |
| 546 | + string_delimiters: vec!['"', '\''], |
| 547 | + multiline_strings: true, // text blocks with """ |
| 548 | + operators: C_OPERATORS.to_vec(), |
| 549 | + punctuation: C_PUNCTUATION.to_vec(), |
| 550 | + has_preprocessor: false, |
| 551 | + case_sensitive: true, |
| 552 | + } |
| 553 | +} |
| 554 | + |
| 555 | +fn kotlin_def() -> LanguageDef { |
| 556 | + LanguageDef { |
| 557 | + name: "Kotlin", |
| 558 | + keywords: [ |
| 559 | + "as", "break", "by", "catch", "class", "companion", "const", |
| 560 | + "constructor", "continue", "crossinline", "data", "do", "else", |
| 561 | + "enum", "external", "false", "final", "finally", "for", "fun", |
| 562 | + "get", "if", "import", "in", "infix", "init", "inline", "inner", |
| 563 | + "interface", "internal", "is", "lateinit", "noinline", "null", |
| 564 | + "object", "open", "operator", "out", "override", "package", |
| 565 | + "private", "protected", "public", "reified", "return", "sealed", |
| 566 | + "set", "super", "suspend", "tailrec", "this", "throw", "true", |
| 567 | + "try", "typealias", "typeof", "val", "var", "vararg", "when", |
| 568 | + "where", "while", |
| 569 | + ].into_iter().collect(), |
| 570 | + types: [ |
| 571 | + "Any", "Boolean", "Byte", "Char", "Double", "Float", "Int", "Long", |
| 572 | + "Nothing", "Number", "Short", "String", "Unit", "Array", "List", |
| 573 | + "Map", "Set", "MutableList", "MutableMap", "MutableSet", "Pair", |
| 574 | + "Triple", "Sequence", "Lazy", |
| 575 | + ].into_iter().collect(), |
| 576 | + line_comment: Some("//"), |
| 577 | + block_comment_start: Some("/*"), |
| 578 | + block_comment_end: Some("*/"), |
| 579 | + string_delimiters: vec!['"', '\''], |
| 580 | + multiline_strings: true, |
| 581 | + operators: C_OPERATORS.to_vec(), |
| 582 | + punctuation: C_PUNCTUATION.to_vec(), |
| 583 | + has_preprocessor: false, |
| 584 | + case_sensitive: true, |
| 585 | + } |
| 586 | +} |
| 587 | + |
| 588 | +fn swift_def() -> LanguageDef { |
| 589 | + LanguageDef { |
| 590 | + name: "Swift", |
| 591 | + keywords: [ |
| 592 | + "actor", "any", "as", "associatedtype", "async", "await", "break", |
| 593 | + "case", "catch", "class", "continue", "convenience", "default", |
| 594 | + "defer", "deinit", "didSet", "do", "dynamic", "else", "enum", |
| 595 | + "extension", "fallthrough", "false", "fileprivate", "final", "for", |
| 596 | + "func", "get", "guard", "if", "import", "in", "indirect", "infix", |
| 597 | + "init", "inout", "internal", "is", "isolated", "lazy", "let", |
| 598 | + "mutating", "nil", "nonisolated", "nonmutating", "open", "operator", |
| 599 | + "optional", "override", "postfix", "precedencegroup", "prefix", |
| 600 | + "private", "protocol", "public", "repeat", "required", "rethrows", |
| 601 | + "return", "self", "Self", "set", "some", "static", "struct", |
| 602 | + "subscript", "super", "switch", "throw", "throws", "true", "try", |
| 603 | + "typealias", "unowned", "var", "weak", "where", "while", "willSet", |
| 604 | + ].into_iter().collect(), |
| 605 | + types: [ |
| 606 | + "Any", "AnyObject", "Array", "Bool", "Character", "Dictionary", |
| 607 | + "Double", "Float", "Int", "Int8", "Int16", "Int32", "Int64", |
| 608 | + "Optional", "Result", "Set", "String", "UInt", "UInt8", "UInt16", |
| 609 | + "UInt32", "UInt64", "Void", "Never", |
| 610 | + ].into_iter().collect(), |
| 611 | + line_comment: Some("//"), |
| 612 | + block_comment_start: Some("/*"), |
| 613 | + block_comment_end: Some("*/"), |
| 614 | + string_delimiters: vec!['"'], |
| 615 | + multiline_strings: true, |
| 616 | + operators: C_OPERATORS.to_vec(), |
| 617 | + punctuation: C_PUNCTUATION.to_vec(), |
| 618 | + has_preprocessor: false, |
| 619 | + case_sensitive: true, |
| 620 | + } |
| 621 | +} |
| 622 | + |
| 623 | +fn ruby_def() -> LanguageDef { |
| 624 | + LanguageDef { |
| 625 | + name: "Ruby", |
| 626 | + keywords: [ |
| 627 | + "BEGIN", "END", "alias", "and", "begin", "break", "case", "class", |
| 628 | + "def", "defined?", "do", "else", "elsif", "end", "ensure", "false", |
| 629 | + "for", "if", "in", "module", "next", "nil", "not", "or", "redo", |
| 630 | + "rescue", "retry", "return", "self", "super", "then", "true", |
| 631 | + "undef", "unless", "until", "when", "while", "yield", "__FILE__", |
| 632 | + "__LINE__", "__ENCODING__", "lambda", "proc", "raise", "require", |
| 633 | + "require_relative", "attr_accessor", "attr_reader", "attr_writer", |
| 634 | + "private", "protected", "public", |
| 635 | + ].into_iter().collect(), |
| 636 | + types: [ |
| 637 | + "Array", "Bignum", "Binding", "Class", "Continuation", "Dir", |
| 638 | + "Exception", "FalseClass", "File", "Fixnum", "Float", "Hash", |
| 639 | + "Integer", "IO", "MatchData", "Method", "Module", "NilClass", |
| 640 | + "Numeric", "Object", "Proc", "Range", "Regexp", "String", "Struct", |
| 641 | + "Symbol", "Thread", "Time", "TrueClass", |
| 642 | + ].into_iter().collect(), |
| 643 | + line_comment: Some("#"), |
| 644 | + block_comment_start: Some("=begin"), |
| 645 | + block_comment_end: Some("=end"), |
| 646 | + string_delimiters: vec!['"', '\'', '`'], |
| 647 | + multiline_strings: true, |
| 648 | + operators: vec![ |
| 649 | + "**", "..", "...", "<<", ">>", "<=>", "<=", ">=", "==", "===", |
| 650 | + "!=", "=~", "!~", "&&", "||", "+=", "-=", "*=", "/=", "%=", |
| 651 | + "**=", "&=", "|=", "^=", "<<=", ">>=", "&&=", "||=", |
| 652 | + "+", "-", "*", "/", "%", "&", "|", "^", "~", "<", ">", "=", "!", |
| 653 | + ], |
| 654 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':', '@', '$'], |
| 655 | + has_preprocessor: false, |
| 656 | + case_sensitive: true, |
| 657 | + } |
| 658 | +} |
| 659 | + |
| 660 | +fn php_def() -> LanguageDef { |
| 661 | + LanguageDef { |
| 662 | + name: "PHP", |
| 663 | + keywords: [ |
| 664 | + "abstract", "and", "array", "as", "break", "callable", "case", |
| 665 | + "catch", "class", "clone", "const", "continue", "declare", "default", |
| 666 | + "die", "do", "echo", "else", "elseif", "empty", "enddeclare", |
| 667 | + "endfor", "endforeach", "endif", "endswitch", "endwhile", "eval", |
| 668 | + "exit", "extends", "final", "finally", "fn", "for", "foreach", |
| 669 | + "function", "global", "goto", "if", "implements", "include", |
| 670 | + "include_once", "instanceof", "insteadof", "interface", "isset", |
| 671 | + "list", "match", "namespace", "new", "or", "print", "private", |
| 672 | + "protected", "public", "readonly", "require", "require_once", |
| 673 | + "return", "static", "switch", "throw", "trait", "try", "unset", |
| 674 | + "use", "var", "while", "xor", "yield", "true", "false", "null", |
| 675 | + ].into_iter().collect(), |
| 676 | + types: [ |
| 677 | + "bool", "boolean", "int", "integer", "float", "double", "string", |
| 678 | + "array", "object", "callable", "iterable", "void", "mixed", "never", |
| 679 | + "null", "self", "parent", "static", |
| 680 | + ].into_iter().collect(), |
| 681 | + line_comment: Some("//"), |
| 682 | + block_comment_start: Some("/*"), |
| 683 | + block_comment_end: Some("*/"), |
| 684 | + string_delimiters: vec!['"', '\''], |
| 685 | + multiline_strings: true, |
| 686 | + operators: C_OPERATORS.to_vec(), |
| 687 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':', '$', '@'], |
| 688 | + has_preprocessor: false, |
| 689 | + case_sensitive: false, |
| 690 | + } |
| 691 | +} |
| 692 | + |
| 693 | +fn csharp_def() -> LanguageDef { |
| 694 | + LanguageDef { |
| 695 | + name: "C#", |
| 696 | + keywords: [ |
| 697 | + "abstract", "as", "base", "bool", "break", "byte", "case", "catch", |
| 698 | + "char", "checked", "class", "const", "continue", "decimal", "default", |
| 699 | + "delegate", "do", "double", "else", "enum", "event", "explicit", |
| 700 | + "extern", "false", "finally", "fixed", "float", "for", "foreach", |
| 701 | + "goto", "if", "implicit", "in", "int", "interface", "internal", |
| 702 | + "is", "lock", "long", "namespace", "new", "null", "object", |
| 703 | + "operator", "out", "override", "params", "private", "protected", |
| 704 | + "public", "readonly", "ref", "return", "sbyte", "sealed", "short", |
| 705 | + "sizeof", "stackalloc", "static", "string", "struct", "switch", |
| 706 | + "this", "throw", "true", "try", "typeof", "uint", "ulong", |
| 707 | + "unchecked", "unsafe", "ushort", "using", "var", "virtual", "void", |
| 708 | + "volatile", "while", "async", "await", "dynamic", "nameof", "when", |
| 709 | + "record", "init", "with", "required", "file", "scoped", |
| 710 | + ].into_iter().collect(), |
| 711 | + types: [ |
| 712 | + "Boolean", "Byte", "Char", "DateTime", "Decimal", "Double", "Guid", |
| 713 | + "Int16", "Int32", "Int64", "Object", "SByte", "Single", "String", |
| 714 | + "TimeSpan", "UInt16", "UInt32", "UInt64", "List", "Dictionary", |
| 715 | + "HashSet", "Queue", "Stack", "Array", "Task", "Func", "Action", |
| 716 | + "IEnumerable", "IList", "IDictionary", "ICollection", |
| 717 | + ].into_iter().collect(), |
| 718 | + line_comment: Some("//"), |
| 719 | + block_comment_start: Some("/*"), |
| 720 | + block_comment_end: Some("*/"), |
| 721 | + string_delimiters: vec!['"', '\''], |
| 722 | + multiline_strings: true, |
| 723 | + operators: C_OPERATORS.to_vec(), |
| 724 | + punctuation: C_PUNCTUATION.to_vec(), |
| 725 | + has_preprocessor: true, |
| 726 | + case_sensitive: true, |
| 727 | + } |
| 728 | +} |
| 729 | + |
| 730 | +fn scala_def() -> LanguageDef { |
| 731 | + LanguageDef { |
| 732 | + name: "Scala", |
| 733 | + keywords: [ |
| 734 | + "abstract", "case", "catch", "class", "def", "do", "else", "enum", |
| 735 | + "export", "extends", "extension", "false", "final", "finally", |
| 736 | + "for", "forSome", "given", "if", "implicit", "import", "inline", |
| 737 | + "lazy", "match", "new", "null", "object", "opaque", "open", |
| 738 | + "override", "package", "private", "protected", "return", "sealed", |
| 739 | + "super", "then", "this", "throw", "trait", "transparent", "true", |
| 740 | + "try", "type", "using", "val", "var", "while", "with", "yield", |
| 741 | + ].into_iter().collect(), |
| 742 | + types: [ |
| 743 | + "Any", "AnyRef", "AnyVal", "Array", "BigDecimal", "BigInt", "Boolean", |
| 744 | + "Byte", "Char", "Double", "Float", "Int", "List", "Long", "Map", |
| 745 | + "Nothing", "Null", "Option", "Seq", "Set", "Short", "Some", "String", |
| 746 | + "Unit", "Vector", |
| 747 | + ].into_iter().collect(), |
| 748 | + line_comment: Some("//"), |
| 749 | + block_comment_start: Some("/*"), |
| 750 | + block_comment_end: Some("*/"), |
| 751 | + string_delimiters: vec!['"', '\''], |
| 752 | + multiline_strings: true, |
| 753 | + operators: C_OPERATORS.to_vec(), |
| 754 | + punctuation: C_PUNCTUATION.to_vec(), |
| 755 | + has_preprocessor: false, |
| 756 | + case_sensitive: true, |
| 757 | + } |
| 758 | +} |
| 759 | + |
| 760 | +fn haskell_def() -> LanguageDef { |
| 761 | + LanguageDef { |
| 762 | + name: "Haskell", |
| 763 | + keywords: [ |
| 764 | + "as", "case", "class", "data", "default", "deriving", "do", "else", |
| 765 | + "forall", "foreign", "hiding", "if", "import", "in", "infix", |
| 766 | + "infixl", "infixr", "instance", "let", "mdo", "module", "newtype", |
| 767 | + "of", "proc", "qualified", "rec", "then", "type", "where", |
| 768 | + ].into_iter().collect(), |
| 769 | + types: [ |
| 770 | + "Bool", "Char", "Double", "Either", "Float", "IO", "Int", "Integer", |
| 771 | + "Maybe", "Ordering", "String", "Word", |
| 772 | + ].into_iter().collect(), |
| 773 | + line_comment: Some("--"), |
| 774 | + block_comment_start: Some("{-"), |
| 775 | + block_comment_end: Some("-}"), |
| 776 | + string_delimiters: vec!['"', '\''], |
| 777 | + multiline_strings: false, |
| 778 | + operators: vec![ |
| 779 | + "->", "<-", "=>", "::", "++", ">>", ">>=", "<$>", "<*>", "<|>", |
| 780 | + ".", "$", "=", "<", ">", "+", "-", "*", "/", "^", "&", "|", |
| 781 | + ], |
| 782 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '`'], |
| 783 | + has_preprocessor: false, |
| 784 | + case_sensitive: true, |
| 785 | + } |
| 786 | +} |
| 787 | + |
| 788 | +fn lua_def() -> LanguageDef { |
| 789 | + LanguageDef { |
| 790 | + name: "Lua", |
| 791 | + keywords: [ |
| 792 | + "and", "break", "do", "else", "elseif", "end", "false", "for", |
| 793 | + "function", "goto", "if", "in", "local", "nil", "not", "or", |
| 794 | + "repeat", "return", "then", "true", "until", "while", |
| 795 | + ].into_iter().collect(), |
| 796 | + types: HashSet::new(), |
| 797 | + line_comment: Some("--"), |
| 798 | + block_comment_start: Some("--[["), |
| 799 | + block_comment_end: Some("]]"), |
| 800 | + string_delimiters: vec!['"', '\''], |
| 801 | + multiline_strings: true, |
| 802 | + operators: vec![ |
| 803 | + "..", "...", "==", "~=", "<=", ">=", "<<", ">>", "//", |
| 804 | + "+", "-", "*", "/", "%", "^", "#", "&", "|", "~", "<", ">", "=", |
| 805 | + ], |
| 806 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':'], |
| 807 | + has_preprocessor: false, |
| 808 | + case_sensitive: true, |
| 809 | + } |
| 810 | +} |
| 811 | + |
| 812 | +fn perl_def() -> LanguageDef { |
| 813 | + LanguageDef { |
| 814 | + name: "Perl", |
| 815 | + keywords: [ |
| 816 | + "and", "cmp", "continue", "do", "else", "elsif", "eq", "for", |
| 817 | + "foreach", "ge", "goto", "gt", "if", "last", "le", "lt", "my", |
| 818 | + "ne", "next", "no", "or", "our", "package", "redo", "require", |
| 819 | + "return", "sub", "unless", "until", "use", "while", "xor", |
| 820 | + ].into_iter().collect(), |
| 821 | + types: HashSet::new(), |
| 822 | + line_comment: Some("#"), |
| 823 | + block_comment_start: Some("=pod"), |
| 824 | + block_comment_end: Some("=cut"), |
| 825 | + string_delimiters: vec!['"', '\''], |
| 826 | + multiline_strings: true, |
| 827 | + operators: vec![ |
| 828 | + "->", "++", "--", "**", "=~", "!~", "<=", ">=", "==", "!=", |
| 829 | + "<=>", "&&", "||", "..", "...", |
| 830 | + "+", "-", "*", "/", "%", ".", "<", ">", "&", "|", "^", "~", "!", |
| 831 | + ], |
| 832 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', ':', '$', '@', '%'], |
| 833 | + has_preprocessor: false, |
| 834 | + case_sensitive: true, |
| 835 | + } |
| 836 | +} |
| 837 | + |
| 838 | +fn r_def() -> LanguageDef { |
| 839 | + LanguageDef { |
| 840 | + name: "R", |
| 841 | + keywords: [ |
| 842 | + "break", "else", "for", "function", "if", "in", "next", "repeat", |
| 843 | + "return", "while", "TRUE", "FALSE", "NULL", "NA", "NA_integer_", |
| 844 | + "NA_real_", "NA_complex_", "NA_character_", "Inf", "NaN", |
| 845 | + ].into_iter().collect(), |
| 846 | + types: [ |
| 847 | + "character", "complex", "double", "expression", "integer", "list", |
| 848 | + "logical", "numeric", "raw", "vector", "matrix", "array", |
| 849 | + "data.frame", "factor", |
| 850 | + ].into_iter().collect(), |
| 851 | + line_comment: Some("#"), |
| 852 | + block_comment_start: None, |
| 853 | + block_comment_end: None, |
| 854 | + string_delimiters: vec!['"', '\''], |
| 855 | + multiline_strings: false, |
| 856 | + operators: vec![ |
| 857 | + "<-", "->", "<<-", "->>", "%%", "%/%", "%*%", "%in%", "%o%", "%x%", |
| 858 | + "<=", ">=", "==", "!=", "&&", "||", "!", "&", "|", |
| 859 | + "+", "-", "*", "/", "^", ":", "$", "@", "~", |
| 860 | + ], |
| 861 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ','], |
| 862 | + has_preprocessor: false, |
| 863 | + case_sensitive: true, |
| 864 | + } |
| 865 | +} |
| 866 | + |
| 867 | +fn julia_def() -> LanguageDef { |
| 868 | + LanguageDef { |
| 869 | + name: "Julia", |
| 870 | + keywords: [ |
| 871 | + "abstract", "baremodule", "begin", "break", "catch", "const", |
| 872 | + "continue", "do", "else", "elseif", "end", "export", "false", |
| 873 | + "finally", "for", "function", "global", "if", "import", "in", |
| 874 | + "let", "local", "macro", "module", "mutable", "primitive", "quote", |
| 875 | + "return", "struct", "true", "try", "type", "using", "where", "while", |
| 876 | + ].into_iter().collect(), |
| 877 | + types: [ |
| 878 | + "Any", "Bool", "Char", "Complex", "Float16", "Float32", "Float64", |
| 879 | + "Int", "Int8", "Int16", "Int32", "Int64", "Int128", "Integer", |
| 880 | + "Nothing", "Number", "Rational", "Real", "String", "Symbol", |
| 881 | + "UInt", "UInt8", "UInt16", "UInt32", "UInt64", "UInt128", |
| 882 | + "Array", "Dict", "Set", "Tuple", "Vector", "Matrix", |
| 883 | + ].into_iter().collect(), |
| 884 | + line_comment: Some("#"), |
| 885 | + block_comment_start: Some("#="), |
| 886 | + block_comment_end: Some("=#"), |
| 887 | + string_delimiters: vec!['"', '\''], |
| 888 | + multiline_strings: true, |
| 889 | + operators: vec![ |
| 890 | + "->", "=>", "::", "...", "..", "<=", ">=", "==", "!=", "===", "!==", |
| 891 | + "&&", "||", "⊻", "<<", ">>", ">>>", "+=", "-=", "*=", "/=", |
| 892 | + "+", "-", "*", "/", "\\", "^", "%", "&", "|", "~", "<", ">", "!", |
| 893 | + ], |
| 894 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':'], |
| 895 | + has_preprocessor: false, |
| 896 | + case_sensitive: true, |
| 897 | + } |
| 898 | +} |
| 899 | + |
| 900 | +fn elixir_def() -> LanguageDef { |
| 901 | + LanguageDef { |
| 902 | + name: "Elixir", |
| 903 | + keywords: [ |
| 904 | + "after", "alias", "and", "case", "catch", "cond", "def", "defp", |
| 905 | + "defcallback", "defdelegate", "defexception", "defguard", |
| 906 | + "defguardp", "defimpl", "defmacro", "defmacrop", "defmodule", |
| 907 | + "defoverridable", "defprotocol", "defstruct", "do", "else", "end", |
| 908 | + "false", "fn", "for", "if", "import", "in", "nil", "not", "or", |
| 909 | + "quote", "raise", "receive", "require", "rescue", "true", "try", |
| 910 | + "unless", "unquote", "unquote_splicing", "use", "when", "with", |
| 911 | + ].into_iter().collect(), |
| 912 | + types: [ |
| 913 | + "Atom", "BitString", "Float", "Function", "Integer", "List", "Map", |
| 914 | + "PID", "Port", "Reference", "Tuple", "String", "Keyword", |
| 915 | + ].into_iter().collect(), |
| 916 | + line_comment: Some("#"), |
| 917 | + block_comment_start: None, |
| 918 | + block_comment_end: None, |
| 919 | + string_delimiters: vec!['"', '\''], |
| 920 | + multiline_strings: true, |
| 921 | + operators: vec![ |
| 922 | + "->", "<-", "|>", "++", "--", "<>", "..", "<=", ">=", "==", "!=", |
| 923 | + "===", "!==", "&&", "||", "and", "or", "not", "in", |
| 924 | + "+", "-", "*", "/", "^", "&", "|", "~", "<", ">", "=", "!", |
| 925 | + ], |
| 926 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':', '@', '%'], |
| 927 | + has_preprocessor: false, |
| 928 | + case_sensitive: true, |
| 929 | + } |
| 930 | +} |
| 931 | + |
| 932 | +fn erlang_def() -> LanguageDef { |
| 933 | + LanguageDef { |
| 934 | + name: "Erlang", |
| 935 | + keywords: [ |
| 936 | + "after", "and", "andalso", "band", "begin", "bnot", "bor", "bsl", |
| 937 | + "bsr", "bxor", "case", "catch", "cond", "div", "end", "fun", "if", |
| 938 | + "let", "not", "of", "or", "orelse", "receive", "rem", "try", "when", |
| 939 | + "xor", |
| 940 | + ].into_iter().collect(), |
| 941 | + types: HashSet::new(), |
| 942 | + line_comment: Some("%"), |
| 943 | + block_comment_start: None, |
| 944 | + block_comment_end: None, |
| 945 | + string_delimiters: vec!['"', '\''], |
| 946 | + multiline_strings: false, |
| 947 | + operators: vec![ |
| 948 | + "->", "<-", "++", "--", "==", "/=", "=<", ">=", "=:=", "=/=", |
| 949 | + "||", "!", "+", "-", "*", "/", "<", ">", "=", |
| 950 | + ], |
| 951 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':', '|'], |
| 952 | + has_preprocessor: false, |
| 953 | + case_sensitive: true, |
| 954 | + } |
| 955 | +} |
| 956 | + |
| 957 | +fn clojure_def() -> LanguageDef { |
| 958 | + LanguageDef { |
| 959 | + name: "Clojure", |
| 960 | + keywords: [ |
| 961 | + "def", "defn", "defn-", "defmacro", "defmulti", "defmethod", |
| 962 | + "defprotocol", "defrecord", "defstruct", "deftype", "fn", "if", |
| 963 | + "do", "let", "loop", "recur", "throw", "try", "catch", "finally", |
| 964 | + "quote", "var", "import", "use", "require", "ns", "in-ns", "new", |
| 965 | + "set!", "nil", "true", "false", |
| 966 | + ].into_iter().collect(), |
| 967 | + types: HashSet::new(), |
| 968 | + line_comment: Some(";"), |
| 969 | + block_comment_start: None, |
| 970 | + block_comment_end: None, |
| 971 | + string_delimiters: vec!['"'], |
| 972 | + multiline_strings: true, |
| 973 | + operators: vec![ |
| 974 | + "->", "->>", "=>", "@", "^", "`", "~", "~@", "#", |
| 975 | + ], |
| 976 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ':', '\''], |
| 977 | + has_preprocessor: false, |
| 978 | + case_sensitive: true, |
| 979 | + } |
| 980 | +} |
| 981 | + |
| 982 | +fn fortran_def() -> LanguageDef { |
| 983 | + LanguageDef { |
| 984 | + name: "Fortran", |
| 985 | + keywords: [ |
| 986 | + "allocatable", "allocate", "assign", "associate", "asynchronous", |
| 987 | + "backspace", "block", "call", "case", "character", "class", "close", |
| 988 | + "codimension", "common", "complex", "concurrent", "contains", |
| 989 | + "contiguous", "continue", "critical", "cycle", "data", "deallocate", |
| 990 | + "default", "deferred", "dimension", "do", "double", "elemental", |
| 991 | + "else", "elseif", "elsewhere", "end", "endfile", "endif", "entry", |
| 992 | + "enum", "enumerator", "equivalence", "error", "exit", "extends", |
| 993 | + "external", "final", "flush", "forall", "format", "function", |
| 994 | + "generic", "go", "goto", "if", "images", "implicit", "import", |
| 995 | + "include", "inquire", "intent", "interface", "intrinsic", "kind", |
| 996 | + "len", "lock", "logical", "module", "namelist", "none", "nopass", |
| 997 | + "nullify", "only", "open", "operator", "optional", "out", "parameter", |
| 998 | + "pass", "pause", "pointer", "precision", "print", "private", |
| 999 | + "procedure", "program", "protected", "public", "pure", "read", |
| 1000 | + "real", "recursive", "result", "return", "rewind", "save", "select", |
| 1001 | + "sequence", "stop", "submodule", "subroutine", "sync", "target", |
| 1002 | + "then", "to", "type", "unlock", "use", "value", "volatile", "wait", |
| 1003 | + "where", "while", "write", |
| 1004 | + ].into_iter().collect(), |
| 1005 | + types: [ |
| 1006 | + "integer", "real", "complex", "character", "logical", "double", |
| 1007 | + "precision", "type", "class", |
| 1008 | + ].into_iter().collect(), |
| 1009 | + line_comment: Some("!"), |
| 1010 | + block_comment_start: None, |
| 1011 | + block_comment_end: None, |
| 1012 | + string_delimiters: vec!['"', '\''], |
| 1013 | + multiline_strings: false, |
| 1014 | + operators: vec![ |
| 1015 | + "==", "/=", "<=", ">=", "**", "//", ".eq.", ".ne.", ".lt.", ".le.", |
| 1016 | + ".gt.", ".ge.", ".and.", ".or.", ".not.", ".eqv.", ".neqv.", |
| 1017 | + "+", "-", "*", "/", "<", ">", "=", |
| 1018 | + ], |
| 1019 | + punctuation: vec!['(', ')', '[', ']', ',', ':', '%'], |
| 1020 | + has_preprocessor: false, |
| 1021 | + case_sensitive: false, |
| 1022 | + } |
| 1023 | +} |
| 1024 | + |
| 1025 | +fn zig_def() -> LanguageDef { |
| 1026 | + LanguageDef { |
| 1027 | + name: "Zig", |
| 1028 | + keywords: [ |
| 1029 | + "addrspace", "align", "allowzero", "and", "anyframe", "anytype", |
| 1030 | + "asm", "async", "await", "break", "callconv", "catch", "comptime", |
| 1031 | + "const", "continue", "defer", "else", "enum", "errdefer", "error", |
| 1032 | + "export", "extern", "fn", "for", "if", "inline", "linksection", |
| 1033 | + "noalias", "noinline", "nosuspend", "opaque", "or", "orelse", |
| 1034 | + "packed", "pub", "resume", "return", "struct", "suspend", "switch", |
| 1035 | + "test", "threadlocal", "try", "union", "unreachable", "usingnamespace", |
| 1036 | + "var", "volatile", "while", "null", "undefined", "true", "false", |
| 1037 | + ].into_iter().collect(), |
| 1038 | + types: [ |
| 1039 | + "i8", "u8", "i16", "u16", "i32", "u32", "i64", "u64", "i128", "u128", |
| 1040 | + "isize", "usize", "f16", "f32", "f64", "f80", "f128", "bool", "void", |
| 1041 | + "anyerror", "anyopaque", "comptime_int", "comptime_float", "type", |
| 1042 | + "noreturn", |
| 1043 | + ].into_iter().collect(), |
| 1044 | + line_comment: Some("//"), |
| 1045 | + block_comment_start: None, |
| 1046 | + block_comment_end: None, |
| 1047 | + string_delimiters: vec!['"'], |
| 1048 | + multiline_strings: false, |
| 1049 | + operators: C_OPERATORS.to_vec(), |
| 1050 | + punctuation: C_PUNCTUATION.to_vec(), |
| 1051 | + has_preprocessor: false, |
| 1052 | + case_sensitive: true, |
| 1053 | + } |
| 1054 | +} |
| 1055 | + |
| 1056 | +fn nim_def() -> LanguageDef { |
| 1057 | + LanguageDef { |
| 1058 | + name: "Nim", |
| 1059 | + keywords: [ |
| 1060 | + "addr", "and", "as", "asm", "bind", "block", "break", "case", "cast", |
| 1061 | + "concept", "const", "continue", "converter", "defer", "discard", |
| 1062 | + "distinct", "div", "do", "elif", "else", "end", "enum", "except", |
| 1063 | + "export", "finally", "for", "from", "func", "if", "import", "in", |
| 1064 | + "include", "interface", "is", "isnot", "iterator", "let", "macro", |
| 1065 | + "method", "mixin", "mod", "nil", "not", "notin", "object", "of", |
| 1066 | + "or", "out", "proc", "ptr", "raise", "ref", "return", "shl", "shr", |
| 1067 | + "static", "template", "try", "tuple", "type", "using", "var", "when", |
| 1068 | + "while", "xor", "yield", "true", "false", |
| 1069 | + ].into_iter().collect(), |
| 1070 | + types: [ |
| 1071 | + "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", |
| 1072 | + "uint32", "uint64", "float", "float32", "float64", "bool", "char", |
| 1073 | + "string", "cstring", "pointer", "seq", "array", "set", "tuple", |
| 1074 | + "object", "ref", "ptr", "proc", "iterator", "void", |
| 1075 | + ].into_iter().collect(), |
| 1076 | + line_comment: Some("#"), |
| 1077 | + block_comment_start: Some("#["), |
| 1078 | + block_comment_end: Some("]#"), |
| 1079 | + string_delimiters: vec!['"', '\''], |
| 1080 | + multiline_strings: true, |
| 1081 | + operators: vec![ |
| 1082 | + "==", "!=", "<=", ">=", "<", ">", "+=", "-=", "*=", "/=", "&=", |
| 1083 | + "and", "or", "not", "xor", "shl", "shr", "div", "mod", |
| 1084 | + "+", "-", "*", "/", "&", "|", "^", "~", "@", "$", |
| 1085 | + ], |
| 1086 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':'], |
| 1087 | + has_preprocessor: false, |
| 1088 | + case_sensitive: true, |
| 1089 | + } |
| 1090 | +} |
| 1091 | + |
| 1092 | +fn odin_def() -> LanguageDef { |
| 1093 | + LanguageDef { |
| 1094 | + name: "Odin", |
| 1095 | + keywords: [ |
| 1096 | + "align_of", "auto_cast", "bit_set", "break", "case", "cast", |
| 1097 | + "context", "continue", "defer", "distinct", "do", "dynamic", |
| 1098 | + "else", "enum", "fallthrough", "false", "for", "foreign", "if", |
| 1099 | + "import", "in", "map", "matrix", "nil", "not_in", "offset_of", |
| 1100 | + "or_else", "or_return", "package", "proc", "return", "size_of", |
| 1101 | + "struct", "switch", "transmute", "true", "type_of", "typeid", |
| 1102 | + "union", "using", "when", "where", |
| 1103 | + ].into_iter().collect(), |
| 1104 | + types: [ |
| 1105 | + "bool", "b8", "b16", "b32", "b64", "int", "i8", "i16", "i32", "i64", |
| 1106 | + "i128", "uint", "u8", "u16", "u32", "u64", "u128", "uintptr", |
| 1107 | + "f16", "f32", "f64", "complex32", "complex64", "complex128", |
| 1108 | + "quaternion64", "quaternion128", "quaternion256", "string", "cstring", |
| 1109 | + "rune", "rawptr", "typeid", "any", |
| 1110 | + ].into_iter().collect(), |
| 1111 | + line_comment: Some("//"), |
| 1112 | + block_comment_start: Some("/*"), |
| 1113 | + block_comment_end: Some("*/"), |
| 1114 | + string_delimiters: vec!['"', '\'', '`'], |
| 1115 | + multiline_strings: true, |
| 1116 | + operators: C_OPERATORS.to_vec(), |
| 1117 | + punctuation: C_PUNCTUATION.to_vec(), |
| 1118 | + has_preprocessor: false, |
| 1119 | + case_sensitive: true, |
| 1120 | + } |
| 1121 | +} |
| 1122 | + |
| 1123 | +fn v_def() -> LanguageDef { |
| 1124 | + LanguageDef { |
| 1125 | + name: "V", |
| 1126 | + keywords: [ |
| 1127 | + "as", "asm", "assert", "atomic", "break", "const", "continue", |
| 1128 | + "defer", "else", "enum", "false", "fn", "for", "go", "goto", "if", |
| 1129 | + "import", "in", "interface", "is", "isreftype", "lock", "match", |
| 1130 | + "module", "mut", "none", "or", "pub", "return", "rlock", "select", |
| 1131 | + "shared", "sizeof", "spawn", "static", "struct", "true", "type", |
| 1132 | + "typeof", "union", "unsafe", "volatile", "__offsetof", |
| 1133 | + ].into_iter().collect(), |
| 1134 | + types: [ |
| 1135 | + "bool", "string", "i8", "i16", "int", "i64", "i128", "u8", "u16", |
| 1136 | + "u32", "u64", "u128", "rune", "f32", "f64", "isize", "usize", |
| 1137 | + "voidptr", "any", "thread", |
| 1138 | + ].into_iter().collect(), |
| 1139 | + line_comment: Some("//"), |
| 1140 | + block_comment_start: Some("/*"), |
| 1141 | + block_comment_end: Some("*/"), |
| 1142 | + string_delimiters: vec!['"', '\'', '`'], |
| 1143 | + multiline_strings: true, |
| 1144 | + operators: C_OPERATORS.to_vec(), |
| 1145 | + punctuation: C_PUNCTUATION.to_vec(), |
| 1146 | + has_preprocessor: false, |
| 1147 | + case_sensitive: true, |
| 1148 | + } |
| 1149 | +} |
| 1150 | + |
| 1151 | +fn d_def() -> LanguageDef { |
| 1152 | + LanguageDef { |
| 1153 | + name: "D", |
| 1154 | + keywords: [ |
| 1155 | + "abstract", "alias", "align", "asm", "assert", "auto", "body", |
| 1156 | + "bool", "break", "case", "cast", "catch", "class", "const", |
| 1157 | + "continue", "debug", "default", "delegate", "delete", "deprecated", |
| 1158 | + "do", "else", "enum", "export", "extern", "false", "final", |
| 1159 | + "finally", "for", "foreach", "foreach_reverse", "function", "goto", |
| 1160 | + "if", "immutable", "import", "in", "inout", "interface", "invariant", |
| 1161 | + "is", "lazy", "mixin", "module", "new", "nothrow", "null", "out", |
| 1162 | + "override", "package", "pragma", "private", "protected", "public", |
| 1163 | + "pure", "ref", "return", "scope", "shared", "static", "struct", |
| 1164 | + "super", "switch", "synchronized", "template", "this", "throw", |
| 1165 | + "true", "try", "typeid", "typeof", "union", "unittest", "version", |
| 1166 | + "while", "with", "__FILE__", "__LINE__", "__gshared", "__traits", |
| 1167 | + ].into_iter().collect(), |
| 1168 | + types: [ |
| 1169 | + "void", "bool", "byte", "ubyte", "short", "ushort", "int", "uint", |
| 1170 | + "long", "ulong", "cent", "ucent", "float", "double", "real", |
| 1171 | + "ifloat", "idouble", "ireal", "cfloat", "cdouble", "creal", "char", |
| 1172 | + "wchar", "dchar", "string", "wstring", "dstring", "size_t", "ptrdiff_t", |
| 1173 | + ].into_iter().collect(), |
| 1174 | + line_comment: Some("//"), |
| 1175 | + block_comment_start: Some("/*"), |
| 1176 | + block_comment_end: Some("*/"), |
| 1177 | + string_delimiters: vec!['"', '\'', '`'], |
| 1178 | + multiline_strings: true, |
| 1179 | + operators: C_OPERATORS.to_vec(), |
| 1180 | + punctuation: C_PUNCTUATION.to_vec(), |
| 1181 | + has_preprocessor: false, |
| 1182 | + case_sensitive: true, |
| 1183 | + } |
| 1184 | +} |
| 1185 | + |
| 1186 | +fn bash_def() -> LanguageDef { |
| 1187 | + LanguageDef { |
| 1188 | + name: "Bash", |
| 1189 | + keywords: [ |
| 1190 | + "if", "then", "else", "elif", "fi", "case", "esac", "for", "while", |
| 1191 | + "until", "do", "done", "in", "function", "select", "time", "coproc", |
| 1192 | + "break", "continue", "return", "exit", "export", "readonly", "local", |
| 1193 | + "declare", "typeset", "unset", "shift", "source", "alias", "unalias", |
| 1194 | + "set", "shopt", "trap", "eval", "exec", "true", "false", |
| 1195 | + ].into_iter().collect(), |
| 1196 | + types: HashSet::new(), |
| 1197 | + line_comment: Some("#"), |
| 1198 | + block_comment_start: None, |
| 1199 | + block_comment_end: None, |
| 1200 | + string_delimiters: vec!['"', '\''], |
| 1201 | + multiline_strings: false, |
| 1202 | + operators: vec![ |
| 1203 | + "||", "&&", ";;", ";&", ";;&", "|&", "<<", ">>", "<&", ">&", "<>", |
| 1204 | + "==", "!=", "<=", ">=", "-eq", "-ne", "-lt", "-le", "-gt", "-ge", |
| 1205 | + "-z", "-n", "-e", "-f", "-d", "-r", "-w", "-x", |
| 1206 | + "|", "&", ";", "<", ">", "=", |
| 1207 | + ], |
| 1208 | + punctuation: vec!['{', '}', '(', ')', '[', ']', '$', '`'], |
| 1209 | + has_preprocessor: false, |
| 1210 | + case_sensitive: true, |
| 1211 | + } |
| 1212 | +} |
| 1213 | + |
| 1214 | +fn fish_def() -> LanguageDef { |
| 1215 | + LanguageDef { |
| 1216 | + name: "Fish", |
| 1217 | + keywords: [ |
| 1218 | + "and", "begin", "break", "builtin", "case", "command", "continue", |
| 1219 | + "else", "end", "exec", "for", "function", "if", "in", "not", "or", |
| 1220 | + "return", "set", "status", "switch", "test", "while", |
| 1221 | + ].into_iter().collect(), |
| 1222 | + types: HashSet::new(), |
| 1223 | + line_comment: Some("#"), |
| 1224 | + block_comment_start: None, |
| 1225 | + block_comment_end: None, |
| 1226 | + string_delimiters: vec!['"', '\''], |
| 1227 | + multiline_strings: false, |
| 1228 | + operators: vec![ |
| 1229 | + "||", "&&", ";", "|", "&", "<", ">", "=", |
| 1230 | + ], |
| 1231 | + punctuation: vec!['{', '}', '(', ')', '[', ']', '$'], |
| 1232 | + has_preprocessor: false, |
| 1233 | + case_sensitive: true, |
| 1234 | + } |
| 1235 | +} |
| 1236 | + |
| 1237 | +fn zsh_def() -> LanguageDef { |
| 1238 | + let mut def = bash_def(); |
| 1239 | + def.name = "Zsh"; |
| 1240 | + def.keywords.extend([ |
| 1241 | + "autoload", "bindkey", "compdef", "compadd", "compinit", "emulate", |
| 1242 | + "noglob", "zle", "zmodload", "zstyle", |
| 1243 | + ]); |
| 1244 | + def |
| 1245 | +} |
| 1246 | + |
| 1247 | +fn powershell_def() -> LanguageDef { |
| 1248 | + LanguageDef { |
| 1249 | + name: "PowerShell", |
| 1250 | + keywords: [ |
| 1251 | + "begin", "break", "catch", "class", "continue", "data", "define", |
| 1252 | + "do", "dynamicparam", "else", "elseif", "end", "enum", "exit", |
| 1253 | + "filter", "finally", "for", "foreach", "from", "function", "hidden", |
| 1254 | + "if", "in", "inlinescript", "param", "process", "return", "static", |
| 1255 | + "switch", "throw", "trap", "try", "until", "using", "var", "while", |
| 1256 | + "workflow", "parallel", "sequence", |
| 1257 | + ].into_iter().collect(), |
| 1258 | + types: [ |
| 1259 | + "bool", "byte", "char", "datetime", "decimal", "double", "float", |
| 1260 | + "int", "long", "object", "sbyte", "short", "single", "string", |
| 1261 | + "uint", "ulong", "ushort", "void", "array", "hashtable", "xml", |
| 1262 | + ].into_iter().collect(), |
| 1263 | + line_comment: Some("#"), |
| 1264 | + block_comment_start: Some("<#"), |
| 1265 | + block_comment_end: Some("#>"), |
| 1266 | + string_delimiters: vec!['"', '\''], |
| 1267 | + multiline_strings: true, |
| 1268 | + operators: vec![ |
| 1269 | + "-eq", "-ne", "-gt", "-ge", "-lt", "-le", "-like", "-notlike", |
| 1270 | + "-match", "-notmatch", "-contains", "-notcontains", "-in", "-notin", |
| 1271 | + "-replace", "-split", "-join", "-and", "-or", "-xor", "-not", "-band", |
| 1272 | + "-bor", "-bxor", "-bnot", "-shl", "-shr", |
| 1273 | + "=", "+=", "-=", "*=", "/=", "%=", "++", "--", |
| 1274 | + "|", "&", ";", "<", ">", |
| 1275 | + ], |
| 1276 | + punctuation: vec!['{', '}', '(', ')', '[', ']', '$', '@', ',', '.'], |
| 1277 | + has_preprocessor: false, |
| 1278 | + case_sensitive: false, |
| 1279 | + } |
| 1280 | +} |
| 1281 | + |
| 1282 | +fn sql_def() -> LanguageDef { |
| 1283 | + LanguageDef { |
| 1284 | + name: "SQL", |
| 1285 | + keywords: [ |
| 1286 | + "add", "all", "alter", "and", "any", "as", "asc", "backup", "between", |
| 1287 | + "by", "case", "check", "column", "constraint", "create", "database", |
| 1288 | + "default", "delete", "desc", "distinct", "drop", "exec", "exists", |
| 1289 | + "foreign", "from", "full", "group", "having", "in", "index", "inner", |
| 1290 | + "insert", "into", "is", "join", "key", "left", "like", "limit", |
| 1291 | + "not", "null", "on", "or", "order", "outer", "primary", "procedure", |
| 1292 | + "right", "rownum", "select", "set", "table", "top", "truncate", |
| 1293 | + "union", "unique", "update", "values", "view", "where", "with", |
| 1294 | + "true", "false", "begin", "end", "declare", "if", "else", "while", |
| 1295 | + "return", "commit", "rollback", "transaction", |
| 1296 | + ].into_iter().collect(), |
| 1297 | + types: [ |
| 1298 | + "int", "integer", "smallint", "bigint", "decimal", "numeric", "float", |
| 1299 | + "real", "double", "precision", "char", "varchar", "text", "nchar", |
| 1300 | + "nvarchar", "ntext", "binary", "varbinary", "image", "date", "time", |
| 1301 | + "datetime", "timestamp", "boolean", "bool", "bit", "money", "xml", |
| 1302 | + "json", "uuid", "serial", "bytea", "array", |
| 1303 | + ].into_iter().collect(), |
| 1304 | + line_comment: Some("--"), |
| 1305 | + block_comment_start: Some("/*"), |
| 1306 | + block_comment_end: Some("*/"), |
| 1307 | + string_delimiters: vec!['\''], |
| 1308 | + multiline_strings: false, |
| 1309 | + operators: vec![ |
| 1310 | + "<=", ">=", "<>", "!=", "||", "::", "->", "->>", |
| 1311 | + "+", "-", "*", "/", "%", "&", "|", "^", "~", "<", ">", "=", |
| 1312 | + ], |
| 1313 | + punctuation: vec!['(', ')', ',', '.', ';', ':'], |
| 1314 | + has_preprocessor: false, |
| 1315 | + case_sensitive: false, |
| 1316 | + } |
| 1317 | +} |
| 1318 | + |
| 1319 | +fn html_def() -> LanguageDef { |
| 1320 | + LanguageDef { |
| 1321 | + name: "HTML", |
| 1322 | + keywords: HashSet::new(), |
| 1323 | + types: HashSet::new(), |
| 1324 | + line_comment: None, |
| 1325 | + block_comment_start: Some("<!--"), |
| 1326 | + block_comment_end: Some("-->"), |
| 1327 | + string_delimiters: vec!['"', '\''], |
| 1328 | + multiline_strings: false, |
| 1329 | + operators: vec!["="], |
| 1330 | + punctuation: vec!['<', '>', '/', '!'], |
| 1331 | + has_preprocessor: false, |
| 1332 | + case_sensitive: false, |
| 1333 | + } |
| 1334 | +} |
| 1335 | + |
| 1336 | +fn css_def() -> LanguageDef { |
| 1337 | + LanguageDef { |
| 1338 | + name: "CSS", |
| 1339 | + keywords: [ |
| 1340 | + "!important", "@charset", "@font-face", "@import", "@keyframes", |
| 1341 | + "@media", "@namespace", "@page", "@supports", "@viewport", |
| 1342 | + ].into_iter().collect(), |
| 1343 | + types: HashSet::new(), |
| 1344 | + line_comment: None, |
| 1345 | + block_comment_start: Some("/*"), |
| 1346 | + block_comment_end: Some("*/"), |
| 1347 | + string_delimiters: vec!['"', '\''], |
| 1348 | + multiline_strings: false, |
| 1349 | + operators: vec![":", ";", ",", "+", ">", "~", "*"], |
| 1350 | + punctuation: vec!['{', '}', '(', ')', '[', ']', '.', '#'], |
| 1351 | + has_preprocessor: false, |
| 1352 | + case_sensitive: false, |
| 1353 | + } |
| 1354 | +} |
| 1355 | + |
| 1356 | +fn json_def() -> LanguageDef { |
| 1357 | + LanguageDef { |
| 1358 | + name: "JSON", |
| 1359 | + keywords: ["true", "false", "null"].into_iter().collect(), |
| 1360 | + types: HashSet::new(), |
| 1361 | + line_comment: None, |
| 1362 | + block_comment_start: None, |
| 1363 | + block_comment_end: None, |
| 1364 | + string_delimiters: vec!['"'], |
| 1365 | + multiline_strings: false, |
| 1366 | + operators: vec![":"], |
| 1367 | + punctuation: vec!['{', '}', '[', ']', ','], |
| 1368 | + has_preprocessor: false, |
| 1369 | + case_sensitive: true, |
| 1370 | + } |
| 1371 | +} |
| 1372 | + |
| 1373 | +fn yaml_def() -> LanguageDef { |
| 1374 | + LanguageDef { |
| 1375 | + name: "YAML", |
| 1376 | + keywords: [ |
| 1377 | + "true", "false", "null", "yes", "no", "on", "off", "~", |
| 1378 | + ].into_iter().collect(), |
| 1379 | + types: HashSet::new(), |
| 1380 | + line_comment: Some("#"), |
| 1381 | + block_comment_start: None, |
| 1382 | + block_comment_end: None, |
| 1383 | + string_delimiters: vec!['"', '\''], |
| 1384 | + multiline_strings: true, |
| 1385 | + operators: vec![":", "-", ">", "|", "&", "*", "!"], |
| 1386 | + punctuation: vec!['{', '}', '[', ']', ','], |
| 1387 | + has_preprocessor: false, |
| 1388 | + case_sensitive: true, |
| 1389 | + } |
| 1390 | +} |
| 1391 | + |
| 1392 | +fn toml_def() -> LanguageDef { |
| 1393 | + LanguageDef { |
| 1394 | + name: "TOML", |
| 1395 | + keywords: ["true", "false"].into_iter().collect(), |
| 1396 | + types: HashSet::new(), |
| 1397 | + line_comment: Some("#"), |
| 1398 | + block_comment_start: None, |
| 1399 | + block_comment_end: None, |
| 1400 | + string_delimiters: vec!['"', '\''], |
| 1401 | + multiline_strings: true, |
| 1402 | + operators: vec!["="], |
| 1403 | + punctuation: vec!['{', '}', '[', ']', ',', '.'], |
| 1404 | + has_preprocessor: false, |
| 1405 | + case_sensitive: true, |
| 1406 | + } |
| 1407 | +} |
| 1408 | + |
| 1409 | +fn xml_def() -> LanguageDef { |
| 1410 | + LanguageDef { |
| 1411 | + name: "XML", |
| 1412 | + keywords: HashSet::new(), |
| 1413 | + types: HashSet::new(), |
| 1414 | + line_comment: None, |
| 1415 | + block_comment_start: Some("<!--"), |
| 1416 | + block_comment_end: Some("-->"), |
| 1417 | + string_delimiters: vec!['"', '\''], |
| 1418 | + multiline_strings: false, |
| 1419 | + operators: vec!["="], |
| 1420 | + punctuation: vec!['<', '>', '/', '?', '!'], |
| 1421 | + has_preprocessor: true, // <?xml ... ?> |
| 1422 | + case_sensitive: true, |
| 1423 | + } |
| 1424 | +} |
| 1425 | + |
| 1426 | +fn markdown_def() -> LanguageDef { |
| 1427 | + LanguageDef { |
| 1428 | + name: "Markdown", |
| 1429 | + keywords: HashSet::new(), |
| 1430 | + types: HashSet::new(), |
| 1431 | + line_comment: None, |
| 1432 | + block_comment_start: None, |
| 1433 | + block_comment_end: None, |
| 1434 | + string_delimiters: vec![], |
| 1435 | + multiline_strings: false, |
| 1436 | + operators: vec!["#", "*", "-", "+", ">", "`", "~", "_", "[", "]", "(", ")"], |
| 1437 | + punctuation: vec![], |
| 1438 | + has_preprocessor: false, |
| 1439 | + case_sensitive: true, |
| 1440 | + } |
| 1441 | +} |
| 1442 | + |
| 1443 | +fn makefile_def() -> LanguageDef { |
| 1444 | + LanguageDef { |
| 1445 | + name: "Makefile", |
| 1446 | + keywords: [ |
| 1447 | + "ifeq", "ifneq", "ifdef", "ifndef", "else", "endif", "define", |
| 1448 | + "endef", "export", "unexport", "override", "include", "-include", |
| 1449 | + "sinclude", "vpath", ".PHONY", ".SUFFIXES", ".DEFAULT", ".PRECIOUS", |
| 1450 | + ".INTERMEDIATE", ".SECONDARY", ".SECONDEXPANSION", ".DELETE_ON_ERROR", |
| 1451 | + ".IGNORE", ".LOW_RESOLUTION_TIME", ".SILENT", ".EXPORT_ALL_VARIABLES", |
| 1452 | + ".NOTPARALLEL", ".ONESHELL", ".POSIX", |
| 1453 | + ].into_iter().collect(), |
| 1454 | + types: HashSet::new(), |
| 1455 | + line_comment: Some("#"), |
| 1456 | + block_comment_start: None, |
| 1457 | + block_comment_end: None, |
| 1458 | + string_delimiters: vec!['"', '\''], |
| 1459 | + multiline_strings: false, |
| 1460 | + operators: vec!["=", ":=", "?=", "+=", "::=", "!=", ":", "|", ";", "@", "-"], |
| 1461 | + punctuation: vec!['$', '(', ')', '{', '}', '%', '*', '?', '<', '>'], |
| 1462 | + has_preprocessor: false, |
| 1463 | + case_sensitive: true, |
| 1464 | + } |
| 1465 | +} |
| 1466 | + |
| 1467 | +fn dockerfile_def() -> LanguageDef { |
| 1468 | + LanguageDef { |
| 1469 | + name: "Dockerfile", |
| 1470 | + keywords: [ |
| 1471 | + "ADD", "ARG", "CMD", "COPY", "ENTRYPOINT", "ENV", "EXPOSE", "FROM", |
| 1472 | + "HEALTHCHECK", "LABEL", "MAINTAINER", "ONBUILD", "RUN", "SHELL", |
| 1473 | + "STOPSIGNAL", "USER", "VOLUME", "WORKDIR", "AS", |
| 1474 | + ].into_iter().collect(), |
| 1475 | + types: HashSet::new(), |
| 1476 | + line_comment: Some("#"), |
| 1477 | + block_comment_start: None, |
| 1478 | + block_comment_end: None, |
| 1479 | + string_delimiters: vec!['"', '\''], |
| 1480 | + multiline_strings: false, |
| 1481 | + operators: vec!["=", "\\"], |
| 1482 | + punctuation: vec!['[', ']', '{', '}', '$'], |
| 1483 | + has_preprocessor: false, |
| 1484 | + case_sensitive: false, |
| 1485 | + } |
| 1486 | +} |
| 1487 | + |
| 1488 | +fn terraform_def() -> LanguageDef { |
| 1489 | + LanguageDef { |
| 1490 | + name: "Terraform", |
| 1491 | + keywords: [ |
| 1492 | + "data", "locals", "module", "output", "provider", "resource", |
| 1493 | + "terraform", "variable", "for", "for_each", "if", "in", "dynamic", |
| 1494 | + "content", "count", "depends_on", "lifecycle", "provisioner", |
| 1495 | + "connection", "null_resource", "true", "false", "null", |
| 1496 | + ].into_iter().collect(), |
| 1497 | + types: [ |
| 1498 | + "string", "number", "bool", "list", "map", "set", "object", "tuple", |
| 1499 | + "any", |
| 1500 | + ].into_iter().collect(), |
| 1501 | + line_comment: Some("#"), |
| 1502 | + block_comment_start: Some("/*"), |
| 1503 | + block_comment_end: Some("*/"), |
| 1504 | + string_delimiters: vec!['"'], |
| 1505 | + multiline_strings: true, |
| 1506 | + operators: vec!["=", "=>", "==", "!=", "<=", ">=", "&&", "||", "!", "?", ":"], |
| 1507 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ',', '.'], |
| 1508 | + has_preprocessor: false, |
| 1509 | + case_sensitive: true, |
| 1510 | + } |
| 1511 | +} |
| 1512 | + |
| 1513 | +fn nix_def() -> LanguageDef { |
| 1514 | + LanguageDef { |
| 1515 | + name: "Nix", |
| 1516 | + keywords: [ |
| 1517 | + "assert", "else", "if", "import", "in", "inherit", "let", "or", |
| 1518 | + "rec", "then", "with", "true", "false", "null", |
| 1519 | + ].into_iter().collect(), |
| 1520 | + types: HashSet::new(), |
| 1521 | + line_comment: Some("#"), |
| 1522 | + block_comment_start: Some("/*"), |
| 1523 | + block_comment_end: Some("*/"), |
| 1524 | + string_delimiters: vec!['"'], |
| 1525 | + multiline_strings: true, |
| 1526 | + operators: vec!["=", "++", "//", "->", ":", "?", "@", "==", "!=", "<=", ">=", "&&", "||", "!"], |
| 1527 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ',', '.', ';'], |
| 1528 | + has_preprocessor: false, |
| 1529 | + case_sensitive: true, |
| 1530 | + } |
| 1531 | +} |
| 1532 | + |
| 1533 | +fn ocaml_def() -> LanguageDef { |
| 1534 | + LanguageDef { |
| 1535 | + name: "OCaml", |
| 1536 | + keywords: [ |
| 1537 | + "and", "as", "assert", "asr", "begin", "class", "constraint", "do", |
| 1538 | + "done", "downto", "else", "end", "exception", "external", "false", |
| 1539 | + "for", "fun", "function", "functor", "if", "in", "include", |
| 1540 | + "inherit", "initializer", "land", "lazy", "let", "lor", "lsl", |
| 1541 | + "lsr", "lxor", "match", "method", "mod", "module", "mutable", "new", |
| 1542 | + "nonrec", "object", "of", "open", "or", "private", "rec", "sig", |
| 1543 | + "struct", "then", "to", "true", "try", "type", "val", "virtual", |
| 1544 | + "when", "while", "with", |
| 1545 | + ].into_iter().collect(), |
| 1546 | + types: [ |
| 1547 | + "int", "float", "bool", "char", "string", "bytes", "unit", "exn", |
| 1548 | + "array", "list", "option", "ref", "lazy_t", |
| 1549 | + ].into_iter().collect(), |
| 1550 | + line_comment: None, |
| 1551 | + block_comment_start: Some("(*"), |
| 1552 | + block_comment_end: Some("*)"), |
| 1553 | + string_delimiters: vec!['"'], |
| 1554 | + multiline_strings: false, |
| 1555 | + operators: vec![ |
| 1556 | + "->", "<-", "|>", "@@", "::", "@", "^", "||", "&&", "==", "!=", |
| 1557 | + "<=", ">=", "<>", ":=", "++", "--", |
| 1558 | + "+", "-", "*", "/", "~", "!", "<", ">", "|", "&", "=", |
| 1559 | + ], |
| 1560 | + punctuation: vec!['{', '}', '(', ')', '[', ']', ';', ',', '.', ':'], |
| 1561 | + has_preprocessor: false, |
| 1562 | + case_sensitive: true, |
| 1563 | + } |
| 1564 | +} |
| 1565 | + |
| 1566 | +fn fsharp_def() -> LanguageDef { |
| 1567 | + let mut def = ocaml_def(); |
| 1568 | + def.name = "F#"; |
| 1569 | + def.keywords.extend([ |
| 1570 | + "abstract", "base", "default", "delegate", "elif", "elif", "fixed", |
| 1571 | + "global", "inline", "interface", "internal", "member", "namespace", |
| 1572 | + "null", "override", "public", "return", "static", "upcast", "use", |
| 1573 | + "void", "yield", |
| 1574 | + ]); |
| 1575 | + def.line_comment = Some("//"); |
| 1576 | + def |
| 1577 | +} |
| 1578 | + |
| 1579 | +fn dart_def() -> LanguageDef { |
| 1580 | + LanguageDef { |
| 1581 | + name: "Dart", |
| 1582 | + keywords: [ |
| 1583 | + "abstract", "as", "assert", "async", "await", "break", "case", |
| 1584 | + "catch", "class", "const", "continue", "covariant", "default", |
| 1585 | + "deferred", "do", "dynamic", "else", "enum", "export", "extends", |
| 1586 | + "extension", "external", "factory", "false", "final", "finally", |
| 1587 | + "for", "Function", "get", "hide", "if", "implements", "import", |
| 1588 | + "in", "interface", "is", "late", "library", "mixin", "new", "null", |
| 1589 | + "on", "operator", "part", "required", "rethrow", "return", "set", |
| 1590 | + "show", "static", "super", "switch", "sync", "this", "throw", |
| 1591 | + "true", "try", "typedef", "var", "void", "while", "with", "yield", |
| 1592 | + ].into_iter().collect(), |
| 1593 | + types: [ |
| 1594 | + "bool", "double", "dynamic", "int", "List", "Map", "Never", "Null", |
| 1595 | + "num", "Object", "Set", "String", "Symbol", "Type", "void", |
| 1596 | + "Future", "Stream", "Iterable", "Iterator", |
| 1597 | + ].into_iter().collect(), |
| 1598 | + line_comment: Some("//"), |
| 1599 | + block_comment_start: Some("/*"), |
| 1600 | + block_comment_end: Some("*/"), |
| 1601 | + string_delimiters: vec!['"', '\''], |
| 1602 | + multiline_strings: true, |
| 1603 | + operators: C_OPERATORS.to_vec(), |
| 1604 | + punctuation: C_PUNCTUATION.to_vec(), |
| 1605 | + has_preprocessor: false, |
| 1606 | + case_sensitive: true, |
| 1607 | + } |
| 1608 | +} |
| 1609 | + |
| 1610 | +fn groovy_def() -> LanguageDef { |
| 1611 | + let mut def = java_def(); |
| 1612 | + def.name = "Groovy"; |
| 1613 | + def.keywords.extend([ |
| 1614 | + "as", "def", "in", "trait", |
| 1615 | + ]); |
| 1616 | + def.multiline_strings = true; |
| 1617 | + def |
| 1618 | +} |