use std::collections::HashMap;
use super::{FormatterToml, LanguageConfig, LspConfig};
use crate::config::editor::EditorToml;
pub fn builtin_lsp() -> HashMap<String, LspConfig> {
let mut m = HashMap::new();
let add = |m: &mut HashMap<String, LspConfig>,
name: &str,
command: &str,
args: &[&str],
language_id: Option<&str>,
root_markers: &[&str]| {
m.insert(
name.to_string(),
LspConfig {
name: name.to_string(),
command: command.to_string(),
args: args.iter().map(|s| s.to_string()).collect(),
language_id: language_id.map(|s| s.to_string()),
root_markers: root_markers.iter().map(|s| s.to_string()).collect(),
},
);
};
add(
&mut m,
"rust-analyzer",
"rust-analyzer",
&[],
None,
&["Cargo.toml", "rust-project.json"],
);
add(
&mut m,
"pyright",
"pyright-langserver",
&["--stdio"],
None,
&[
"pyproject.toml",
"setup.py",
"setup.cfg",
"requirements.txt",
],
);
add(&mut m, "taplo", "taplo", &["lsp", "stdio"], None, &[]);
add(
&mut m,
"vtsls",
"vtsls",
&["--stdio"],
None,
&["package.json", "tsconfig.json"],
);
add(
&mut m,
"typescript-language-server",
"typescript-language-server",
&["--stdio"],
None,
&["package.json", "tsconfig.json", "jsconfig.json"],
);
add(&mut m, "gopls", "gopls", &[], None, &["go.mod", "go.work"]);
add(
&mut m,
"kotlin-lsp",
"kotlin-lsp",
&["--stdio"],
None,
&[
"settings.gradle.kts",
"settings.gradle",
"build.gradle.kts",
"build.gradle",
"pom.xml",
],
);
add(
&mut m,
"clangd",
"clangd",
&[],
None,
&[
"compile_commands.json",
".clangd",
"Makefile",
"CMakeLists.txt",
],
);
add(
&mut m,
"jdtls",
"jdtls",
&[],
None,
&["pom.xml", "build.gradle", "build.gradle.kts", ".project"],
);
add(
&mut m,
"bash-language-server",
"bash-language-server",
&["start"],
Some("shellscript"),
&[],
);
add(
&mut m,
"vscode-json-language-server",
"vscode-json-language-server",
&["--stdio"],
None,
&[],
);
add(
&mut m,
"yaml-language-server",
"yaml-language-server",
&["--stdio"],
None,
&[],
);
add(
&mut m,
"marksman",
"marksman",
&["server"],
None,
&[".marksman.toml"],
);
add(
&mut m,
"vscode-html-language-server",
"vscode-html-language-server",
&["--stdio"],
None,
&[],
);
add(
&mut m,
"vscode-css-language-server",
"vscode-css-language-server",
&["--stdio"],
None,
&[],
);
add(
&mut m,
"lua-language-server",
"lua-language-server",
&[],
None,
&[".luarc.json", ".luarc.jsonc", "stylua.toml"],
);
add(
&mut m,
"ruby-lsp",
"ruby-lsp",
&[],
None,
&["Gemfile", ".rubocop.yml"],
);
add(&mut m, "zls", "zls", &[], None, &["build.zig"]);
add(
&mut m,
"terraform-ls",
"terraform-ls",
&["serve"],
None,
&[".terraform", "main.tf"],
);
add(
&mut m,
"vue-language-server",
"vue-language-server",
&["--stdio"],
None,
&["package.json", "vite.config.ts", "vite.config.js"],
);
add(
&mut m,
"svelteserver",
"svelteserver",
&["--stdio"],
None,
&["package.json", "svelte.config.js", "svelte.config.ts"],
);
add(
&mut m,
"haskell-language-server",
"haskell-language-server-wrapper",
&["--lsp"],
None,
&[
"*.cabal",
"stack.yaml",
"cabal.project",
"package.yaml",
"hie.yaml",
],
);
add(
&mut m,
"lexical",
"lexical",
&["server"],
None,
&["mix.exs"],
);
add(&mut m, "elixir-ls", "elixir-ls", &[], None, &["mix.exs"]);
add(
&mut m,
"nixd",
"nixd",
&[],
None,
&["flake.nix", "default.nix", "shell.nix"],
);
add(
&mut m,
"nil",
"nil",
&[],
None,
&["flake.nix", "default.nix", "shell.nix"],
);
add(
&mut m,
"csharp-ls",
"csharp-ls",
&[],
Some("csharp"),
&["global.json", "Directory.Build.props"],
);
add(
&mut m,
"sourcekit-lsp",
"sourcekit-lsp",
&[],
None,
&["Package.swift"],
);
add(
&mut m,
"intelephense",
"intelephense",
&["--stdio"],
None,
&["composer.json", ".phpactor.json"],
);
add(
&mut m,
"dart",
"dart",
&[
"language-server",
"--client-id=vorto",
"--client-version=0.11",
],
None,
&["pubspec.yaml"],
);
add(
&mut m,
"ocamllsp",
"ocamllsp",
&[],
None,
&["dune-project", "dune"],
);
add(
&mut m,
"graphql-lsp",
"graphql-lsp",
&["server", "--method=stream"],
Some("graphql"),
&[
".graphqlrc",
".graphqlrc.json",
".graphqlrc.yml",
"graphql.config.js",
"package.json",
],
);
add(&mut m, "fish-lsp", "fish-lsp", &["start"], None, &[]);
m
}
pub fn builtin_extension_language_ids() -> HashMap<String, String> {
let mut m = HashMap::new();
let mut add = |ext: &str, id: &str| {
m.insert(ext.to_string(), id.to_string());
};
add("tsx", "typescriptreact");
add("jsx", "javascriptreact");
add("mjs", "javascript");
add("cjs", "javascript");
add("mts", "typescript");
add("cts", "typescript");
add("h", "c");
add("hpp", "cpp");
add("hh", "cpp");
add("hxx", "cpp");
add("htm", "html");
add("mdx", "markdown");
add("yml", "yaml");
add("cs", "csharp");
m
}
pub fn builtin_languages() -> HashMap<String, LanguageConfig> {
let mut m = HashMap::new();
let lsp = |names: &[&str]| Some(names.iter().map(|s| s.to_string()).collect());
m.insert(
"rust".into(),
LanguageConfig {
extensions: Some(vec!["rs".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(4),
tab_width: Some(4),
..Default::default()
},
lsp: lsp(&["rust-analyzer"]),
formatter: Some(FormatterToml {
command: Some("rustfmt".into()),
args: None,
}),
..Default::default()
},
);
m.insert(
"python".into(),
LanguageConfig {
extensions: Some(vec!["py".into()]),
comment_token: Some("#".into()),
editor: EditorToml {
indent_width: Some(4),
tab_width: Some(4),
..Default::default()
},
lsp: lsp(&["pyright"]),
..Default::default()
},
);
m.insert(
"toml".into(),
LanguageConfig {
extensions: Some(vec!["toml".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["taplo"]),
..Default::default()
},
);
m.insert(
"typescript".into(),
LanguageConfig {
extensions: Some(vec!["ts".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(2),
tab_width: Some(2),
..Default::default()
},
lsp: lsp(&["vtsls", "typescript-language-server"]),
..Default::default()
},
);
m.insert(
"tsx".into(),
LanguageConfig {
extensions: Some(vec!["tsx".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(2),
tab_width: Some(2),
..Default::default()
},
lsp: lsp(&["vtsls", "typescript-language-server"]),
..Default::default()
},
);
m.insert(
"javascript".into(),
LanguageConfig {
extensions: Some(vec!["js".into(), "jsx".into(), "mjs".into(), "cjs".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
lsp: lsp(&["typescript-language-server"]),
..Default::default()
},
);
m.insert(
"go".into(),
LanguageConfig {
extensions: Some(vec!["go".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(4),
tab_width: Some(4),
use_tabs: Some(true),
..Default::default()
},
lsp: lsp(&["gopls"]),
formatter: Some(FormatterToml {
command: Some("gofmt".into()),
args: None,
}),
..Default::default()
},
);
m.insert(
"kotlin".into(),
LanguageConfig {
extensions: Some(vec!["kt".into(), "kts".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
lsp: lsp(&["kotlin-lsp"]),
..Default::default()
},
);
m.insert(
"c".into(),
LanguageConfig {
extensions: Some(vec!["c".into(), "h".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
lsp: lsp(&["clangd"]),
..Default::default()
},
);
m.insert(
"cpp".into(),
LanguageConfig {
extensions: Some(vec![
"cpp".into(),
"cc".into(),
"cxx".into(),
"hpp".into(),
"hh".into(),
"hxx".into(),
]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
lsp: lsp(&["clangd"]),
..Default::default()
},
);
m.insert(
"java".into(),
LanguageConfig {
extensions: Some(vec!["java".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
lsp: lsp(&["jdtls"]),
..Default::default()
},
);
m.insert(
"bash".into(),
LanguageConfig {
extensions: Some(vec!["sh".into(), "bash".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["bash-language-server"]),
..Default::default()
},
);
m.insert(
"json".into(),
LanguageConfig {
extensions: Some(vec!["json".into()]),
comment_token: None,
lsp: lsp(&["vscode-json-language-server"]),
..Default::default()
},
);
m.insert(
"yaml".into(),
LanguageConfig {
extensions: Some(vec!["yaml".into(), "yml".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["yaml-language-server"]),
..Default::default()
},
);
m.insert(
"markdown".into(),
LanguageConfig {
extensions: Some(vec!["md".into(), "markdown".into()]),
comment_token: None,
lsp: lsp(&["marksman"]),
..Default::default()
},
);
m.insert(
"html".into(),
LanguageConfig {
extensions: Some(vec!["html".into(), "htm".into()]),
comment_token: None,
block_comment_token: Some(("<!--".into(), "-->".into())),
lsp: lsp(&["vscode-html-language-server"]),
..Default::default()
},
);
m.insert(
"css".into(),
LanguageConfig {
extensions: Some(vec!["css".into()]),
comment_token: None,
block_comment_token: Some(("/*".into(), "*/".into())),
lsp: lsp(&["vscode-css-language-server"]),
..Default::default()
},
);
m.insert(
"lua".into(),
LanguageConfig {
extensions: Some(vec!["lua".into()]),
comment_token: Some("--".into()),
lsp: lsp(&["lua-language-server"]),
..Default::default()
},
);
m.insert(
"ruby".into(),
LanguageConfig {
extensions: Some(vec!["rb".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["ruby-lsp"]),
..Default::default()
},
);
m.insert(
"sql".into(),
LanguageConfig {
extensions: Some(vec!["sql".into()]),
comment_token: Some("--".into()),
..Default::default()
},
);
m.insert(
"zig".into(),
LanguageConfig {
extensions: Some(vec!["zig".into(), "zon".into()]),
comment_token: Some("//".into()),
lsp: lsp(&["zls"]),
formatter: Some(FormatterToml {
command: Some("zig".into()),
args: Some(vec!["fmt".into(), "--stdin".into()]),
}),
..Default::default()
},
);
m.insert(
"dockerfile".into(),
LanguageConfig {
extensions: Some(vec!["dockerfile".into()]),
filenames: Some(vec!["Dockerfile".into(), "Containerfile".into()]),
comment_token: Some("#".into()),
..Default::default()
},
);
m.insert(
"make".into(),
LanguageConfig {
extensions: Some(vec!["mk".into(), "make".into()]),
filenames: Some(vec![
"Makefile".into(),
"makefile".into(),
"GNUmakefile".into(),
]),
comment_token: Some("#".into()),
editor: EditorToml {
use_tabs: Some(true),
tab_width: Some(8),
..Default::default()
},
..Default::default()
},
);
m.insert(
"hcl".into(),
LanguageConfig {
extensions: Some(vec!["hcl".into(), "tf".into(), "tfvars".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["terraform-ls"]),
..Default::default()
},
);
m.insert(
"diff".into(),
LanguageConfig {
extensions: Some(vec!["diff".into(), "patch".into()]),
comment_token: None,
..Default::default()
},
);
m.insert(
"vue".into(),
LanguageConfig {
extensions: Some(vec!["vue".into()]),
comment_token: Some("<!--".into()),
block_comment_token: Some(("<!--".into(), "-->".into())),
lsp: lsp(&["vue-language-server"]),
..Default::default()
},
);
m.insert(
"svelte".into(),
LanguageConfig {
extensions: Some(vec!["svelte".into()]),
comment_token: Some("<!--".into()),
block_comment_token: Some(("<!--".into(), "-->".into())),
lsp: lsp(&["svelteserver"]),
..Default::default()
},
);
m.insert(
"haskell".into(),
LanguageConfig {
extensions: Some(vec!["hs".into(), "lhs".into()]),
comment_token: Some("--".into()),
block_comment_token: Some(("{-".into(), "-}".into())),
lsp: lsp(&["haskell-language-server"]),
..Default::default()
},
);
m.insert(
"elixir".into(),
LanguageConfig {
extensions: Some(vec!["ex".into(), "exs".into()]),
filenames: Some(vec!["mix.lock".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["lexical", "elixir-ls"]),
..Default::default()
},
);
m.insert(
"nix".into(),
LanguageConfig {
extensions: Some(vec!["nix".into()]),
comment_token: Some("#".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(2),
tab_width: Some(2),
..Default::default()
},
lsp: lsp(&["nixd", "nil"]),
..Default::default()
},
);
m.insert(
"c-sharp".into(),
LanguageConfig {
extensions: Some(vec!["cs".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(4),
tab_width: Some(4),
..Default::default()
},
lsp: lsp(&["csharp-ls"]),
..Default::default()
},
);
m.insert(
"swift".into(),
LanguageConfig {
extensions: Some(vec!["swift".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(4),
tab_width: Some(4),
..Default::default()
},
lsp: lsp(&["sourcekit-lsp"]),
..Default::default()
},
);
m.insert(
"php".into(),
LanguageConfig {
extensions: Some(vec!["php".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(4),
tab_width: Some(4),
..Default::default()
},
lsp: lsp(&["intelephense"]),
..Default::default()
},
);
m.insert(
"dart".into(),
LanguageConfig {
extensions: Some(vec!["dart".into()]),
comment_token: Some("//".into()),
block_comment_token: Some(("/*".into(), "*/".into())),
editor: EditorToml {
indent_width: Some(2),
tab_width: Some(2),
..Default::default()
},
lsp: lsp(&["dart"]),
formatter: Some(FormatterToml {
command: Some("dart".into()),
args: Some(vec!["format".into(), "--output=show".into()]),
}),
..Default::default()
},
);
m.insert(
"ocaml".into(),
LanguageConfig {
extensions: Some(vec!["ml".into(), "mli".into()]),
comment_token: None,
block_comment_token: Some(("(*".into(), "*)".into())),
editor: EditorToml {
indent_width: Some(2),
tab_width: Some(2),
..Default::default()
},
lsp: lsp(&["ocamllsp"]),
formatter: Some(FormatterToml {
command: Some("ocamlformat".into()),
args: Some(vec![
"--enable-outside-detected-project".into(),
"--name".into(),
"stdin.ml".into(),
"-".into(),
]),
}),
..Default::default()
},
);
m.insert(
"graphql".into(),
LanguageConfig {
extensions: Some(vec!["graphql".into(), "gql".into()]),
comment_token: Some("#".into()),
editor: EditorToml {
indent_width: Some(2),
tab_width: Some(2),
..Default::default()
},
lsp: lsp(&["graphql-lsp"]),
..Default::default()
},
);
m.insert(
"fish".into(),
LanguageConfig {
extensions: Some(vec!["fish".into()]),
comment_token: Some("#".into()),
lsp: lsp(&["fish-lsp"]),
formatter: Some(FormatterToml {
command: Some("fish_indent".into()),
args: None,
}),
..Default::default()
},
);
m
}