add declaration snippet (c)

This commit is contained in:
2024-11-28 22:31:41 -05:00
parent 3bf7dd1be4
commit ea7ec0f890
2 changed files with 62 additions and 27 deletions

View File

@ -1,13 +1,12 @@
luasnip = require('luasnip')
s = luasnip.snippet
sn = luasnip.snippet_node
t = luasnip.text_node
i = luasnip.insert_node
f = luasnip.function_node
c = luasnip.choice_node
d = luasnip.dynamic_node
r = luasnip.restore_node
ls = require('luasnip')
s = ls.snippet
sn = ls.snippet_node
t = ls.text_node
i = ls.insert_node
f = ls.function_node
c = ls.choice_node
d = ls.dynamic_node
r = ls.restore_node
l = require("luasnip.extras").lambda
rep = require("luasnip.extras").rep
p = require("luasnip.extras").partial
@ -20,3 +19,5 @@ types = require("luasnip.util.types")
conds = require("luasnip.extras.conditions")
conds_expand = require("luasnip.extras.conditions.expand")
ts_postfix = require("luasnip.extras.treesitter_postfix").treesitter_postfix
postfix = require("luasnip.extras.postfix").postfix
ms = ls.multi_snippet

View File

@ -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, {})
})
}