120 lines
2.5 KiB
Lua
120 lines
2.5 KiB
Lua
local ls = require("luasnip")
|
|
local s = ls.snippet
|
|
local sn = ls.snippet_node
|
|
local isn = ls.indent_snippet_node
|
|
local t = ls.text_node
|
|
local i = ls.insert_node
|
|
local f = ls.function_node
|
|
local c = ls.choice_node
|
|
local d = ls.dynamic_node
|
|
local r = ls.restore_node
|
|
local events = require("luasnip.util.events")
|
|
local ai = require("luasnip.nodes.absolute_indexer")
|
|
local extras = require("luasnip.extras")
|
|
local l = extras.lambda
|
|
local rep = extras.rep
|
|
local p = extras.partial
|
|
local m = extras.match
|
|
local n = extras.nonempty
|
|
local dl = extras.dynamic_lambda
|
|
local fmt = require("luasnip.extras.fmt").fmt
|
|
local fmta = require("luasnip.extras.fmt").fmta
|
|
local conds = require("luasnip.extras.expand_conditions")
|
|
local postfix = require("luasnip.extras.postfix").postfix
|
|
local types = require("luasnip.util.types")
|
|
local parse = require("luasnip.util.parser").parse_snippet
|
|
local ms = ls.multi_snippet
|
|
local k = require("luasnip.nodes.key_indexer").new_key
|
|
local matches = require("luasnip.extras.postfix").matches
|
|
|
|
local case_template = [[
|
|
case {expression} {{
|
|
{pattern1} -> {result1}
|
|
{pattern2} -> {result2}{final}
|
|
}}
|
|
]]
|
|
|
|
local dot_case = postfix({ filetype = "gleam", trig = ".case", match_pattern = matches.line }, {
|
|
d(1, function(_, parent)
|
|
return sn(
|
|
1,
|
|
fmt(case_template, {
|
|
expression = t(parent.env.POSTFIX_MATCH),
|
|
pattern1 = i(1, "pattern"),
|
|
result1 = i(2, "todo"),
|
|
pattern2 = i(3, "_"),
|
|
result2 = i(4, "todo"),
|
|
final = i(0),
|
|
})
|
|
)
|
|
end),
|
|
})
|
|
|
|
local case = s(
|
|
{ filetype = "gleam", trig = "case" },
|
|
fmt(case_template, {
|
|
expression = i(1),
|
|
pattern1 = i(2),
|
|
result1 = i(3, "todo"),
|
|
pattern2 = i(4, "_"),
|
|
result2 = i(5, "todo"),
|
|
final = i(0),
|
|
})
|
|
)
|
|
|
|
local fn_template = [[
|
|
fn {name}({args}) -> {rtype} {{
|
|
{body}
|
|
}}
|
|
]]
|
|
|
|
local fn = s(
|
|
{ filetype = "gleam", trig = "fn" },
|
|
fmt(fn_template, {
|
|
name = i(1),
|
|
args = i(2),
|
|
rtype = i(3),
|
|
body = i(0),
|
|
})
|
|
)
|
|
|
|
local pfn = s(
|
|
{ filetype = "gleam", trig = "pfn" },
|
|
fmt("pub " .. fn_template, {
|
|
name = i(1),
|
|
args = i(2),
|
|
rtype = i(3),
|
|
body = i(0),
|
|
})
|
|
)
|
|
|
|
local type_template = [[
|
|
type {name} {{
|
|
{body}
|
|
}}
|
|
]]
|
|
|
|
local type = s(
|
|
{ filetype = "gleam", trig = "type" },
|
|
fmt(type_template, {
|
|
name = i(1),
|
|
body = i(0),
|
|
})
|
|
)
|
|
|
|
local ptype = s(
|
|
{ filetype = "gleam", trig = "ptype" },
|
|
fmt("pub " .. type_template, {
|
|
name = i(1),
|
|
body = i(0),
|
|
})
|
|
)
|
|
|
|
return {
|
|
case,
|
|
dot_case,
|
|
fn,
|
|
pfn,
|
|
type,
|
|
ptype,
|
|
}
|