aboutsummaryrefslogtreecommitdiff
path: root/lua/cmake/capabilities.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/cmake/capabilities.lua')
-rw-r--r--lua/cmake/capabilities.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/lua/cmake/capabilities.lua b/lua/cmake/capabilities.lua
new file mode 100644
index 0000000..6a70be2
--- /dev/null
+++ b/lua/cmake/capabilities.lua
@@ -0,0 +1,63 @@
+local config = require("cmake.config")
+
+local multiconfig_generators = {
+ "Ninja Multi-Config",
+ "Xcode",
+ "Visual Studio 12 2013",
+ "Visual Studio 14 2015",
+ "Visual Studio 15 2017",
+ "Visual Studio 16 2019",
+ "Visual Studio 17 2022",
+ "Green Hills MULTI",
+}
+
+local Capabilities = {
+ json = nil,
+}
+
+function Capabilities.generators()
+ local ret = {}
+ if not Capabilities then
+ return ret
+ end
+ for k, v in pairs(Capabilities.json.generators) do
+ table.insert(ret, v.name)
+ end
+ return vim.fn.reverse(ret)
+end
+
+function Capabilities.is_multiconfig_generator(generator)
+ -- if generator is nil, assume is is not multiconifg
+ if not generator then
+ return
+ end
+ return vim.tbl_contains(multiconfig_generators, generator)
+end
+
+function Capabilities.has_fileapi()
+ return vim.tbl_get(Capabilities.json, "fileApi") ~= nil
+end
+
+-- TODO: make this async
+Capabilities.setup = function(callback)
+ local lines = {}
+ vim.fn.jobstart({ config.cmake.cmake_path, "-E", "capabilities" }, {
+ on_stdout = function(_, data)
+ if data then
+ vim.list_extend(lines, data)
+ end
+ end,
+ on_exit = function(_, code, _)
+ if code == 0 then
+ Capabilities.json = vim.json.decode(table.concat(lines, ""))
+ if type(callback) == "function" then
+ callback()
+ end
+ else
+ vim.notify("error " .. tostring(code) .. ". 'cmake -E capabilities'", vim.log.levels.ERROR)
+ end
+ end,
+ })
+end
+
+return Capabilities