references.lua (2482B)
1 local M = {} 2 3 local function filter_curr_file(bufnr, items) 4 local curr_filename = vim.api.nvim_buf_get_name(bufnr) 5 return vim.tbl_filter(function(item) 6 return item.filename == curr_filename 7 end, items) 8 end 9 10 local function filter_before_line(bufnr, items) 11 local curr_filename = vim.api.nvim_buf_get_name(bufnr) 12 local curr_lnum = vim.fn.getcurpos()[2] 13 return vim.tbl_filter(function(item) 14 return item.filename == curr_filename and item.lnum < curr_lnum 15 end, items) 16 end 17 18 local function filter_after_line(bufnr, items) 19 local curr_filename = vim.api.nvim_buf_get_name(bufnr) 20 local curr_lnum = vim.fn.getcurpos()[2] 21 return vim.tbl_filter(function(item) 22 return item.filename == curr_filename and item.lnum > curr_lnum 23 end, items) 24 end 25 26 function M.after_line(opts) 27 opts.items = filter_after_line(opts.context.bufnr, opts.items) 28 29 if #opts.items == 0 then 30 vim.notify('No references after current line') 31 return 32 end 33 34 opts.title = 'References (After Current Line)' 35 vim.fn.setloclist(0, {}, ' ', opts) 36 vim.cmd.lopen() 37 end 38 39 function M.curr_file(opts) 40 opts.items = filter_curr_file(opts.context.bufnr, opts.items) 41 42 if #opts.items == 0 then 43 vim.notify('No references in current file') 44 return 45 end 46 47 opts.title = 'Local References' 48 vim.fn.setloclist(0, {}, ' ', opts) 49 vim.cmd.lopen() 50 end 51 52 function M.first_in_file(opts) 53 opts.items = filter_curr_file(opts.context.bufnr, opts.items) 54 55 if #opts.items == 0 then 56 vim.notify('No References') 57 return 58 end 59 60 local client = assert(vim.lsp.get_client_by_id(opts.context.client_id)) 61 vim.lsp.util.show_document(opts.items[1].user_data, client.offset_encoding, { focus = true }) 62 63 opts.title = 'Local References' 64 vim.fn.setloclist(0, {}, ' ', opts) 65 end 66 67 function M.next(opts) 68 opts.items = filter_after_line(opts.context.bufnr, opts.items) 69 70 if #opts.items == 0 then 71 vim.notify('No Following References') 72 return 73 end 74 75 local client = assert(vim.lsp.get_client_by_id(opts.context.client_id)) 76 vim.lsp.util.show_document(opts.items[1].user_data, client.offset_encoding, { focus = true }) 77 end 78 79 function M.prev(opts) 80 opts.items = filter_before_line(opts.context.bufnr, opts.items) 81 82 if #opts.items == 0 then 83 vim.notify('No Previous References') 84 return 85 end 86 87 local client = assert(vim.lsp.get_client_by_id(opts.context.client_id)) 88 vim.lsp.util.show_document(opts.items[#opts.items].user_data, client.offset_encoding, { focun = true }) 89 end 90 91 return M