diff --git a/README.md b/README.md index 11c05bd..0e8fad4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ # neogen A better Neovim documentation generator + +## Warning + +This project is still in alpha ! + +Work In progress: +- lua: `@return`, `@param` + +## Installation + +1. Packer + +```lua +use { + "danymat/neogen", + config = function() + require('neogen').setup { + enabled = true + } + end +} +``` + +## Usage + +I exposed a command `:Neogen` to generate the annotations. +You can bind it to your keybind of choice: + +```lua +vim.api.nvim_set_keymap("n", "ng", ":Neogen", {}) +``` + +If you are inside a function, it'll generate the documentation for you with Emmylua annotation convention + diff --git a/lua/neogen.lua b/lua/neogen.lua new file mode 100644 index 0000000..fb6fcd2 --- /dev/null +++ b/lua/neogen.lua @@ -0,0 +1,60 @@ +local ts_utils = require("nvim-treesitter.ts_utils") +local ts_query = require("nvim-treesitter.query") + +local M = {} + +M.generate = function (t, t2) + local comment = {} + local query = [[ + (function (parameters) @params) + (function (return_statement) @return) + (function_definition (parameters) @params) + ]] + + -- Try to find the upper function + local cursor = ts_utils.get_node_at_cursor(0) + local function_node = cursor + while function_node ~= nil do + if function_node:type() == "function_definition" then break end + if function_node:type() == "function" then break end + function_node = function_node:parent() + end + local line = ts_utils.get_node_range(function_node) + + local returned = vim.treesitter.parse_query("lua", query) + for id, node in returned:iter_captures(function_node) do -- For each found query + + -- Try to add params + if returned.captures[id] == "params" then + local params = ts_utils.get_node_text(node)[1]:sub(2,-2) + for p in string.gmatch(params, '[^,]+') do + p = p:gsub("%s+", "") -- remove trailing spaces + table.insert(comment, "---@param " .. p .. " ") + end + end + + -- Try to add return statement + if returned.captures[id] == "return" then + table.insert(comment, "---@return ") + end + end + + -- Write on top of function + vim.fn.append(line, comment) + vim.fn.cursor(line+1, #comment[1]) + vim.api.nvim_command('startinsert!') + +end + +function M.generate_command() + vim.api.nvim_command('command! -range -bar Neogen lua require("neogen").generate()') +end + +M.setup = function(opts) + local config = opts or {} + if config.enabled == true then + M.generate_command() + end +end + +return M