96 lines
2.2 KiB
Lua
96 lines
2.2 KiB
Lua
require('core.snippets.shorthands')
|
|
|
|
--- 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)
|
|
if snip.trigger == "main" then
|
|
return sn(nil, {
|
|
t({ "int", "main(int argc, char *argv[])" })
|
|
})
|
|
else
|
|
return sn(nil, {
|
|
c(1, {
|
|
t(""),
|
|
t("static "),
|
|
}),
|
|
c(2, {
|
|
t("void"),
|
|
t("char"),
|
|
t("int"),
|
|
t("short"),
|
|
t("long"),
|
|
t("double"),
|
|
t("float"),
|
|
i(nil, "myType"),
|
|
}),
|
|
t({ "", "" }),
|
|
c(3, {
|
|
t(""),
|
|
t("*")
|
|
}),
|
|
i(4, "myFunc");
|
|
t("("),
|
|
i(5),
|
|
t(")"),
|
|
})
|
|
end
|
|
end, {}),
|
|
t({ "", "{", "\t" }),
|
|
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, {})
|
|
})
|
|
}
|