add declaration snippet (c)
This commit is contained in:
@ -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, {})
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user