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"],
);
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");
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
}