aboutsummaryrefslogtreecommitdiff
path: root/lua/cmake-explorer/project_uauaua.lua
diff options
context:
space:
mode:
authorDaniil Rozanov <daniilrozzanov@gmail.com>2024-03-29 04:37:56 +0300
committerDaniil Rozanov <daniilrozzanov@gmail.com>2024-03-29 04:37:56 +0300
commit672f0d32e322b79661b5d7959887adaa9e41ad98 (patch)
treec2c3f4e2157d47c7e3f8dfd2f3229e37e0919b3e /lua/cmake-explorer/project_uauaua.lua
parentd453f54d98536eb3a52daebfe279c4e624979c31 (diff)
feat: build from current variant
Diffstat (limited to 'lua/cmake-explorer/project_uauaua.lua')
-rw-r--r--lua/cmake-explorer/project_uauaua.lua113
1 files changed, 113 insertions, 0 deletions
diff --git a/lua/cmake-explorer/project_uauaua.lua b/lua/cmake-explorer/project_uauaua.lua
new file mode 100644
index 0000000..b54abd6
--- /dev/null
+++ b/lua/cmake-explorer/project_uauaua.lua
@@ -0,0 +1,113 @@
+local config = require("cmake-explorer.config")
+local capabilities = require("cmake-explorer.capabilities")
+local FileApi = require("cmake-explorer.file_api")
+local Path = require("plenary.path")
+local Scandir = require("plenary.scandir")
+local utils = require("cmake-explorer.utils")
+local notif = require("cmake-explorer.notification")
+
+local Project = {}
+
+Project.__index = Project
+
+function Project:new(o)
+ o = o or {}
+
+ local path
+ if type(o) == "string" then
+ path = o
+ elseif type(o) == "table" and o.path then
+ path = o.path
+ else
+ return
+ end
+
+ if not Path:new(path, "CMakeLists.txt"):exists() then
+ return
+ end
+
+ local obj = {
+ path = path,
+ fileapis = {},
+ last_generate = nil,
+ }
+ notif.notify("PATH " .. obj.path)
+ setmetatable(
+ obj.fileapis,
+ utils.make_maplike_list(function(v)
+ return v.path
+ end)
+ )
+ setmetatable(obj, Project)
+ return obj
+end
+
+function Project:scan_build_dirs()
+ local builds_root = utils.is_eq(
+ Path:new(config.build_dir):is_absolute(),
+ true,
+ Path:new(config.build_dir),
+ Path:new(self.path, config.build_dir)
+ )
+ local candidates =
+ Scandir.scan_dir(builds_root:absolute(), { hidden = false, only_dirs = true, depth = 0, silent = true })
+ for _, v in ipairs(candidates) do
+ local fa = FileApi:new(v)
+ if fa and fa:exists() and fa:read_reply() then
+ self.fileapis[fa.path] = fa
+ end
+ end
+end
+
+function Project:symlink_compile_commands(path)
+ local src = Path:new(path, "compile_commands.json")
+ if src:exists() then
+ vim.cmd(
+ 'silent exec "!'
+ .. config.cmake_cmd
+ .. " -E create_symlink "
+ .. src:normalize()
+ .. " "
+ .. Path:new(self.path, "compile_commands.json"):normalize()
+ .. '"'
+ )
+ end
+end
+
+function Project:configure(params)
+ params = params or {}
+ local args = utils.generate_args(params, self.path)
+ local build_dir = utils.build_path(params, self.path)
+ if not args then
+ return
+ end
+ if not self.fileapis[build_dir] then
+ local fa = FileApi:new(build_dir)
+ if not fa then
+ notif.notify("Cannot fileapi object", vim.log.levels.ERROR)
+ return
+ end
+ if not fa:create() then
+ return
+ end
+ self.fileapis[build_dir] = fa
+ end
+
+ local job_args = {
+ cmd = config.cmake_cmd,
+ args = args,
+ cwd = self.path,
+ after_success = function()
+ self.last_generate = job_args
+ self.fileapis[build_dir]:read_reply()
+ self:symlink_compile_commands(build_dir)
+ end,
+ }
+ return job_args
+end
+
+function Project:configure_last()
+ return self.last_generate
+end
+
+return Project