diff options
Diffstat (limited to '')
-rw-r--r-- | lua/snippets/c.lua | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/lua/snippets/c.lua b/lua/snippets/c.lua index f8e4208..2d71253 100644 --- a/lua/snippets/c.lua +++ b/lua/snippets/c.lua @@ -1,23 +1,43 @@ require('core.snippets.shorthands') -return { - -- method snippet - s("main", { - c(1, { - t(""), - t("static "), - }), - t("int main("), - c(2, { - t("int argc, char *argv[]"), - i(1, "void"), - }), - t(")"), - t({ " {", "\t" }), - i(0), - t({ "", "}" }), - }), +--- create a decleration of a function from it's definition using treesitter +---@param func string +---@return string|nil +local function c_func(func) + local tree = vim.treesitter.get_parser():parse()[1]:root() + + local q = vim.treesitter.query.parse("c", [[ + (function_definition + declarator: (function_declarator + (identifier) @function_name + ) + ) + ]]) + local matches = q:iter_matches(tree, 0) + + for _, match in matches do + for _, node in pairs(match) do + if vim.treesitter.get_node_text(node, 0) == func then + while node:type() ~= "function_definition" do + node = node:parent() + end + local def = "" + for i = 0, node:child_count() - 2 do + def = def..vim.treesitter.get_node_text(node:child(i), 0) + if i < node:child_count() - 2 then + def = def.." " + end + end + -- Print the function name using node text + return def:gsub("\n", "") + end + end + end + return nil +end + +return { -- function snippet s({ trig = [[fn\|main]], trigEngine = "vim" }, { d(1, function(_, snip) @@ -57,5 +77,19 @@ return { i(0), t({ "", "}" }) }), + + -- create decleration based on existing c function + postfix(".d", { + f(function(_, parent) + local r = c_func(parent.snippet.env.POSTFIX_MATCH) + if not r then + return parent.snippet.env.POSTFIX_MATCH + end + local bidx, aidx = r:find(parent.snippet.env.POSTFIX_MATCH) + + return r:sub(1, bidx - 1).. + parent.snippet.env.POSTFIX_MATCH.. + r:sub(aidx + 1)..";" + end, {}) }) } |