From 47d309aa6682c8a02a15bec70afb69910c95343c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jozef=20Steinh=C3=BCbl?= Date: Sun, 4 Aug 2024 21:13:03 +0200 Subject: [PATCH] feat: regex support --- Cargo.lock | 39 ++++++ assets/languages.json | 270 +++++++++++++++++++++--------------------- lsp/Cargo.toml | 1 + lsp/src/languages.rs | 25 +++- 4 files changed, 197 insertions(+), 138 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c746bec..e573d5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "anyhow" version = "1.0.86" @@ -120,6 +129,7 @@ dependencies = [ "discord-rich-presence", "git2", "lazy_static", + "regex", "serde_json", "tokio", "tower-lsp", @@ -580,6 +590,35 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "regex" +version = "1.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + [[package]] name = "rustc-demangle" version = "0.1.24" diff --git a/assets/languages.json b/assets/languages.json index 63097dc..dc96071 100644 --- a/assets/languages.json +++ b/assets/languages.json @@ -2,18 +2,18 @@ "nodemon.json": "nodemon", "package.json": "npm", "turbo.json": "turbo", - "/(vercel|now)\\.json/i": "vercel", - "/(?i)\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?\\$){2}/": "prettier", - "/\\.eslint((rc|ignore)|(\\.(json|js))?$){2}/i": "eslint", - "/\\.(now|vercel)ignore/i": "vercel", - "/\\prettier.config.js/i": "prettier", - "/vue.config\\.(js|ts)/i": "vueconfig", - "/vite.config\\.(js|ts)/i": "viteconfig", - "/vitest.config\\.(js|ts|mjs)/i": "vitestconfig", - "/jest.config\\.(js|ts)/i": "jest", - "/tailwind\\.config\\.(js|cjs|mjs|ts|cts|mts)/i": "tailwind", - "/gatsby-(browser|node|ssr|config)\\.js/i": "gatsbyjs", - "/webpack(\\.dev|\\.development|\\.prod|\\.production)?\\.config(\\.babel)?\\.(js|jsx|coffee|ts|json|json5|yaml|yml)/i": "webpack", + "regex:(vercel|now)\\.json": "vercel", + "regex:(?i)\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?)$": "prettier", + "regex:\\.eslint((rc|ignore)|(\\.(json|js))?)$": "eslint", + "regex:\\.(now|vercel)ignore$": "vercel", + "regex:prettier\\.config\\.js$": "prettier", + "regex:vue\\.config\\.(js|ts)$": "vueconfig", + "regex:vite\\.config\\.(js|ts)$": "viteconfig", + "regex:vitest\\.config\\.(js|ts|mjs)$": "vitestconfig", + "regex:jest\\.config\\.(js|ts)$": "jest", + "regex:tailwind\\.config\\.(js|cjs|mjs|ts|cts|mts)$": "tailwind", + "regex:gatsby-(browser|node|ssr|config)\\.js$": "gatsbyjs", + "regex:webpack(\\.dev|\\.development|\\.prod|\\.production)?\\.config(\\.babel)?\\.(js|jsx|coffee|ts|json|json5|yaml|yml)$": "webpack", "babel.config.js": "babel", ".ahk": "ahk", ".ahkl": "ahk", @@ -21,10 +21,10 @@ ".astro.config.mjs": "astroconfig", "androidmanifest.xml": "android", ".bp": "android", - "/^angular[^.]*\\.js$/i": "angular", + "regex:^angular[^.]*\\.js$": "angular", ".ng": "angular", ".applescript": "applescript", - "/(\\.)?appveyor\\.yml/i": "appveyor", + "regex:(\\.)?appveyor\\.yml$": "appveyor", ".ino": "arduino", ".swf": "as", ".as": "as", @@ -37,32 +37,32 @@ ".asmx": "asp", ".aspx": "asp", ".axd": "asp", - "/\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$/i": "assembly", + "regex:\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$": "assembly", ".agc": "assembly", ".ko": "assembly", ".kv": "kivy", ".ks": "kag-script", ".tjs": "kirikiri-tpv-javascript", ".lst": "assembly", - "/\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i": "assembly", + "regex:\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$": "assembly", ".d-objdump": "assembly", - "/\\.gcode|\\.gco/i": "assembly", - "/\\.rpy[bc]$/i": "assembly", - "/\\.py[co]$/i": "assembly", + "regex:\\.gcode|\\.gco$": "assembly", + "regex:\\.rpy[bc]$": "assembly", + "regex:\\.py[co]$": "assembly", ".swp": "assembly", ".DS_Store": "assembly", ".au3": "autoit", - "/\\.babelrc/i": "babel", + "regex:\\.babelrc$": "babel", ".bat": "bat", ".batch": "bat", ".cmd": "bat", - "/\\.(exe|com|msi)$/i": "bat", + "regex:\\.(exe|com|msi)$": "bat", ".reg": "bat", - "/^(BUILD)|(WORKSPACE)|(\\.bzl)|(\\.bazel(rc)?)|(\\.s(tar|ky))$/": "bazel", - "/^(\\.bowerrc|bower\\.json|Bowerfile)$/i": "bower", - "/\\.bf?$/i": "brainfuck", - "/\\.c$/i": "c", - "/(cargo.toml|cargo.lock)/i": "cargo", + "regex:^(BUILD|WORKSPACE|\\.bzl|\\.bazel(rc)?|\\.s(tar|ky))$": "bazel", + "regex:^(\\.bowerrc|bower\\.json|Bowerfile)$": "bower", + "regex:\\.bf?$": "brainfuck", + "regex:\\.c$": "c", + "regex:(cargo\\.toml|cargo\\.lock)$": "cargo", ".casc": "casc", ".cas": "casc", ".ces": "citrinescript", @@ -74,32 +74,32 @@ ".cljc": "clojure", ".cljx": "clojure", ".hic": "clojure", - "/\\.cljs(cm)?$/i": "clojure", + "regex:\\.cljs(cm)?$": "clojure", ".cmake": "cmake", - "/^CMakeLists\\.txt$/": "cmake", - "/\\.codeclimate\\.(yml|json)/i": "codeclimate", + "regex:^CMakeLists\\.txt$": "cmake", + "regex:\\.codeclimate\\.(yml|json)$": "codeclimate", ".cbl": "cobol", ".cob": "cobol", ".coffee": "coffee", ".cjsx": "coffee", ".coffee.ecr": "coffee", - "/contenthook\\.config\\.(ts|cjs|mjs|js)$/i": "contenthook", + "regex:contenthook\\.config\\.(ts|cjs|mjs|js)$": "contenthook", ".coffee.erb": "coffee", ".litcoffee": "coffee", ".iced": "coffee", ".cos": "cosmo", ".⭐": "cosmo", - "/\\.c[+px]{2}$|\\.cc$/i": "cpp", - "/\\.h[+px]{2}$/i": "cpp", - "/\\.[it]pp$/i": "cpp", - "/\\.(tcc|inl)$/i": "cpp", + "regex:\\.c[+px]{2}$|\\.cc$": "cpp", + "regex:\\.h[+px]{2}$": "cpp", + "regex:\\.[it]pp$": "cpp", + "regex:\\.(tcc|inl)$": "cpp", ".cats": "cpp", ".idc": "cpp", ".w": "cpp", ".nc": "cpp", ".upc": "cpp", ".xpm": "cpp", - "/\\.e?cr$/i": "crystal", + "regex:\\.e?cr$": "crystal", ".cs": "csharp", ".csx": "csharp", ".cshtml": "razor", @@ -108,7 +108,7 @@ ".css.map": "cssmap", ".cu": "cuda", ".pyx": "cython", - "/\\.di?$/i": "d", + "regex:\\.di?$": "d", ".dart": "dart", ".dfm": "delphi", ".dpr": "delphi", @@ -116,32 +116,32 @@ ".dm": "dm", ".dme": "dm", ".dmm": "dm", - "/^(Dockerfile|docker-compose)|\\.docker(file|ignore)$/i": "docker", - "/^docker-sync\\.yml$/i": "docker", + "regex:^(Dockerfile|docker-compose|\\.docker(file|ignore))$": "docker", + "regex:^docker-sync\\.yml$": "docker", ".editorconfig": "editorconfig", ".ejs": "ejs", ".ex": "elixir", - "/\\.(exs|l?eex)$/i": "elixir", - "/^mix\\.(exs?|lock)$/i": "elixir", + "regex:\\.(exs|l?eex)$": "elixir", + "regex:^mix\\.(exs?|lock)$": "elixir", ".elm": "elm", ".env": "env", ".erl": "erlang", - "/\\.([fF])(03|08|18|90|95)$/i": "fortran", + "regex:\\.([fF])(03|08|18|90|95)$": "fortran", ".beam": "erlang", ".hrl": "erlang", ".xrl": "erlang", ".yrl": "erlang", ".app.src": "erlang", - "/^Emakefile$/": "erlang", - "/^rebar(\\.config)?\\.lock$/i": "erlang", - "/(\\.firebaserc|firebase\\.json)/i": "firebase", + "regex:^Emakefile$": "erlang", + "regex:^rebar(\\.config)?\\.lock$": "erlang", + "regex:(\\.firebaserc|firebase\\.json)$": "firebase", ".flowconfig": "flowconfig", ".fs": "fsharp", ".fsi": "fsharp", ".fsscript": "fsharp", ".fsx": "fsharp", - "/^Gemfile(\\.lock)?$/i": "gemfile", - "/^\\.git|^\\.keep$|\\.mailmap$/i": "git", + "regex:^Gemfile(\\.lock)?$": "gemfile", + "regex:^\\.git|^\\.keep$|\\.mailmap$": "git", ".gml": "gml", ".gleam": "gleam", ".go": "go", @@ -149,15 +149,15 @@ ".gr": "grain", ".gradle": "gradle", "gradlew": "gradle", - "/\\.(g|c)sc$/i": "gamescript", + "regex:\\.(g|c)sc$": "gamescript", ".gql": "graphql", ".graphql": "graphql", ".groovy": "groovy", - "/\\.gv?y$/i": "groovy", + "regex:\\.gv?y$": "groovy", ".gsh": "groovy", - "/[Gg]runtfile\\.(js|coffee)/i": "gruntfile", + "regex:[Gg]runtfile\\.(js|coffee)$": "gruntfile", "gulpfile.js": "gulp", - "/\\.(hbs|handlebars|(mu)?stache)$/i": "handlebars", + "regex:\\.(hbs|handlebars|(mu)?stache)$": "handlebars", ".prg": "harbour", ".ha": "hare", ".hbp": "harbour", @@ -169,15 +169,15 @@ ".c2hs": "haskell", ".c3": "c3", ".lhs": "haskell", - "/\\.(hlsl|cginc|cg|shader|fx)$/i": "hlsl", - "/\\.(glsl|vert|frag|geom|tesc|tese|comp)$/i": "glsl", - "/\\.hx(ml)?$/i": "haxe", - "/^procfile/i": "heroku", + "regex:\\.(hlsl|cginc|cg|shader|fx)$": "hlsl", + "regex:\\.(glsl|vert|frag|geom|tesc|tese|comp)$": "glsl", + "regex:\\.hx(ml)?$": "haxe", + "^procfile$": "heroku", ".heex": "heex", "heroku.yml": "heroku", ".hjson": "hjson", ".hc": "holyc", - "/\\.x?html?$/i": "html", + "regex:\\.x?html?$": "html", ".http": "http", ".rest": "http", ".jar": "jar", @@ -193,30 +193,30 @@ ".jsonc": "json", ".jsx": "jsx", ".jule": "jule", - "/\\.(jil|jl)/i": "julia", + "regex:\\.(jil|jl)$": "julia", ".ipynb": "jupyter", - "/\\.kt[ms]?$/i": "kotlin", + "regex:\\.kt[ms]?$": "kotlin", ".less": "less", - "/\\.l(i?sp)?$/i": "lisp", - "/\\.n[ly]$/i": "lisp", + "regex:\\.l(i?sp)?$": "lisp", + "regex:\\.n[ly]$": "lisp", ".podsl": "lisp", - "/\\.s([s]|(cm)|(exp))$/i": "lisp", + "regex:\\.s([s]|(cm)|(exp))$": "lisp", ".ls": "livescript", ".log": "log", - "/\\.([w]|(pd_))?lua$/i": "lua", - "/\\.luau$/i": "luau", - "/\\.rbx(?:lx|l|m|s)?$/i": "luau", - "/^Makefile/": "makefile", - "/^mk\\.config$/": "makefile", - "/\\.(mk|mak|make)$/i": "makefile", - "/^BSDmakefile$/i": "makefile", - "/^GNUmakefile$/i": "makefile", - "/^makefile\\.sco$/i": "makefile", - "/^Kbuild$/": "makefile", - "/^makefile$/": "makefile", - "/^mkfile$/i": "makefile", - "/^\\.?qmake$/i": "makefile", - "/\\.(geo|topo)$/i": "manifest", + "regex:\\.([w]|(pd_))?lua$": "lua", + "regex:\\.luau$": "luau", + "regex:\\.rbx(?:lx|l|m|s)?$": "luau", + "^Makefile$": "makefile", + "^mk\\.config$": "makefile", + "regex:\\.(mk|mak|make)$": "makefile", + "regex:^BSDmakefile$": "makefile", + "regex:^GNUmakefile$": "makefile", + "regex:^makefile\\.sco$": "makefile", + "regex:^Kbuild$": "makefile", + "regex:^makefile$": "makefile", + "regex:^mkfile$": "makefile", + "regex:^\\.?qmake$": "makefile", + "regex:\\.(geo|topo)$": "manifest", ".cson": "manifest", ".json5": "manifest", ".ndjson": "manifest", @@ -226,7 +226,7 @@ ".proto": "manifest", ".pytb": "manifest", ".pydeps": "manifest", - "/\\.pot?$/i": "manifest", + "regex:\\.pot?$": "manifest", ".ejson": "manifest", ".edn": "manifest", ".eam.fs": "manifest", @@ -238,18 +238,18 @@ ".sol": "solidity", ".syntax": "manifest", ".webmanifest": "manifest", - "/^pkginfo$/": "manifest", + "regex:^pkginfo$": "manifest", ".moon": "moonscript", - "/^mime\\.types$/i": "manifest", - "/^METADATA\\.pb$/": "manifest", - "/[\\/\\\\](?:magic[\\/\\\\]Magdir|file[\\/\\\\]magic)[\\/\\\\][-.\\w]+$/i": "manifest", - "/(\\\\|\\/)dev[-\\w]+\\1(?:[^\\\\\\/]+\\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\\.in)?$/": "manifest", + "regex:^mime\\.types$": "manifest", + "regex:^METADATA\\.pb$": "manifest", + "regex:/\\\\[/\\\\][-.\\w]+$": "manifest", + "regex:([/\\\\]|\\/)dev[-\\w]+\\1(?:[^/\\\\]+\\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\\.in)?$": "manifest", "lib/icons/.icondb.js": "manifest", - "/\\.git[\\/\\\\](.*[\\/\\\\])?(HEAD|ORIG_HEAD|packed-refs|logs[\\/\\\\](.+[\\/\\\\])?[^\\/\\\\]+)$/": "manifest", - "/\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$/i": "markdown", + "regex:\\.git/\\\\?(HEAD|ORIG_HEAD|packed-refs|logs/\\\\?[^/\\\\]+)$": "manifest", + "regex:\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$": "markdown", ".mdx": "markdownx", ".marko": "marko", - "/\\.m$/i": "matlab", + "regex:\\.m$": "matlab", ".nim": "nim", ".nims": "nim", ".nimble": "nim", @@ -257,37 +257,37 @@ ".npmrc": "npm", ".npmignore": "npm", ".nut": "squirrel", - "/\\.mm?$/i": "objective-c", + "regex:\\.mm?$": "objective-c", ".pch": "objective-c", ".x": "objective-c", - "/\\.eliom[i]?$/i": "ocaml", - "/\\.ml[4lyi]?$/i": "ocaml", + "regex:\\.eliom[i]?$": "ocaml", + "regex:\\.ml[4lyi]?$": "ocaml", ".mt": "metal", ".odin": "odin", ".onyx": "onyx", - "/\\.pas(cal)?$/i": "pascal", + "regex:\\.pas(cal)?$": "pascal", ".lpr": "pascal", ".inc": "pawn", ".sma": "pawn", - "/\\.p(wn)?$/i": "pawn", + "regex:\\.p(wn)?$": "pawn", ".sp": "sourcepawn", - "/\\.p(er)?l$/i": "perl", + "regex:\\.p(er)?l$": "perl", ".al": "perl", - "/\\.p([hm]|(lx))$/i": "perl", - "/\\.(psgi|xs)$/i": "perl", + "regex:\\.p([hm]|lx)$": "perl", + "regex:\\.(psgi|xs)$": "perl", ".pl6": "perl", - "/\\.[tp]6$|\\.6pl$/i": "perl", - "/\\.(pm6|p6m)$/i": "perl", + "regex:\\.[tp]6$|\\.6pl$": "perl", + "regex:\\.(pm6|p6m)$": "perl", ".6pm": "perl", ".nqp": "perl", ".p6l": "perl", ".pod6": "perl", - "/^Rexfile$/": "perl", - "/\\.php([st\\d]|_cs)?$/i": "php", - "/^Phakefile/": "php", + "regex:^Rexfile$": "perl", + "regex:\\.php([st\\d]|_cs)?$": "php", + "^Phakefile$": "php", ".pony": "ponylang", ".pcss": "postcss", - "/\\.ps[md]?1$/i": "powershell", + "regex:\\.ps[md]?1$": "powershell", ".ps1xml": "powershell", ".prettierignore": "prettier", "prisma.yml": "prisma", @@ -298,48 +298,48 @@ ".ipy": "python", ".isolate": "python", ".pep": "python", - "/\\.gypi?$/i": "python", + "regex:\\.gypi?$": "python", ".pyde": "python", - "/\\.py([wi3tp]|(de))?$/i": "python", + "regex:\\.py([wi3tp]|de)?$": "python", ".tac": "python", ".wsgi": "python", ".xpy": "python", ".rpy": "python", - "/\\.?(pypirc|pythonrc|python-venv)$/i": "python", - "/^(SConstruct|SConscript)$/": "python", - "/^(Snakefile|WATCHLISTS)$/": "python", - "/^wscript$/": "python", - "/\\.(r|Rprofile|rsx|rd)$/i": "r", + "regex:\\.?(pypirc|pythonrc|python-venv)$": "python", + "regex:^(SConstruct|SConscript)$": "python", + "regex:^(Snakefile|WATCHLISTS)$": "python", + "regex:^wscript$": "python", + "regex:\\.(r|Rprofile|rsx|rd)$": "r", ".razor": "razor", - "/\\.res?i?$/i": "reasonml", + "regex:\\.res?i?$": "reasonml", ".rst": "restructuredtext", - "/\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$/i": "ruby", - "/^\\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$/i": "ruby", - "/^(Appraisals|(Rake|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\\.lock)?)$/": "ruby", - "/\\.(jbuilder|rbuild|rb[wx]|builder)$/i": "ruby", - "/^rails$/": "ruby", + "regex:\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$": "ruby", + "regex:^\\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$": "ruby", + "regex:^(Appraisals|(Rake|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\\.lock)?)$": "ruby", + "regex:\\.(jbuilder|rbuild|rb[wx]|builder)$": "ruby", + "regex:^rails$": "ruby", ".watchr": "ruby", ".rs": "rust", - "/\\.(sc|scala)$/i": "scala", - "/\\.s[ac]ss$/i": "scss", - "/\\.(sh|rc|bats|bash|tool|install|command)$/i": "shell", - "/^(\\.?bash(rc|[-_]?(profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$/i": "shell", - "/\\.(ksh|mksh|pdksh)$/i": "shell", + "regex:\\.(sc|scala)$": "scala", + "regex:\\.s[ac]ss$": "scss", + "regex:\\.(sh|rc|bats|bash|tool|install|command)$": "shell", + "regex:^(\\.?bash(rc|[-_]?(profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$": "shell", + "regex:\\.(ksh|mksh|pdksh)$": "shell", ".sh-session": "shell", - "/\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$/i": "shell", - "/\\.fish$|^\\.fishrc$/i": "shell", - "/^\\.?(login|profile)$/": "shell", + "regex:\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$": "shell", + "regex:\\.fish$|^\\.fishrc$": "shell", + "regex:^\\.?(login|profile)$": "shell", ".inputrc": "shell", ".tmux": "shell", - "/^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$/": "shell", - "/^\\/(private\\/)?etc\\/([^\\/]+\\/)*(profile$|nanorc$|rc\\.|csh\\.)/i": "shell", - "/^\\.?cshrc$/i": "shell", + "regex:^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$": "shell", + "regex:^/(private/)?etc/([^/]+/)*(profile$|nanorc$|rc\\.|csh\\.)$": "shell", + "regex:^\\.?cshrc$": "shell", ".profile": "shell", ".tcsh": "shell", ".csh": "shell", ".sk": "skript", ".sqf": "sqf", - "/\\.(my)?sql$/i": "sql", + "regex:\\.(my)?sql$": "sql", ".ddl": "sql", ".udf": "sql", ".hql": "sql", @@ -348,13 +348,13 @@ ".prc": "sql", ".cql": "sql", ".db2": "sql", - "/\\.(styl|stylus)$/i": "stylus", + "regex:\\.(styl|stylus)$": "stylus", ".sln": "csproj", - "/\\.sv(h)?$/i": "systemverilog", + "regex:\\.sv(h)?$": "systemverilog", ".svelte": "svelte", ".svg": "svg", ".swift": "swift", - "/\\.tex(i)?$/i": "tex", + "regex:\\.tex(i)?$": "tex", ".ltx": "tex", ".aux": "tex", ".sty": "tex", @@ -363,17 +363,17 @@ ".ins": "tex", ".lbx": "tex", ".mkiv": "tex", - "/\\.mk[vi]i$/i": "tex", - "/^hyphen(ex)?\\.(cs|den|det|fr|sv|us)$/": "tex", - "/\\.te?xt$/i": "text", + "regex:\\.mk[vi]i$": "tex", + "regex:^hyphen(ex)?\\.(cs|den|det|fr|sv|us)$": "tex", + "regex:\\.te?xt$": "text", ".rtf": "text", - "/\\.i?nfo$/i": "text", + "regex:\\.i?nfo$": "text", ".msg": "text", - "/\\.(utxt|utf8)$/i": "text", + "regex:\\.(utxt|utf8)$": "text", ".toml": "toml", ".travis.yml": "travis", ".ts.map": "tsmap", - "/.*\\.d\\.ts/i": "typescript-def", + "regex:.*\\.d\\.ts$": "typescript-def", ".ts": "ts", ".tsx": "tsx", ".twig": "twig", @@ -398,13 +398,13 @@ ".wasm": "wasm", ".xml": "xml", ".xaml": "xaml", - "/\\.ya?ml$/i": "yaml", - "/^yarn(\\.lock)?$/i": "yarn", + "regex:\\.ya?ml$": "yaml", + "regex:^yarn(\\.lock)?$": "yarn", ".yarnrc": "yarn", ".zig": "zig", ".maeel": "maeel", - "/\\.(tfvars|tf)$/i": "terraform", - "/\\.mojo$/i": "mojo", + "regex:\\.(tfvars|tf)$": "terraform", + "regex:\\.mojo$": "mojo", ".🔥": "mojo", ".zs": "zs" } diff --git a/lsp/Cargo.toml b/lsp/Cargo.toml index 68a6461..758491e 100644 --- a/lsp/Cargo.toml +++ b/lsp/Cargo.toml @@ -10,3 +10,4 @@ tower-lsp = "0.20.0" git2 = "0.19.0" serde_json = "1.0.122" lazy_static = "1.5.0" +regex = "1.10.6" diff --git a/lsp/src/languages.rs b/lsp/src/languages.rs index 0759d42..bf1639c 100644 --- a/lsp/src/languages.rs +++ b/lsp/src/languages.rs @@ -1,4 +1,5 @@ use lazy_static::lazy_static; +use regex::Regex; use serde_json::from_str; use std::collections::HashMap; use std::sync::Mutex; @@ -15,11 +16,29 @@ lazy_static! { pub fn get_language(document: &Document) -> Option { let map = LANGUAGE_MAP.lock().unwrap(); + let filename = document.get_filename().to_string(); + let extension = format!(".{}", document.get_extension()); - if let Some(s) = map.get(&document.get_filename().to_string()) { + if let Some(s) = map.get(&filename) { return Some(s.to_string()); } - map.get(&format!(".{}", document.get_extension())) - .map(|s| s.to_string()) + for (pattern, language) in map.iter() { + let pattern = pattern.strip_prefix("regex:"); + if pattern.is_none() { + continue; + } + + if let Ok(re) = Regex::new(pattern.unwrap()) { + if re.is_match(&filename) || re.is_match(&extension) { + return Some(language.to_string()); + } + } + } + + if let Some(s) = map.get(&extension) { + return Some(s.to_string()); + } + + None }