refactor: move default language_server and formatter config to file_type_lsp.zig

From flow-syntax commit 410d19e633f237cd1602175450bd7d3bb03a1898.
This commit is contained in:
CJ van den Berg 2025-08-23 17:28:32 +02:00
parent dad954da1a
commit cc3ac7e58d
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
2 changed files with 266 additions and 2 deletions

View file

@ -23,6 +23,7 @@ pub const default = struct {
pub const folder_icon = "";
fn from_file_type(file_type: syntax.FileType) @This() {
const lsp_defaults: LspDefaults = static_file_type_lsp_defaults.get(file_type.name) orelse .{};
return .{
.name = file_type.name,
.color = file_type.color,
@ -33,8 +34,8 @@ fn from_file_type(file_type: syntax.FileType) @This() {
.first_line_matches_content = if (file_type.first_line_matches) |flm| flm.content else null,
.parser = file_type.name,
.comment = file_type.comment,
.formatter = file_type.formatter,
.language_server = file_type.language_server,
.formatter = lsp_defaults.formatter,
.language_server = lsp_defaults.language_server,
};
}
@ -199,6 +200,46 @@ pub fn create_syntax_guess_file_type(
return create_syntax(file_type, allocator, query_cache);
}
const static_file_type_lsp_defaults_list = load_file_type_lsp_defaults(@import("file_type_lsp.zig"));
const static_file_type_lsp_defaults = std.StaticStringMap(LspDefaults).initComptime(static_file_type_lsp_defaults_list);
const LspDefaults = struct {
formatter: ?[]const []const u8 = null,
language_server: ?[]const []const u8 = null,
};
const ListEntry = struct { []const u8, LspDefaults };
fn load_file_type_lsp_defaults(comptime Namespace: type) []const ListEntry {
comptime switch (@typeInfo(Namespace)) {
.@"struct" => |info| {
var count = 0;
for (info.decls) |_| count += 1;
var construct_types: [count]ListEntry = undefined;
var i = 0;
for (info.decls) |decl| {
const lang = decl.name;
const args = @field(Namespace, lang);
construct_types[i] = .{ lang, .{
.formatter = if (@hasField(@TypeOf(args), "formatter")) vec(args.formatter) else null,
.language_server = if (@hasField(@TypeOf(args), "language_server")) vec(args.language_server) else null,
} };
i += 1;
}
const types = construct_types;
return &types;
},
else => @compileError("expected tuple or struct type"),
};
}
fn vec(comptime args: anytype) []const []const u8 {
var cmd: []const []const u8 = &[_][]const u8{};
inline for (args) |arg| {
cmd = cmd ++ [_][]const u8{arg};
}
return cmd;
}
const syntax = @import("syntax");
const std = @import("std");
const root = @import("root");

223
src/file_type_lsp.zig Normal file
View file

@ -0,0 +1,223 @@
pub const agda = .{};
pub const astro = .{
.language_server = .{ "astro-ls", "--stdio" },
};
pub const bash = .{
.language_server = .{ "bash-language-server", "start" },
.formatter = .{ "shfmt", "--indent", "4" },
};
pub const c = .{
.language_server = .{"clangd"},
.formatter = .{"clang-format"},
};
pub const @"c-sharp" = .{
.language_server = .{ "OmniSharp", "-lsp" },
.formatter = .{ "csharpier", "format" },
};
pub const conf = .{};
pub const cmake = .{
.language_server = .{"cmake-language-server"},
.formatter = .{"cmake-format"},
};
pub const cpp = .{
.language_server = .{"clangd"},
.formatter = .{"clang-format"},
};
pub const css = .{
.language_server = .{ "vscode-css-language-server", "--stdio" },
};
pub const diff = .{};
pub const dockerfile = .{};
pub const dtd = .{};
pub const elixir = .{
.language_server = .{"elixir-ls"},
.formatter = .{ "mix", "format", "-" },
};
pub const fish = .{};
pub const @"git-rebase" = .{};
pub const gitcommit = .{};
pub const gleam = .{
.language_server = .{ "gleam", "lsp" },
.formatter = .{ "gleam", "format", "--stdin" },
};
pub const go = .{
.language_server = .{"gopls"},
.formatter = .{"gofmt"},
};
pub const hare = .{};
pub const haskell = .{
.language_server = .{ "haskell-language-server-wrapper", "lsp" },
};
pub const html = .{
.language_server = .{ "superhtml", "lsp" }, // https://github.com/kristoff-it/super-html.git
.formatter = .{ "superhtml", "fmt", "--stdin" },
};
pub const superhtml = .{
.language_server = .{ "superhtml", "lsp" },
.formatter = .{ "superhtml", "fmt", "--stdin-super" },
};
pub const hurl = .{};
pub const java = .{};
pub const javascript = .{
.language_server = .{ "typescript-language-server", "--stdio" },
.formatter = .{ "prettier", "--parser", "typescript" },
};
pub const json = .{
.language_server = .{ "vscode-json-language-server", "--stdio" },
.formatter = .{ "prettier", "--parser", "json" },
};
pub const julia = .{
.language_server = .{ "julia", "-e", "using LanguageServer; runserver()" },
.formatter = .{ "julia", "-e", "using JuliaFormatter; print(format_text(read(stdin, String)))" },
};
pub const kdl = .{};
pub const lua = .{
.language_server = .{"lua-lsp"},
};
pub const mail = .{};
pub const make = .{};
pub const markdown = .{
.language_server = .{ "marksman", "server" },
.formatter = .{ "prettier", "--parser", "markdown" },
};
pub const @"markdown-inline" = .{};
pub const nasm = .{};
pub const nim = .{
.language_server = .{"nimlangserver"},
};
pub const nimble = .{};
pub const ninja = .{};
pub const nix = .{
.language_server = .{"nixd"},
.formatter = .{"alejandra"},
};
pub const nu = .{
.language_server = .{ "nu", "--lsp" },
};
pub const ocaml = .{
.language_server = .{ "ocamllsp", "--fallback-read-dot-merlin" },
.formatter = .{ "ocamlformat", "--profile=ocamlformat", "-" },
};
pub const odin = .{
.language_server = .{"ols"},
.formatter = .{ "odinfmt", "-stdin" },
};
pub const openscad = .{
.language_server = .{"openscad-lsp"},
};
pub const org = .{};
pub const php = .{
.language_server = .{ "intelephense", "--stdio" },
};
pub const powershell = .{};
pub const proto = .{};
pub const purescript = .{};
pub const python = .{
.language_server = .{"pylsp"},
};
pub const regex = .{};
pub const rpmspec = .{};
pub const ruby = .{
.language_server = .{"ruby-lsp"},
};
pub const rust = .{
.language_server = .{"rust-analyzer"},
.formatter = .{"rustfmt"},
};
pub const scheme = .{};
pub const sql = .{};
pub const @"ssh-config" = .{};
pub const swift = .{
.language_server = .{"sourcekit-lsp"},
.formatter = .{"swift-format"},
};
pub const verilog = .{
.language_server = .{"verible-verilog-ls"},
.formatter = .{ "verible-verilog-format", "-" },
};
pub const toml = .{};
pub const typescript = .{
.language_server = .{ "typescript-language-server", "--stdio" },
.formatter = .{ "prettier", "--parser", "typescript" },
};
pub const typst = .{
.language_server = .{"tinymist"},
};
pub const uxntal = .{};
pub const vim = .{};
pub const xml = .{
.formatter = .{ "xmllint", "--format", "-" },
};
pub const yaml = .{};
pub const zig = .{
.language_server = .{"zls"},
.formatter = .{ "zig", "fmt", "--stdin" },
};
pub const ziggy = .{};
pub const @"ziggy-schema" = .{};