diff --git a/build.zig b/build.zig index 16046a8..08dbc59 100644 --- a/build.zig +++ b/build.zig @@ -418,6 +418,10 @@ pub fn build_exe( .root_source_file = b.path("src/snippet.zig"), }); + const lsp_types_mod = b.createModule(.{ + .root_source_file = b.path("src/lsp_types.zig"), + }); + const Buffer_mod = b.createModule(.{ .root_source_file = b.path("src/buffer/Buffer.zig"), .imports = &.{ @@ -635,6 +639,7 @@ pub fn build_exe( .{ .name = "VcsStatus", .module = VcsStatus_mod }, .{ .name = "bin_path", .module = bin_path_mod }, .{ .name = "snippet", .module = snippet_mod }, + .{ .name = "lsp_types", .module = lsp_types_mod }, }, }); diff --git a/src/LSP.zig b/src/LSP.zig index 2501149..96c34be 100644 --- a/src/LSP.zig +++ b/src/LSP.zig @@ -735,31 +735,3 @@ const Headers = struct { } } }; - -pub const CompletionItemKind = enum(u8) { - Text = 1, - Method = 2, - Function = 3, - Constructor = 4, - Field = 5, - Variable = 6, - Class = 7, - Interface = 8, - Module = 9, - Property = 10, - Unit = 11, - Value = 12, - Enum = 13, - Keyword = 14, - Snippet = 15, - Color = 16, - File = 17, - Reference = 18, - Folder = 19, - EnumMember = 20, - Constant = 21, - Struct = 22, - Event = 23, - Operator = 24, - TypeParameter = 25, -}; diff --git a/src/lsp_types.zig b/src/lsp_types.zig new file mode 100644 index 0000000..e0e9420 --- /dev/null +++ b/src/lsp_types.zig @@ -0,0 +1,121 @@ +pub const SymbolKind = enum(u8) { + None = 0, + File = 1, + Module = 2, + Namespace = 3, + Package = 4, + Class = 5, + Method = 6, + Property = 7, + Field = 8, + Constructor = 9, + Enum = 10, + Interface = 11, + Function = 12, + Variable = 13, + Constant = 14, + String = 15, + Number = 16, + Boolean = 17, + Array = 18, + Object = 19, + Key = 20, + Null = 21, + EnumMember = 22, + Struct = 23, + Event = 24, + Operator = 25, + TypeParameter = 26, + + pub fn icon(kind: SymbolKind) []const u8 { + return switch (kind) { + .None => " ", + .File => "", + .Module => "", + .Namespace => "", + .Package => "", + .Class => "", + .Method => "", + .Property => "", + .Field => "", + .Constructor => "", + .Enum => "", + .Interface => "", + .Function => "󰊕", + .Variable => "", + .Constant => "", + .String => "", + .Number => "", + .Boolean => "", + .Array => "", + .Object => "", + .Key => "", + .Null => "󰟢", + .EnumMember => "", + .Struct => "", + .Event => "", + .Operator => "", + .TypeParameter => "", + }; + } +}; + +pub const CompletionItemKind = enum(u8) { + None = 0, + Text = 1, + Method = 2, + Function = 3, + Constructor = 4, + Field = 5, + Variable = 6, + Class = 7, + Interface = 8, + Module = 9, + Property = 10, + Unit = 11, + Value = 12, + Enum = 13, + Keyword = 14, + Snippet = 15, + Color = 16, + File = 17, + Reference = 18, + Folder = 19, + EnumMember = 20, + Constant = 21, + Struct = 22, + Event = 23, + Operator = 24, + TypeParameter = 25, + + pub fn icon(kind: CompletionItemKind) []const u8 { + return switch (kind) { + .None => " ", + .Text => "󰊄", + .Method => "", + .Function => "󰊕", + .Constructor => "", + .Field => "", + .Variable => "", + .Class => "", + .Interface => "", + .Module => "", + .Property => "", + .Unit => "󱔁", + .Value => "󱔁", + .Enum => "", + .Keyword => "", + .Snippet => "", + .Color => "", + .File => "", + .Reference => "※", + .Folder => "🗀", + .EnumMember => "", + .Constant => "", + .Struct => "", + .Event => "", + .Operator => "", + .TypeParameter => "", + }; + } +}; diff --git a/src/tui/mode/overlay/completion_palette.zig b/src/tui/mode/overlay/completion_palette.zig index 5c5cef6..916231c 100644 --- a/src/tui/mode/overlay/completion_palette.zig +++ b/src/tui/mode/overlay/completion_palette.zig @@ -5,6 +5,7 @@ const root = @import("soft_root").root; const command = @import("command"); const Buffer = @import("Buffer"); const builtin = @import("builtin"); +const CompletionItemKind = @import("lsp_types").CompletionItemKind; const tui = @import("../../tui.zig"); pub const Type = @import("palette.zig").Create(@This()); @@ -104,7 +105,7 @@ pub fn on_render_menu(_: *Type, button: *Type.ButtonType, theme: *const Widget.T if (!(cbor.matchValue(&iter, cbor.extract_cbor(&matches_cbor)) catch false)) return false; const values = get_values(item_cbor); - const icon_: []const u8 = kind_icon(@enumFromInt(values.kind)); + const icon_: []const u8 = values.kind.icon(); const color: u24 = 0x0; return tui.render_symbol( @@ -125,7 +126,7 @@ pub fn on_render_menu(_: *Type, button: *Type.ButtonType, theme: *const Widget.T const Values = struct { label: []const u8, sort_text: []const u8, - kind: u8, + kind: CompletionItemKind, replace: Buffer.Selection, additionalTextEdits: []const u8, label_detail: []const u8, @@ -179,7 +180,7 @@ fn get_values(item_cbor: []const u8) Values { return .{ .label = label_, .sort_text = sort_text, - .kind = kind, + .kind = @enumFromInt(kind), .replace = replace, .additionalTextEdits = additionalTextEdits, .label_detail = label_detail, @@ -253,63 +254,3 @@ pub fn cancel(palette: *Type) !void { const mv = tui.mainview() orelse return; mv.cancel_info_content() catch {}; } - -const CompletionItemKind = enum(u8) { - None = 0, - Text = 1, - Method = 2, - Function = 3, - Constructor = 4, - Field = 5, - Variable = 6, - Class = 7, - Interface = 8, - Module = 9, - Property = 10, - Unit = 11, - Value = 12, - Enum = 13, - Keyword = 14, - Snippet = 15, - Color = 16, - File = 17, - Reference = 18, - Folder = 19, - EnumMember = 20, - Constant = 21, - Struct = 22, - Event = 23, - Operator = 24, - TypeParameter = 25, -}; - -fn kind_icon(kind: CompletionItemKind) []const u8 { - return switch (kind) { - .None => " ", - .Text => "󰊄", - .Method => "", - .Function => "󰊕", - .Constructor => "", - .Field => "", - .Variable => "", - .Class => "", - .Interface => "", - .Module => "", - .Property => "", - .Unit => "󱔁", - .Value => "󱔁", - .Enum => "", - .Keyword => "", - .Snippet => "", - .Color => "", - .File => "", - .Reference => "※", - .Folder => "🗀", - .EnumMember => "", - .Constant => "", - .Struct => "", - .Event => "", - .Operator => "", - .TypeParameter => "", - }; -} diff --git a/src/tui/mode/overlay/symbol_palette.zig b/src/tui/mode/overlay/symbol_palette.zig index 189dd66..ae08ce4 100644 --- a/src/tui/mode/overlay/symbol_palette.zig +++ b/src/tui/mode/overlay/symbol_palette.zig @@ -8,6 +8,7 @@ const write_string = text_manip.write_string; const write_padding = text_manip.write_padding; const command = @import("command"); const Buffer = @import("Buffer"); +const SymbolKind = @import("lsp_types").SymbolKind; const tui = @import("../../tui.zig"); pub const Type = @import("palette.zig").Create(@This()); @@ -109,7 +110,7 @@ pub fn load_entries(palette: *Type) !usize { const label_, const parent_, const kind, const sel = get_values(cbor_item); (try palette.entries.addOne(palette.allocator)).* = .{ .cbor = cbor_item, .label = label_[0..@min(columns[0].max_width, label_.len)], .range = sel }; - const current_lengths: [3]usize = .{ label_.len, parent_.len, kind_name(@enumFromInt(kind)).len }; + const current_lengths: [3]usize = .{ label_.len, parent_.len, @tagName(kind).len }; const label_len: u8 = @truncate(if (label_.len > columns[0].max_width) columns[0].max_width else label_.len); max_cols_len = @max(max_cols_len, label_len, update_max_col_sizes(palette, ¤t_lengths)); max_label_len = @max(max_label_len, label_len); @@ -153,19 +154,19 @@ pub fn on_render_menu(palette: *Type, button: *Type.ButtonType, theme: *const Wi if (!(cbor.matchValue(&iter, cbor.extract_cbor(&matches_cbor)) catch false)) return false; const label_, const container, const kind, _ = get_values(item_cbor); - const icon_: []const u8 = kind_icon(@enumFromInt(kind)); + const icon_: []const u8 = kind.icon(); const color: u24 = 0x0; var value: std.Io.Writer.Allocating = .init(palette.allocator); defer value.deinit(); const writer = &value.writer; - var column_info = [_][]const u8{ label_, container, kind_name(@enumFromInt(kind)) }; + var column_info = [_][]const u8{ label_, container, @tagName(kind) }; write_columns(palette, writer, &column_info); const indicator: []const u8 = &.{}; return tui.render_file_item(&button.plane, value.written(), icon_, color, indicator, &.{}, matches_cbor, button.active, selected, button.hover, theme); } -fn get_values(item_cbor: []const u8) struct { []const u8, []const u8, u8, ed.Selection } { +fn get_values(item_cbor: []const u8) struct { []const u8, []const u8, SymbolKind, ed.Selection } { var label_: []const u8 = ""; var container: []const u8 = ""; var kind: u8 = 0; @@ -187,7 +188,7 @@ fn get_values(item_cbor: []const u8) struct { []const u8, []const u8, u8, ed.Sel cbor.any, // deprecated cbor.any, // detail }) catch false; - return .{ label_, container, kind, range }; + return .{ label_, container, @enumFromInt(kind), range }; } fn find_closest(palette: *Type) ?usize { @@ -221,69 +222,3 @@ pub fn cancel(palette: *Type) !void { editor.clear_matches(); editor.update_scroll_dest_abs(palette.value.view.row); } - -const SymbolKind = enum(u8) { - None = 0, - File = 1, - Module = 2, - Namespace = 3, - Package = 4, - Class = 5, - Method = 6, - Property = 7, - Field = 8, - Constructor = 9, - Enum = 10, - Interface = 11, - Function = 12, - Variable = 13, - Constant = 14, - String = 15, - Number = 16, - Boolean = 17, - Array = 18, - Object = 19, - Key = 20, - Null = 21, - EnumMember = 22, - Struct = 23, - Event = 24, - Operator = 25, - TypeParameter = 26, -}; - -fn kind_icon(kind: SymbolKind) []const u8 { - return switch (kind) { - .None => " ", - .File => "", - .Module => "", - .Namespace => "", - .Package => "", - .Class => "", - .Method => "", - .Property => "", - .Field => "", - .Constructor => "", - .Enum => "", - .Interface => "", - .Function => "󰊕", - .Variable => "", - .Constant => "", - .String => "", - .Number => "", - .Boolean => "", - .Array => "", - .Object => "", - .Key => "", - .Null => "󰟢", - .EnumMember => "", - .Struct => "", - .Event => "", - .Operator => "", - .TypeParameter => "", - }; -} - -fn kind_name(kind: SymbolKind) []const u8 { - return @tagName(kind); -}