dotfiles-nvim/lua/plugins/languages/idris2.lua

127 lines
2.6 KiB
Lua

local function get_ipkg_executable(ipkg_path)
local file = io.open(ipkg_path)
if file == nil then
return nil
end
for line in file:lines() do
local _, start = line:find("executable%s*=%s*\"")
if start ~= nil then
file:close()
return line:sub(start + 1, #line - 1)
end
end
file:close()
return nil
end
local function setup_tasks()
local overseer = require("overseer")
local generic_build_tmpl = {
name = "Idris2 Generic Build",
params = {
ipkg_path = { type = "string", optional = false, default = "./main.ipkg" },
},
builder = function(params)
return {
name = "Idris2: Build " .. params.ipkg_path,
cmd = { 'idris2', '--build', params.ipkg_path },
components = {
{ "on_exit_set_status", success_codes = { 0 } },
},
}
end,
}
overseer.register_template(generic_build_tmpl)
local generic_run_tmpl = {
name = "Idris2 Generic Run",
params = {
ipkg_path = { type = "string", optional = false, default = "./main.ipkg" },
},
builder = function(params)
local executable_name = get_ipkg_executable(params.ipkg_path)
if params.ipkg_path == nil then
return nil
end
return {
name = "Idris2: Run " .. params.ipkg_path,
cmd = { './build/exec/' .. executable_name },
components = {
{
"dependencies",
task_names = {
{ "Idris2 Generic Build", ipkg_path = params.ipkg_path },
},
sequential = true,
},
{ "on_exit_set_status", success_codes = { 0 } },
},
}
end,
}
overseer.register_template(generic_run_tmpl)
overseer.register_template {
name = "Idris2 compilation",
generator = function(_, cb)
local ipkg_paths = require('plenary.scandir').scan_dir(
'.', { search_pattern = '.+[.]ipkg$', }
)
local templates = {}
for _, ipkg_path in pairs(ipkg_paths) do
templates:insert(
overseer.wrap_template(
generic_build_tmpl,
{ name = "Build " .. ipkg_path},
{ ipkg_path = ipkg_path }
)
)
templates:insert(
overseer.wrap_template(
generic_run_tmpl,
{ name = "Run " .. ipkg_path },
{ ipkg_path = ipkg_path }
)
)
end
cb(templates)
end,
}
end
return {
"ShinKage/idris2-nvim",
requires = {
'neovim/nvim-lspconfig',
'MunifTanjim/nui.nvim',
'stevearc/overseer.nvim',
'nvim-lua/plenary.nvim',
},
ft = { 'idris2', 'ipkg' },
cond = function()
return vim.fn.executable("idris2") ~= 0
and vim.fn.executable("idris2-lsp") ~= 0
end,
opts = {
autostart_semantic = true,
},
config = function(_, opts)
setup_tasks()
require("idris2").setup(opts)
end,
}