aboutsummaryrefslogtreecommitdiffstats
path: root/lua/pi/snips/ft/go.lua
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2024-07-12 11:18:14 -0300
committerElvis Claros Castro <elvis@claros.ar>2024-07-12 11:18:14 -0300
commitea0f4bf8ffade657b1d45152dbc183d4679e75c4 (patch)
treecc1fb023bc308e019ddce33a4b0aed39f56805dc /lua/pi/snips/ft/go.lua
parent1fd0af14d592d612c2aaab7717c04c8806ba3daa (diff)
downloadnvim-conf-ea0f4bf8ffade657b1d45152dbc183d4679e75c4.tar.gz
nvim-conf-ea0f4bf8ffade657b1d45152dbc183d4679e75c4.zip
Feat: PI
Diffstat (limited to 'lua/pi/snips/ft/go.lua')
-rw-r--r--lua/pi/snips/ft/go.lua134
1 files changed, 134 insertions, 0 deletions
diff --git a/lua/pi/snips/ft/go.lua b/lua/pi/snips/ft/go.lua
new file mode 100644
index 0000000..9c3977f
--- /dev/null
+++ b/lua/pi/snips/ft/go.lua
@@ -0,0 +1,134 @@
+local ls = require "luasnip"
+
+local snippet_from_nodes = ls.sn
+local c = ls.choice_node
+local t = ls.text_node
+local d = ls.dynamic_node
+local i = ls.insert_node
+local rep = require("luasnip.extras").rep
+local fmt = require("luasnip.extras.fmt").fmt
+
+local ts_locals = require "nvim-treesitter.locals"
+local ts_utils = require "nvim-treesitter.ts_utils"
+
+local get_node_text = vim.treesitter.get_node_text
+
+vim.treesitter.query.set(
+ "go",
+ "LuaSnip_Result",
+ [[
+ [
+ (method_declaration result: (_) @id)
+ (function_declaration result: (_) @id)
+ (func_literal result: (_) @id)
+ ]
+]]
+)
+
+local transform = function(text, info)
+ if text == "int" then
+ return t "0"
+ elseif text == "error" then
+ if info then
+ info.index = info.index + 1
+
+ return c(info.index, {
+ t(string.format('fmt.Errorf("%s %%w", %s)', info.func_name, info.err_name)),
+ t(info.err_name),
+ })
+ else
+ return t "err"
+ end
+ elseif text == "bool" then
+ return t "false"
+ elseif text == "string" then
+ return t '""'
+ elseif string.find(text, "*", 1, true) then
+ return t "nil"
+ end
+
+ return t(text)
+end
+
+local handlers = {
+ ["parameter_list"] = function(node, info)
+ local result = {}
+
+ local count = node:named_child_count()
+ for idx = 0, count - 1 do
+ table.insert(result, transform(get_node_text(node:named_child(idx), 0), info))
+ if idx ~= count - 1 then
+ table.insert(result, t { ", " })
+ end
+ end
+
+ return result
+ end,
+
+ ["type_identifier"] = function(node, info)
+ local text = get_node_text(node, 0)
+ return { transform(text, info) }
+ end,
+}
+
+local function go_result_type(info)
+ local cursor_node = ts_utils.get_node_at_cursor()
+ local scope = ts_locals.get_scope_tree(cursor_node, 0)
+
+ local function_node
+ for _, v in ipairs(scope) do
+ if v:type() == "function_declaration" or v:type() == "method_declaration" or v:type() == "func_literal" then
+ function_node = v
+ break
+ end
+ end
+
+ local query = vim.treesitter.query.get("go", "LuaSnip_Result")
+ for _, node in query:iter_captures(function_node, 0) do
+ if handlers[node:type()] then
+ return handlers[node:type()](node, info)
+ end
+ end
+end
+
+local go_ret_vals = function(args)
+ local info = { index = 0, err_name = args[1][1], func_name = args[2][1] }
+ return snippet_from_nodes(nil, go_result_type(info))
+end
+
+local M = {
+ main = {
+ t { "func main() {", "\t" },
+ i(0),
+ t { "", "}" },
+ },
+ ef = {
+ i(1, { "val" }),
+ t ", err := ",
+ i(2, { "f" }),
+ t "(",
+ i(3),
+ t ")",
+ i(0),
+ },
+ efi = {
+ i(1, { "val" }),
+ ", ",
+ i(2, { "err" }),
+ " := ",
+ i(3, { "f" }),
+ "(",
+ i(4),
+ ")",
+ t { "", "if " },
+ rep(2),
+ t { " != nil {", "\treturn " },
+ d(5, go_ret_vals, { 2, 3 }),
+ t { "", "}" },
+ i(0),
+ },
+}
+
+M.f = fmt("func {}({}) {} {{\n\t{}\n}}", { i(1, "name"), i(2), i(3), i(0) })
+
+return M