[mirror] Make your go dev experience better
github.com/olexsmir/gopher.nvim
neovim
golang
1---@toc_entry Generate comments
2---@tag gopher.nvim-comments
3---@text
4--- This module provides a way to generate comments for Go code.
5---
6---@usage
7--- Set cursor on line with function/method/struct/etc and
8--- run `:GoCmt` to generate a comment.
9
10local ts = require "gopher._utils.ts"
11local log = require "gopher._utils.log"
12local u = require "gopher._utils"
13local comment = {}
14
15--- NOTE: The order of functions executed inside this function is IMPORTANT.
16--- This function is extremely fragile; run tests after making any changes.
17---
18---@param bufnr integer
19---@param line string
20---@return string
21---@dochide
22local function generate(bufnr, line)
23 local sf_ok, sf_res = pcall(ts.get_struct_field_under_cursor, bufnr)
24 if sf_ok then
25 return u.indent(line, sf_res.indent) .. "// " .. sf_res.name .. " "
26 end
27
28 local s_ok, s_res = pcall(ts.get_struct_under_cursor, bufnr)
29 if s_ok then
30 return u.indent(line, s_res.indent) .. "// " .. s_res.name .. " "
31 end
32
33 local v_ok, v_res = pcall(ts.get_variable_under_cursor, bufnr)
34 if v_ok then
35 return u.indent(line, v_res.indent) .. "// " .. v_res.name .. " "
36 end
37
38 local f_ok, f_res = pcall(ts.get_func_under_cursor, bufnr)
39 if f_ok then
40 return u.indent(line, f_res.indent) .. "// " .. f_res.name .. " "
41 end
42
43 local i_ok, i_res = pcall(ts.get_interface_under_cursor, bufnr)
44 if i_ok then
45 return u.indent(line, i_res.indent) .. "// " .. i_res.name .. " "
46 end
47
48 local p_ok, p_res = pcall(ts.get_package_under_cursor, bufnr)
49 if p_ok then
50 return "// Package " .. p_res.name .. " provides "
51 end
52
53 return "// "
54end
55
56function comment.comment()
57 local bufnr = vim.api.nvim_get_current_buf()
58 local lnum = vim.fn.getcurpos()[2]
59 local line = vim.fn.getline(lnum)
60 local cmt = generate(bufnr, line)
61 log.debug("generated comment:", {
62 comment = cmt,
63 line = line,
64 })
65
66 vim.fn.append(lnum - 1, cmt)
67 vim.fn.setpos(".", { bufnr, lnum, #cmt })
68 vim.cmd "startinsert!"
69end
70
71return comment