summaryrefslogtreecommitdiffstats
path: root/lua/snippet
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lua/snippets/c.lua68
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, {})
})
}