From fc44208892901c6726b27953f9a7d3e9df4526a9 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Sun, 22 Sep 2024 14:22:11 +0200 Subject: [PATCH] Squashed 'src/syntax/' changes from 3619572..d5b5da5 d5b5da5 feat: add nu 9e943df feat: add vimscript support 3aa9e32 fix: make cpp highlights inherit from c highlights f516cca feat: update tree-sitter bc10ea1 feat: format json with hjson 0b9e4ac refactor: change a -> allocator bd5240d fix: update color for typst file_type 302b343 feat: add typst file type 97b6432 feat: update tree-sitter to add typst 5637dc8 refactor: prefer orelse to if(pred) |x| x else y 4818cc1 build: add the options to build entirely without tree-sitter 4106496 feat: add language server for openscad file type fcd12e6 refactor: re-format file_types.zig 8536e19 feat: add elixir file type d04f957 Add OCaml Formatter and LS (#23) 945a58d feat: add ini as a toml file extension git-subtree-dir: src/syntax git-subtree-split: d5b5da509350ef946b33cfb5c04ede68e288545b --- build.zig | 157 ++++++++++++++++++++++++-------------------- build.zig.zon | 4 +- src/file_type.zig | 34 ++++++++-- src/file_types.zig | 53 ++++++++++++++- src/syntax.zig | 37 ++++++----- src/treez_dummy.zig | 104 +++++++++++++++++++++++++++++ 6 files changed, 293 insertions(+), 96 deletions(-) create mode 100644 src/treez_dummy.zig diff --git a/build.zig b/build.zig index 05cbcc3..e94b729 100644 --- a/build.zig +++ b/build.zig @@ -1,6 +1,11 @@ const std = @import("std"); pub fn build(b: *std.Build) void { + const use_tree_sitter = b.option(bool, "use_tree_sitter", "Enable tree-sitter (default: yes)") orelse true; + const options = b.addOptions(); + options.addOption(bool, "use_tree_sitter", use_tree_sitter); + const options_mod = options.createModule(); + const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); @@ -9,79 +14,91 @@ pub fn build(b: *std.Build) void { .optimize = optimize, }); + const imports: []const std.Build.Module.Import = if (use_tree_sitter) &.{ + .{ .name = "build_options", .module = options_mod }, + .{ .name = "treez", .module = tree_sitter_dep.module("treez") }, + ts_queryfile(b, tree_sitter_dep, "tree-sitter-agda/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-bash/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-c-sharp/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-c/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-cpp/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-css/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-diff/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-dockerfile/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-elixir/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-git-rebase/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-gitcommit/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-go/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-fish/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-haskell/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-html/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-java/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-javascript/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-jsdoc/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-json/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-kdl/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-lua/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-make/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown-inline/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nasm/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nim/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-ninja/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nix/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nu/queries/nu/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-ocaml/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-openscad/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-org/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-php/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-python/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-purescript/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-regex/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-ruby/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-rust/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-ssh-config/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-scala/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-scheme/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-superhtml/tree-sitter-superhtml/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-toml/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-typescript/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-typst/queries/typst/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-vim/queries/vim/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-xml/queries/dtd/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-xml/queries/xml/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-yaml/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-zig/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-ziggy/tree-sitter-ziggy/queries/highlights.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-ziggy/tree-sitter-ziggy-schema/queries/highlights.scm"), + + ts_queryfile(b, tree_sitter_dep, "tree-sitter-cpp/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-elixir/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-gitcommit/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-html/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-javascript/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-kdl/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-lua/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown-inline/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nasm/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nix/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-nu/queries/nu/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-openscad/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-php/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-purescript/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-purescript/vim_queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-rust/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-superhtml/tree-sitter-superhtml/queries/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-typst/queries/typst/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-vim/queries/vim/injections.scm"), + ts_queryfile(b, tree_sitter_dep, "tree-sitter-zig/queries/injections.scm"), + } else &.{ + .{ .name = "build_options", .module = options_mod }, + }; + _ = b.addModule("syntax", .{ .root_source_file = b.path("src/syntax.zig"), - .imports = &.{ - .{ .name = "treez", .module = tree_sitter_dep.module("treez") }, - ts_queryfile(b, tree_sitter_dep, "tree-sitter-agda/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-bash/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-c-sharp/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-c/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-cpp/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-css/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-diff/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-dockerfile/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-git-rebase/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-gitcommit/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-go/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-fish/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-haskell/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-html/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-java/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-javascript/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-jsdoc/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-json/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-kdl/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-lua/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-make/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown-inline/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-nasm/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-nim/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-ninja/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-nix/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-ocaml/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-openscad/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-org/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-php/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-python/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-purescript/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-regex/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-ruby/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-rust/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-ssh-config/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-scala/queries/scala/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-scheme/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-superhtml/tree-sitter-superhtml/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-toml/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-typescript/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-xml/queries/dtd/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-xml/queries/xml/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-yaml/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-zig/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-ziggy/tree-sitter-ziggy/queries/highlights.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-ziggy/tree-sitter-ziggy-schema/queries/highlights.scm"), - - ts_queryfile(b, tree_sitter_dep, "tree-sitter-cpp/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-gitcommit/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-html/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-javascript/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-kdl/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-lua/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown-inline/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-markdown/tree-sitter-markdown/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-nasm/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-nix/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-openscad/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-php/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-purescript/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-purescript/vim_queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-rust/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-superhtml/tree-sitter-superhtml/queries/injections.scm"), - ts_queryfile(b, tree_sitter_dep, "tree-sitter-zig/queries/injections.scm"), - }, + .imports = imports, }); - } fn ts_queryfile(b: *std.Build, dep: *std.Build.Dependency, comptime sub_path: []const u8) std.Build.Module.Import { diff --git a/build.zig.zon b/build.zig.zon index 1925858..905ebd3 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -4,8 +4,8 @@ .dependencies = .{ .@"tree-sitter" = .{ - .url = "https://github.com/neurocyte/tree-sitter/releases/download/master-eda7be4e1fa1ef5046153e1ad6a3e5097d7746f3/source.tar.gz", - .hash = "1220d69c4591a68ab00731fa9becda325da182851afeef30b41011a86f1fba6c19e6", + .url = "https://github.com/neurocyte/tree-sitter/releases/download/master-876cc5a125cb822d44a9f94f6bde64fac66272ce/source.tar.gz", + .hash = "12208efbfead8c57adeabbd2293d6ed19e00f769e1d8aba0d544270479587c9f694a", }, }, .paths = .{ diff --git a/src/file_type.zig b/src/file_type.zig index 8e0ff4b..b27a0f9 100644 --- a/src/file_type.zig +++ b/src/file_type.zig @@ -1,5 +1,11 @@ const std = @import("std"); -const treez = @import("treez"); +const build_options = @import("build_options"); + +const treez = if (build_options.use_tree_sitter) + @import("treez") +else + @import("treez_dummy.zig"); + pub const FileType = @This(); color: u24, @@ -63,8 +69,12 @@ pub fn Parser(comptime lang: []const u8) LangFn { } fn get_parser(comptime lang: []const u8) LangFn { - const language_name = ft_func_name(lang); - return @extern(?LangFn, .{ .name = "tree_sitter_" ++ language_name }) orelse @compileError(std.fmt.comptimePrint("Cannot find extern tree_sitter_{s}", .{language_name})); + if (build_options.use_tree_sitter) { + const language_name = ft_func_name(lang); + return @extern(?LangFn, .{ .name = "tree_sitter_" ++ language_name }) orelse @compileError(std.fmt.comptimePrint("Cannot find extern tree_sitter_{s}", .{language_name})); + } else { + return treez.Language.LangFn; + } } fn ft_func_name(comptime lang: []const u8) []const u8 { @@ -112,8 +122,22 @@ fn load_file_types(comptime Namespace: type) []const FileType { .lang_fn = if (@hasField(@TypeOf(args), "parser")) args.parser else get_parser(lang), .extensions = vec(args.extensions), .comment = args.comment, - .highlights = if (@hasField(@TypeOf(args), "highlights")) @embedFile(args.highlights) else @embedFile("tree-sitter-" ++ lang ++ "/queries/highlights.scm"), - .injections = if (@hasField(@TypeOf(args), "injections")) @embedFile(args.injections) else null, + .highlights = if (build_options.use_tree_sitter) + if (@hasField(@TypeOf(args), "highlights")) + @embedFile(args.highlights) + else if (@hasField(@TypeOf(args), "highlights_list")) + @embedFile(args.highlights_list[0]) ++ "\n" ++ @embedFile(args.highlights_list[1]) + else + @embedFile("tree-sitter-" ++ lang ++ "/queries/highlights.scm") + else + "", + .injections = if (build_options.use_tree_sitter) + if (@hasField(@TypeOf(args), "injections")) + @embedFile(args.injections) + else + null + else + null, .first_line_matches = if (@hasField(@TypeOf(args), "first_line_matches")) args.first_line_matches else null, .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, diff --git a/src/file_types.zig b/src/file_types.zig index ec15b81..284c857 100644 --- a/src/file_types.zig +++ b/src/file_types.zig @@ -43,6 +43,10 @@ pub const cpp = .{ .icon = "", .extensions = .{ "cc", "cpp", "cxx", "hpp", "hxx", "h", "ipp", "ixx" }, .comment = "//", + .highlights_list = .{ + "tree-sitter-c/queries/highlights.scm", + "tree-sitter-cpp/queries/highlights.scm", + }, .injections = "tree-sitter-cpp/queries/injections.scm", .formatter = .{"clang-format"}, .language_server = .{"clangd"}, @@ -74,6 +78,16 @@ pub const dtd = .{ .highlights = "tree-sitter-xml/queries/dtd/highlights.scm", }; +pub const elixir = .{ + .color = 0x4e2a8e, + .icon = "", + .extensions = .{ "ex", "exs" }, + .comment = "#", + .injections = "tree-sitter-elixir/queries/injections.scm", + .formatter = .{ "mix", "format", "-" }, + .language_server = .{"elixir-ls"}, +}; + pub const fish = .{ .extensions = .{"fish"}, .comment = "#", @@ -109,7 +123,7 @@ pub const haskell = .{ .icon = "󰲒", .extensions = .{"hs"}, .comment = "--", - .language_server = .{"haskell-language-server-wrapper", "lsp"}, + .language_server = .{ "haskell-language-server-wrapper", "lsp" }, }; pub const html = .{ @@ -153,6 +167,7 @@ pub const json = .{ .extensions = .{"json"}, .comment = "//", .language_server = .{ "deno", "lsp" }, + .formatter = .{ "hjson", "-j" }, }; pub const kdl = .{ @@ -232,11 +247,23 @@ pub const nix = .{ .injections = "tree-sitter-nix/queries/injections.scm", }; +pub const nu = .{ + .color = 0x3AA675, + .icon = ">", + .extensions = .{ "nu", "nushell" }, + .comment = "#", + .language_server = .{"nu", "--lsp"}, + .highlights = "tree-sitter-nu/queries/nu/highlights.scm", + .injections = "tree-sitter-nu/queries/nu/injections.scm", +}; + pub const ocaml = .{ .color = 0xF18803, .icon = "", .extensions = .{ "ml", "mli" }, .comment = "(*", + .formatter = .{ "ocamlformat", "--profile=ocamlformat", "-" }, + .language_server = .{ "ocamllsp", "--fallback-read-dot-merlin" }, }; pub const openscad = .{ @@ -245,6 +272,7 @@ pub const openscad = .{ .extensions = .{"scad"}, .comment = "//", .injections = "tree-sitter-openscad/queries/injections.scm", + .language_server = .{"openscad-lsp"}, }; pub const org = .{ @@ -310,7 +338,7 @@ pub const @"ssh-config" = .{ }; pub const toml = .{ - .extensions = .{"toml"}, + .extensions = .{ "toml", "ini" }, .comment = "#", .highlights = "tree-sitter-toml/queries/highlights.scm", .parser = @import("file_type.zig").Parser("toml"), @@ -324,6 +352,25 @@ pub const typescript = .{ .language_server = .{ "deno", "lsp" }, }; +pub const typst = .{ + .color = 0x23b6bc, + .icon = "t", + .extensions = .{ "typst", "typ" }, + .comment = "//", + .language_server = .{"tinymist"}, + .highlights = "tree-sitter-typst/queries/typst/highlights.scm", + .injections = "tree-sitter-typst/queries/typst/injections.scm", +}; + +pub const vim = .{ + .color = 0x007f00, + .icon = "", + .extensions = .{"vim"}, + .comment = "\"", + .highlights = "tree-sitter-vim/queries/vim/highlights.scm", + .injections = "tree-sitter-vim/queries/vim/injections.scm", +}; + pub const xml = .{ .icon = "󰗀", .extensions = .{"xml"}, @@ -335,7 +382,7 @@ pub const xml = .{ pub const yaml = .{ .color = 0x000000, .icon = "", - .extensions = .{"yaml", "yml"}, + .extensions = .{ "yaml", "yml" }, .comment = "#", }; diff --git a/src/syntax.zig b/src/syntax.zig index 4c6f1f4..6737389 100644 --- a/src/syntax.zig +++ b/src/syntax.zig @@ -1,5 +1,10 @@ const std = @import("std"); -const treez = @import("treez"); +const build_options = @import("build_options"); + +const treez = if (build_options.use_tree_sitter) + @import("treez") +else + @import("treez_dummy.zig"); const Self = @This(); @@ -7,25 +12,25 @@ pub const Edit = treez.InputEdit; pub const FileType = @import("file_type.zig"); pub const Range = treez.Range; pub const Point = treez.Point; +const Input = treez.Input; const Language = treez.Language; const Parser = treez.Parser; const Query = treez.Query; -const Tree = treez.Tree; pub const Node = treez.Node; -a: std.mem.Allocator, +allocator: std.mem.Allocator, lang: *const Language, file_type: *const FileType, parser: *Parser, query: *Query, injections: *Query, -tree: ?*Tree = null, +tree: ?*treez.Tree = null, -pub fn create(file_type: *const FileType, a: std.mem.Allocator, content: []const u8) !*Self { - const self = try a.create(Self); +pub fn create(file_type: *const FileType, allocator: std.mem.Allocator, content: []const u8) !*Self { + const self = try allocator.create(Self); self.* = .{ - .a = a, - .lang = file_type.lang_fn() orelse std.debug.panic("tree-sitter parser function failed for language: {d}", .{file_type.name}), + .allocator = allocator, + .lang = file_type.lang_fn() orelse std.debug.panic("tree-sitter parser function failed for language: {s}", .{file_type.name}), .file_type = file_type, .parser = try Parser.create(), .query = try Query.create(self.lang, file_type.highlights), @@ -37,21 +42,21 @@ pub fn create(file_type: *const FileType, a: std.mem.Allocator, content: []const return self; } -pub fn create_file_type(a: std.mem.Allocator, content: []const u8, lang_name: []const u8) !*Self { +pub fn create_file_type(allocator: std.mem.Allocator, content: []const u8, lang_name: []const u8) !*Self { const file_type = FileType.get_by_name(lang_name) orelse return error.NotFound; - return create(file_type, a, content); + return create(file_type, allocator, content); } -pub fn create_guess_file_type(a: std.mem.Allocator, content: []const u8, file_path: ?[]const u8) !*Self { +pub fn create_guess_file_type(allocator: std.mem.Allocator, content: []const u8, file_path: ?[]const u8) !*Self { const file_type = FileType.guess(file_path, content) orelse return error.NotFound; - return create(file_type, a, content); + return create(file_type, allocator, content); } pub fn destroy(self: *Self) void { if (self.tree) |tree| tree.destroy(); self.query.destroy(); self.parser.destroy(); - self.a.destroy(self); + self.allocator.destroy(self); } pub fn refresh_full(self: *Self, content: []const u8) !void { @@ -85,7 +90,7 @@ pub fn refresh_from_buffer(self: *Self, buffer: anytype, metrics: anytype) !void .syntax = self, }; - const input: treez.Input = .{ + const input: Input = .{ .payload = &state, .read = struct { fn read(payload: ?*anyopaque, _: u32, position: treez.Point, bytes_read: *u32) callconv(.C) [*:0]const u8 { @@ -107,7 +112,7 @@ fn CallBack(comptime T: type) type { pub fn render(self: *const Self, ctx: anytype, comptime cb: CallBack(@TypeOf(ctx)), range: ?Range) !void { const cursor = try Query.Cursor.create(); defer cursor.destroy(); - const tree = if (self.tree) |p| p else return; + const tree = self.tree orelse return; cursor.execute(self.query, tree.getRootNode()); if (range) |r| cursor.setPointRange(r.start_point, r.end_point); while (cursor.nextMatch()) |match| { @@ -122,7 +127,7 @@ pub fn render(self: *const Self, ctx: anytype, comptime cb: CallBack(@TypeOf(ctx pub fn highlights_at_point(self: *const Self, ctx: anytype, comptime cb: CallBack(@TypeOf(ctx)), point: Point) void { const cursor = Query.Cursor.create() catch return; defer cursor.destroy(); - const tree = if (self.tree) |p| p else return; + const tree = self.tree orelse return; cursor.execute(self.query, tree.getRootNode()); cursor.setPointRange(.{ .row = point.row, .column = 0 }, .{ .row = point.row + 1, .column = 0 }); while (cursor.nextMatch()) |match| { diff --git a/src/treez_dummy.zig b/src/treez_dummy.zig new file mode 100644 index 0000000..ccb96de --- /dev/null +++ b/src/treez_dummy.zig @@ -0,0 +1,104 @@ +pub const InputEdit = extern struct { + start_byte: u32, + old_end_byte: u32, + new_end_byte: u32, + start_point: Point, + old_end_point: Point, + new_end_point: Point, +}; +pub const Range = extern struct { + start_point: Point = .{}, + end_point: Point = .{}, + start_byte: u32 = 0, + end_byte: u32 = 0, +}; + +pub const Point = extern struct { + row: u32 = 0, + column: u32 = 0, +}; +pub const InputEncoding = enum(c_uint) { + utf_8, + utf_16, +}; +pub const Input = extern struct { + payload: ?*anyopaque, + read: ?*const fn (payload: ?*anyopaque, byte_index: u32, position: Point, bytes_read: *u32) callconv(.C) [*:0]const u8, + encoding: InputEncoding, +}; +pub const Language = struct { + var dummy: @This() = .{}; + pub fn LangFn() callconv(.C) ?*const Language { + return &dummy; + } +}; +pub const Parser = struct { + var dummy: @This() = .{}; + pub fn create() !*@This() { + return &dummy; + } + pub fn parse(_: *Parser, _: ?*Tree, _: Input) !*Tree { + return &Tree.dummy; + } + pub fn parseString(_: *@This(), _: ?[]const u8, _: []const u8) !?*Tree { + return null; + } + pub fn destroy(_: *@This()) void {} + pub fn setLanguage(_: *Parser, _: *const Language) !void {} +}; +pub const Query = struct { + var dummy: @This() = .{}; + pub fn create(_: *const Language, _: []const u8) !*Query { + return &dummy; + } + pub const Cursor = struct { + var dummy_: @This() = .{}; + pub fn create() !*@This() { + return &dummy_; + } + pub fn execute(_: *@This(), _: *Query, _: *Node) void {} + pub fn setPointRange(_: *@This(), _: Point, _: Point) void {} + pub fn nextMatch(_: *@This()) ?*Match { + return null; + } + pub fn destroy(_: *@This()) void {} + + pub const Match = struct { + pub fn captures(_: *@This()) []Capture { + return &[_]Capture{}; + } + }; + pub const Capture = struct { + id: u32, + node: Node, + }; + }; + pub fn getCaptureNameForId(_: *@This(), _: u32) []const u8 { + return ""; + } + pub fn destroy(_: *@This()) void {} +}; +pub const Tree = struct { + var dummy: @This() = .{}; + pub fn getRootNode(_: *@This()) *Node { + return &Node.dummy; + } + pub fn destroy(_: *@This()) void {} + pub fn edit(_: *Tree, _: *const InputEdit) void {} +}; +pub const Node = struct { + var dummy: @This() = .{}; + pub fn getRange(_: *const @This()) Range { + return .{}; + } + pub fn asSExpressionString(_: *const @This()) []const u8 { + return ""; + } + pub fn freeSExpressionString(_: []const u8) void {} + pub fn getParent(_: *const @This()) *Node { + return &dummy; + } + pub fn isNull(_: *const @This()) bool { + return true; + } +};